/public_html/websys/modules/user/mappers/userOnlineMapper.php

https://github.com/greevex/mzz-framework-blank-application · PHP · 175 lines · 108 code · 19 blank · 48 comment · 8 complexity · 5f33e553cd1e13124ec304321d55caa9 MD5 · raw file

  1. <?php
  2. /**
  3. * $URL: svn://svn.mzz.ru/mzz/trunk/system/modules/user/mappers/userOnlineMapper.php $
  4. *
  5. * MZZ Content Management System (c) 2007
  6. * Website : http://www.mzz.ru
  7. *
  8. * This program is free software and released under
  9. * the GNU Lesser General Public License (See /docs/LGPL.txt).
  10. *
  11. * @link http://www.mzz.ru
  12. * @version $Id: userOnlineMapper.php 4039 2009-12-17 10:30:13Z striker $
  13. */
  14. fileLoader::load('user/models/userOnline');
  15. /**
  16. * userOnlineMapper
  17. *
  18. * @package modules
  19. * @subpackage user
  20. * @version 0.2
  21. */
  22. class userOnlineMapper extends mapper
  23. {
  24. /**
  25. * DomainObject class name
  26. *
  27. * @var string
  28. */
  29. protected $class = 'userOnline';
  30. /**
  31. * Table name
  32. *
  33. * @var string
  34. */
  35. protected $table = 'user_userOnline';
  36. /**
  37. * Map
  38. *
  39. * @var array
  40. */
  41. protected $map = array(
  42. 'id' => array(
  43. 'accessor' => 'getId',
  44. 'mutator' => 'setId',
  45. 'options' => array(
  46. 'pk',
  47. 'once')),
  48. 'user_id' => array(
  49. 'accessor' => 'getUser',
  50. 'mutator' => 'setUser',
  51. 'relation' => 'one',
  52. 'mapper' => 'user/user',
  53. 'foreign_key' => 'id'
  54. ),
  55. 'last_activity' => array(
  56. 'accessor' => 'getLastActivity',
  57. 'mutator' => 'setLastActivity'),
  58. 'session' => array(
  59. 'accessor' => 'getSession',
  60. 'mutator' => 'setSession'),
  61. 'url' => array(
  62. 'accessor' => 'getUrl',
  63. 'mutator' => 'setUrl'),
  64. 'ip' => array(
  65. 'accessor' => 'getIp',
  66. 'mutator' => 'setIp'),
  67. );
  68. protected function preInsert(& $data)
  69. {
  70. if (is_array($data)) {
  71. $data['last_activity'] = new sqlFunction('unix_timestamp');
  72. }
  73. }
  74. protected function preUpdate(& $data)
  75. {
  76. if (is_array($data)) {
  77. $data['last_activity'] = new sqlFunction('unix_timestamp');
  78. }
  79. }
  80. public function checkTimeout()
  81. {
  82. $allusers = $this->searchAll();
  83. foreach($allusers as $a_user) {
  84. if($a_user->getLastActivity() < (time() - 300)) {
  85. $this->delete($a_user);
  86. }
  87. }
  88. return $allusers;
  89. }
  90. /**
  91. * Обновление информации о пользователях онлайн
  92. * Запускается лишь один раз
  93. *
  94. * @param user $me
  95. */
  96. public function refresh($me)
  97. {
  98. static $alreadyRun = false;
  99. if (!$alreadyRun) {
  100. $toolkit = systemToolkit::getInstance();
  101. $session = $toolkit->getSession();
  102. $request = $toolkit->getRequest();
  103. $criteria = new criteria();
  104. $criteria->where('user_id', $me->getId());
  105. $criteria->where('session', $session->getId());
  106. $exists = $this->searchOneByCriteria($criteria);
  107. if (!$exists) {
  108. $exists = $this->create();
  109. $exists->setUser($me);
  110. $exists->setSession($session->getId());
  111. $exists->setIp($request->getServer('REMOTE_ADDR'));
  112. }
  113. $exists->setLastActivity('refresh please :)');
  114. $exists->setUrl($request->getRequestUrl());
  115. $this->save($exists);
  116. // удаляем по таймауту, а также пользователей, с такой же сессией но другим user_id (при смене логина)
  117. // @todo: таймаут переносить в конфиг
  118. $criteria = new criteria();
  119. $criteria->where('last_activity', new sqlOperator('-', array(new sqlFunction('unix_timestamp'), 15 * 60)), criteria::LESS);
  120. $users = $this->searchAllByCriteria($criteria);
  121. if (sizeof($users)) {
  122. $userMapper = $toolkit->getMapper('user', 'user', 'user');
  123. }
  124. foreach ($users as $user) {
  125. $this->delete($user->getId());
  126. $usr = $user->getUser();
  127. $usr->setLastLogin($user->getLastActivity());
  128. $userMapper->save($usr);
  129. }
  130. $last_id = $session->get('last_user_id');
  131. if ($last_id != $me->getId()) {
  132. $this->changeLogin($me, $session);
  133. }
  134. $alreadyRun = true;
  135. }
  136. }
  137. /**
  138. * Удаление старой записи при смене логина
  139. *
  140. * @param user $me
  141. * @param session $session
  142. */
  143. private function changeLogin($me, $session)
  144. {
  145. $session = systemToolkit::getInstance()->getSession();
  146. $criteria = new criteria();
  147. $criteria->where('user_id', $me->getId(), criteria::NOT_EQUAL);
  148. $criteria->where('session', $session->getId());
  149. $users = $this->searchAllbyCriteria($criteria);
  150. foreach ($users as $user) {
  151. $this->delete($user->getId());
  152. }
  153. $session->set('last_user_id', $me->getId());
  154. }
  155. }
  156. ?>