<?php
namespace AppBundle\Controller;
use AppBundle\Common\ArrayToolkit;
use AppBundle\Common\Paginator;
use AppBundle\Component\Track\UserOnlineTrack;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class OnlineController extends BaseController
{
public function sampleAction(Request $request, UserOnlineTrack $userOnlineTrack)
{
$sessionId = $request->getSession()->getId();
$cookieName = 'online-uuid';
$uuid = $request->cookies->get($cookieName, $this->generateGuid());
if (!empty($sessionId)) {
$userOnlineTrack->track($uuid);
}
$response = new Response('true');
$response->headers->setCookie(new Cookie($cookieName, $uuid));
return $response;
}
protected function generateGuid()
{
if (function_exists('com_create_guid')) {
return com_create_guid();
} else {
mt_srand((int) ((float) microtime() * 10000));
$charid = strtoupper(md5(uniqid(rand(), true)));
$hyphen = chr(45);
$uuid = substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid, 12, 4).$hyphen
.substr($charid, 16, 4).$hyphen
.substr($charid, 20, 12);
return $uuid;
}
}
public function indexAction(Request $request)
{
$conditions = [
'active_time_GT' => time() - 15 * 60,
];
if ($request->query->get('name', '')) {
$user = $this->getUserService()->getUserByNickname($request->query->get('name', ''));
if (empty($user)) {
return $this->render('admin/online/index.html.twig', [
'onlines' => [],
'paginator' => new Paginator(
$request,
0,
20
),
'users' => [],
]);
} else {
$conditions['user_id'] = $user['id'];
}
}
$conditions['is_login'] = 1;
$count = $this->getOnlineService()->countOnlines($conditions);
$paginator = new Paginator(
$request,
$count,
20
);
$onlines = [];
if ($count > 0) {
$onlines = $this->getOnlineService()->searchOnlines(
$conditions, ['active_time' => 'DESC'], $paginator->getOffsetCount(), $paginator->getPerPageCount()
);
}
$users = [];
if (!empty($onlines)) {
$userIds = ArrayToolkit::column($onlines, 'user_id');
$users = $this->getUserService()->findUsersByIds($userIds);
$users = ArrayToolkit::index($users, 'id');
}
return $this->render('admin/online/index.html.twig', [
'onlines' => $onlines,
'paginator' => $paginator,
'users' => $users,
]);
}
/**
* @return \Codeages\Biz\Framework\Session\Service\OnlineService
*/
protected function getOnlineService()
{
return $this->createService('Session:OnlineService');
}
/**
* @return \Biz\User\Service\UserService
*/
protected function getUserService()
{
return $this->createService('User:UserService');
}
}