Advertisement
Guest User

example

a guest
Mar 15th, 2016
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 18.22 KB | None | 0 0
  1. <?php
  2.  
  3. use \Progsmile\Validator\Validator as V;
  4.  
  5. class UsersController extends BaseController
  6. {
  7.  
  8.     public function onConstruct()
  9.     {
  10.         parent::onConstruct();
  11.     }
  12.  
  13.  
  14.  
  15.  
  16.  
  17.     /**
  18.      * Страница управления пользователями
  19.      */
  20.     public function indexAction()
  21.     {
  22.         $allUsers            = Users::getSubUsers($this->user->id);
  23.         $this->view->experts = Users::find(["conditions" => "role_id = ?0", "bind" => [Roles::ROLE_EXPERT]]);
  24.         $this->view->users   = $allUsers;
  25.  
  26.         //это нужно для того чтобы поддержать иерархическую связь
  27.         //директор - админ - секретарь | - эксперт -агент
  28.         array_shift($allUsers);
  29.         array_walk_recursive($allUsers, function ($elem) use (&$flatUsers) {
  30.             $flatUsers[] = $elem;
  31.         });
  32.  
  33.         $this->view->flatUsers = $flatUsers;
  34.     }
  35.  
  36.  
  37.  
  38.  
  39.  
  40.     public function agentsAction()
  41.     {
  42.         $this->view->pick(['users/index']);
  43.         $this->view->users = $this->user->getChildUsers(Roles::ROLE_AGENT);
  44.     }
  45.  
  46.  
  47.  
  48.  
  49.  
  50.     /**
  51.      * Create new user
  52.      */
  53.     public function addUserAction()
  54.     {
  55.         $this->view->title = 'Добавить пользователя';
  56.         $this->view->roles = Roles::find();
  57.     }
  58.  
  59.  
  60.  
  61.  
  62.  
  63.     /**
  64.      * Save user to DB
  65.      * @return mixed
  66.      */
  67.     public function saveAction()
  68.     {
  69.         $this->setupAjaxRequest();
  70.  
  71.         //чистка
  72.         $postData = Input::sanitize($this->request->getPost());
  73.  
  74.  
  75.         // если роль которую добавляем больше роли пользователя
  76.         // например эксперт хочет добавить админа О_о
  77.         $this->checkPermissions(intval($postData['role_id']));
  78.  
  79.         //Валидация
  80.         $validationResult = Users::validateUser($postData);
  81.  
  82.  
  83.         if ($validationResult->fails()) {
  84.             $this->sendJSON(['status' => ResponseStatus::FAIL, 'message' => $validationResult->first('password')]);
  85.         }
  86.  
  87.         $userCreatedCode = Users::createUser($postData);
  88.  
  89.         if ($userCreatedCode) {
  90.             $this->sendJSON(['status' => ResponseStatus::OK, 'code' => $userCreatedCode]);
  91.         }
  92.  
  93.         //fail
  94.         $this->sendJSON();
  95.     }
  96.  
  97.  
  98.  
  99.  
  100.  
  101.     /**
  102.      * Активировать или деактивировать пользователя
  103.      * @param $action 1 - для активации, 0 - для выключения
  104.      * @param $id
  105.      */
  106.     public function manageActivationAction($action, $id)
  107.     {
  108.         /** @var Users $user */
  109.         $user = Users::findFirst($id);
  110.  
  111.         //проверка прав
  112.         if ($this->checkPermissions($user->role_id)) {
  113.             $user->is_active = ($action) ? UserStatus::USER_ACTIVE : UserStatus::USER_NOT_ACTIVE;
  114.             $user->save();
  115.         }
  116.  
  117.         $this->redirectBack();
  118.     }
  119.  
  120.  
  121.  
  122.  
  123.  
  124.     // метод добавляет комментарий при удаления пользователя.
  125.     public function addCommentaryAction($id)
  126.     {
  127.  
  128.         $this->view->setVars([
  129.  
  130.            'users' => Users::findFirst($id),
  131.  
  132.         ]);
  133.  
  134.         $this->view->pick('users/commentary');
  135.     }
  136.  
  137.  
  138.  
  139.  
  140.  
  141.     /**
  142.      * Удалить пользователя по ID
  143.      * @param $id
  144.      * @return mixed
  145.      */
  146.     public function deleteAction($id)
  147.     {
  148.         $this->setupAjaxRequest();
  149.  
  150.         $user = Users::findFirst($id);
  151.  
  152.         if ($this->user->role_id > $user->role_id) {
  153.             $user->is_deleted = 1;
  154.             $user->commentary = $this->request->getPost()['commentary'];
  155.             $user->deleted_at = now();
  156.             $user->save();
  157.         }
  158.  
  159.         return $this->redirectBack();
  160.     }
  161.  
  162.  
  163.  
  164.  
  165.  
  166.     /**
  167.      * Изменение пароля пользователя
  168.      * @param $id
  169.      */
  170.     public function changePasswordAction($id)
  171.     {
  172.         $this->setupAjaxRequest();
  173.         /** @var Users $user */
  174.         if ($user = Users::findFirst($id)) {
  175.  
  176.             $this->checkPermissions($user->role_id);
  177.  
  178.             $postData = $this->request->getPost();
  179.  
  180.             $user->password = $this->security->hash($postData['password']); //срабатывает beforeSave и пароль хэшируется
  181.  
  182.             $user->save();
  183.  
  184.         }
  185.     }
  186.  
  187.  
  188.  
  189.  
  190.  
  191.     /**
  192.      * Проверка прав доступа
  193.      *
  194.      * @param $roleID
  195.      * @return bool
  196.      */
  197.     protected function checkPermissions($roleID)
  198.     {
  199.         if ($this->user->role_id < $roleID) {
  200.             $this->flash->error('Нет прав');
  201.  
  202.             return $this->redirectBack();
  203.         }
  204.  
  205.         return true;
  206.     }
  207.  
  208. }
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217. <?php
  218.  
  219. use Phalcon\Validation\Message;
  220. use Phalcon\Mvc\Model\Query;
  221. use \Progsmile\Validator\Validator as V;
  222.  
  223. class Users extends Phalcon\Mvc\Model
  224. {
  225.     use SearchTrait;
  226.  
  227.     public $id;
  228.     public $role_id;
  229.     public $full_name;
  230.     public $last_access;
  231.     public $code;
  232.     public $password;
  233.     public $is_deleted;
  234.     public $is_active;
  235.     public $created_at;
  236.     public $parent_id;
  237.     public $deleted_at;
  238.     public $commentary;
  239.     public $count_enters;
  240.     public $deleted_from_db;
  241.     public $customers_added;
  242.     public $objects_added;
  243.     public $deleted_cust_from_room;
  244.     public $deleted_obj_from_room;
  245.  
  246.  
  247.  
  248.  
  249.  
  250.     public static function getAgentExpertCodes($userID)
  251.     {
  252.         $cacheKey = 'users.agent.codes';
  253.  
  254.         $cache = Phalcon\Di::getDefault()->get('modelsCache');
  255.  
  256.         $users = $cache->get($cacheKey);
  257.  
  258.         if ( !$users) {
  259.  
  260.             $queriedUsers = Users::find(['columns' => 'id, code, parent_id'])->toArray();
  261.  
  262.             $users = [];
  263.             foreach ($queriedUsers as $user) {
  264.                 $users[$user['id']] = ['code' => $user['code'], 'parent_id' => $user['parent_id']];
  265.             }
  266.  
  267.             $cache->save($cacheKey, $users);
  268.         }
  269.  
  270.         $agent      = $users[$userID];
  271.         $agentCode  = $agent['code'];
  272.         $expertCode = $users[$agent['parent_id']]['code'];
  273.  
  274.         return $agentCode . ', ' . $expertCode;
  275.     }
  276.  
  277.  
  278.  
  279.  
  280.  
  281.     public function initialize()
  282.     {
  283.         //Блокноты
  284.         $this->hasMany('id', Blocknotu::class, 'user_id', ['alias' => 'blocknotu']);
  285.  
  286.  
  287.         //Показы
  288.         $this->hasMany('id', Pokazu::class, 'user_id', [
  289.            'alias'  => 'pokazuKvs',
  290.            'params' => [
  291.               'conditions' => 'realty_type = 1',
  292.            ],
  293.         ]);
  294.  
  295.         $this->hasMany('id', Pokazu::class, 'user_id', [
  296.            'alias'  => 'pokazuDomov',
  297.            'params' => [
  298.               'conditions' => 'realty_type = 2',
  299.            ],
  300.         ]);
  301.  
  302.         //Сделки
  303.         $this->hasManyToMany('id', Pokazu::class, 'user_id', 'id', Sdelki::class, 'pokaz_id', [
  304.            'alias'  => 'sdelkiKvs',
  305.            'params' => ['conditions' => 'realty_type = "' . RealtyTip::REALTY_KVARTIRA . '"'],
  306.         ]);
  307.  
  308.         $this->hasManyToMany('id', Pokazu::class, 'user_id', 'id', Sdelki::class, 'pokaz_id', [
  309.            'alias'  => 'sdelkiDomov',
  310.            'params' => ['conditions' => 'realty_type = "' . RealtyTip::REALTY_DOM . '"'],
  311.         ]);
  312.  
  313.  
  314.         //Задатки
  315.         $this->hasManyToMany('id', Pokazu::class, 'user_id', 'id', Zadatki::class, 'pokaz_id', [
  316.            'alias'  => 'zadatkiKvs',
  317.            'params' => ['conditions' => 'realty_type = "' . RealtyTip::REALTY_KVARTIRA . '"'],
  318.         ]);
  319.  
  320.         $this->hasManyToMany('id', Pokazu::class, 'user_id', 'id', Zadatki::class, 'pokaz_id', [
  321.            'alias'  => 'zadatkiDomov',
  322.            'params' => ['conditions' => 'realty_type = "' . RealtyTip::REALTY_DOM . '"'],
  323.         ]);
  324.  
  325.  
  326.         //Реклама
  327.         $this->hasMany('id', ReklamaKv::class, 'user_id', ['alias' => 'reklamaKv']);
  328.  
  329.         $this->hasMany('id', ReklamaDoma::class, 'user_id', ['alias' => 'reklamaDoma']);
  330.  
  331.  
  332.         //Клиенты квартир
  333.         $this->hasManyToMany('id', UserClientu::class, 'user_id', 'client_id', CustomersKv::class, 'id', [
  334.            'alias'  => 'clientsKv',
  335.            'params' => ['conditions' => 'client_type = "' . RealtyTip::REALTY_KVARTIRA . '"'],
  336.         ]);
  337.  
  338.         //Клиенты домов
  339.         $this->hasManyToMany('id', UserClientu::class, 'user_id', 'client_id', CustomersDoma::class, 'id', [
  340.            'alias'  => 'clientsDoma',
  341.            'params' => ['conditions' => 'client_type = "' . RealtyTip::REALTY_DOM . '"'],
  342.         ]);
  343.  
  344.  
  345.         //Квартиры в объектах
  346.         $this->hasManyToMany('id', UserObjects::class, 'user_id', 'object_id', Kvartiru::class, 'id', [
  347.            'alias'  => 'kvartiru',
  348.            'params' => ['conditions' => 'object_type = "' . RealtyTip::REALTY_KVARTIRA . '"'],
  349.         ]);
  350.  
  351.         //Дома в объектах
  352.         $this->hasManyToMany('id', UserObjects::class, 'user_id', 'object_id', Doma::class, 'id', [
  353.            'alias'  => 'doma',
  354.            'params' => ['conditions' => 'object_type = "' . RealtyTip::REALTY_DOM . '"'],
  355.         ]);
  356.  
  357.     }
  358.  
  359.  
  360.  
  361.  
  362.  
  363.     /**
  364.      * Обновить профиль пользователя.
  365.      *
  366.      * @param $userID
  367.      * @param $postData
  368.      * @return bool
  369.      */
  370.     public static function updateProfile($userID, $postData)
  371.     {
  372.         /** @var Users $user */
  373.         if ($user = Users::findFirst($userID)) {
  374.  
  375.             $user->save([
  376.                'created_at' => isset($postData['created_at']) ? $postData['created_at'] : $user->created_at,
  377.             ]);
  378.  
  379.             UserSites::updateLinks($postData, $userID);
  380.  
  381.             UsersPhones::updatePhones($postData, $userID);
  382.  
  383.             return true;
  384.         }
  385.  
  386.         return false;
  387.     }
  388.  
  389.  
  390.  
  391.  
  392.  
  393.     /**
  394.      * Получить всех подчиненных текущего пользователя
  395.      * @param $userID
  396.      * @return array | null
  397.      */
  398.     public static function getSubUsers($userID)
  399.     {
  400.         $subUsers = [];
  401.         foreach (Users::find(["conditions" => "is_deleted = ?0", "bind" => [0 => 0]])->toArray() as &$user) {
  402.             $subUsers[$user['parent_id']][$user['id']] = $user;
  403.         }
  404.  
  405.         //get only parent nodes
  406.         $subUsers = Users::create_tree($subUsers, $userID);
  407.         $newQuery = [];
  408.  
  409.         //tree array to flat array
  410.         array_walk_recursive($subUsers, function (&$elem) use (&$newQuery) {
  411.             $newQuery[] = $elem;
  412.         });
  413.  
  414.         //group array by role
  415.         $subUsers = [];
  416.         foreach ($newQuery as &$val) {
  417.             $subUsers[$val->role_id][] = $val;
  418.         }
  419.  
  420.         //sort keys
  421.         ksort($subUsers);
  422.  
  423.         return $subUsers;
  424.     }
  425.  
  426.  
  427.  
  428.  
  429.  
  430.     /**
  431.      * Сформировать дерево пользователей
  432.      * @param $subUsers
  433.      * @param $parentID
  434.      * @return array|null
  435.      */
  436.     private static function create_tree($subUsers, $parentID)
  437.     {
  438.         if (is_array($subUsers) && isset($subUsers[$parentID])) {
  439.             $tree = [];
  440.  
  441.             foreach ($subUsers[$parentID] as &$cat) {
  442.  
  443.                 if ($cat) {
  444.                     $tree[] = (object)$cat;
  445.                 }
  446.  
  447.                 $result = self::create_tree($subUsers, $cat['id']);
  448.  
  449.                 if ($result) {
  450.                     $tree[] = $result;
  451.                 }
  452.             }
  453.  
  454.         } else {
  455.             return null;
  456.         }
  457.  
  458.         return $tree;
  459.     }
  460.  
  461.  
  462.  
  463.  
  464.  
  465.     /**
  466.      * Авторизировать
  467.      */
  468.     public function authorize()
  469.     {
  470.         $this->getDI()->getSession()->set('user', $this);
  471.         $this->count_enters++;
  472.  
  473.         if (in_array($this->role_id, [Roles::ROLE_AGENT, Roles::ROLE_AGENT])) {
  474.             UserSites::initUserLinks($this->id);
  475.         }
  476.  
  477.         $this->save();
  478.  
  479.     }
  480.  
  481.  
  482.  
  483.  
  484.  
  485.     /**
  486.      * После создания пользователя
  487.      * Создать ссылки на рекламные аккаунты
  488.      */
  489.     public function afterCreate()
  490.     {
  491.         if (in_array($this->role_id, [Roles::ROLE_AGENT, Roles::ROLE_EXPERT])) {
  492.             UserSites::initUserLinks($this->id);
  493.         }
  494.     }
  495.  
  496.  
  497.  
  498.  
  499.  
  500.     public function beforeCreate()
  501.     {
  502.         if ( !$this->created_at) {
  503.             $this->created_at = now();
  504.         }
  505.     }
  506.  
  507.  
  508.  
  509.  
  510.  
  511.     public function beforeDelete()
  512.     {
  513.         $this->is_active  = false;
  514.         $this->is_deleted = true;
  515.         $this->deleted_at = now();
  516.  
  517.         return isset($this->forceDelete);
  518.     }
  519.  
  520.  
  521.  
  522.  
  523.  
  524.     /**
  525.      * Создать пользователя
  526.      *
  527.      * @param $postData
  528.      * @return string
  529.      */
  530.     public static function createUser($postData)
  531.     {
  532.         $user = new Users();
  533.         $user->assignData($postData);
  534.  
  535.         //специально для агента
  536.         $tempParentID = 0;
  537.         if ($postData['role_id'] == Roles::ROLE_AGENT) {
  538.             $tempParentID = $postData['parent_id'];
  539.         }
  540.  
  541.         //сформировать код
  542.         $user->code = UsersCodeResolver::extractUserCode($user->role_id, $tempParentID);
  543.  
  544.         $user->save();
  545.  
  546.         return $user->code;
  547.     }
  548.  
  549.  
  550.  
  551.  
  552.  
  553.     /**
  554.      * Инициализировать поля
  555.      *
  556.      * @param $postData
  557.      */
  558.     public function assignData($postData)
  559.     {
  560.         $securityService  = Phalcon\DI::getDefault()->getSecurity();
  561.         $this->password   = $securityService->hash($postData['password']);
  562.         $this->role_id    = $postData['role_id'];
  563.         $this->parent_id  = $postData['parent_id'];
  564.         $this->created_at = now();
  565.     }
  566.  
  567.  
  568.  
  569.  
  570.  
  571.     /**
  572.      * User creating validation
  573.      *
  574.      * @param $postData
  575.      *
  576.      * @return \Progsmile\Validator\Helpers\ValidatorFacade
  577.      */
  578.     public static function validateUser($postData)
  579.     {
  580.         $validationResult = V::make($postData, [
  581.            'password' => 'required|min:5',
  582.         ], [
  583.            'password.required' => 'Введите пароль',
  584.            'password.min'      => 'Пароль слишком короткий',
  585.         ]);
  586.  
  587.         return $validationResult;
  588.     }
  589.  
  590.  
  591.  
  592.  
  593.  
  594.     /**
  595.      * Создать код для пользователя
  596.      * @return string
  597.      */
  598.     private function makeCode($expertID, $expertCode)
  599.     {
  600.         $code = $this->id;
  601.  
  602.         switch ($this->role_id) {
  603.             case Roles::ROLE_ADMIN:
  604.                 $code = $this->getUserWithMaxCode(4, 'a');
  605.                 break;
  606.  
  607.             case Roles::ROLE_SECRETARY:
  608.                 $code = $this->getUserWithMaxCode(3, 's');
  609.                 break;
  610.  
  611.             case Roles::ROLE_EXPERT:
  612.                 $user = self::findFirst(["conditions" => "role_id = ?0 order by code DESC", "bind" => [0 => 2]]);
  613.                 $code = $user->code + 1000;
  614.                 break;
  615.  
  616.             case Roles::ROLE_AGENT:
  617.                 $getLastSubUsersCode = Users::findFirst([
  618.                    "conditions" => "parent_id = ?0 order by id DESC",
  619.                    "bind"       => [0 => $expertID],
  620.                 ])->code;
  621.                 $code                = $getLastSubUsersCode ? $getLastSubUsersCode + 1 : $expertCode + 1;
  622.                 break;
  623.         }
  624.  
  625.         $this->code = $code;
  626.         $this->save();
  627.  
  628.         return $this->code;
  629.     }
  630.  
  631.  
  632.  
  633.  
  634.  
  635.     // Метод получает из БД код последнего добавленного секретаря или админа и генерирует из этих данных код для нового юзера.
  636.     private function getUserWithMaxCode($role, $name)
  637.     {
  638.         $newCodeParts = [];
  639.  
  640.         $userLastCode = str_split(self::findFirst([
  641.            "conditions" => "role_id = ?0 order by id DESC",
  642.            "bind"       => [0 => $role],
  643.         ])->code);
  644.  
  645.         for ($i = 1; $i < count($userLastCode); $i++) {
  646.  
  647.             $newCodeParts[] = $userLastCode[$i];
  648.         }
  649.  
  650.         $newCodeNumbers = (integer)implode($newCodeParts) + 1;
  651.         $code           = $name . $newCodeNumbers;
  652.  
  653.         return $code;
  654.     }
  655.  
  656.  
  657.  
  658.  
  659.  
  660.     /**
  661.      * Получить ID эксперта
  662.      */
  663.     public function getExpert()
  664.     {
  665.         return Users::findFirstByParentId($this->id);
  666.     }
  667.  
  668.  
  669.  
  670.  
  671.  
  672.     /**
  673.      * Повертае всiх cекретарiв
  674.      * @return mixed
  675.      */
  676.     public static function getAllSecretaries()
  677.     {
  678.         return static::find([
  679.            'conditions' => 'role_id = ?0',
  680.            'bind'       => [Roles::ROLE_SECRETARY],
  681.         ]);
  682.     }
  683.  
  684.  
  685.  
  686.  
  687.  
  688.     // Считает количество дней, которые юзер работает в Аверсе.
  689.     public function howLongWorking($id)
  690.     {
  691.         $user = self::findFirst(["conditions" => "id = ?0", "bind" => [$id]]);
  692.  
  693.         if ($user->created_at !== null) {
  694.             $timestampCreatting = strtotime($user->created_at);
  695.             $timestampNow       = time();
  696.             $dayWorking         = floor(($timestampNow - $timestampCreatting) / 86400);
  697.  
  698.             return $dayWorking;
  699.         }
  700.  
  701.         return 0;
  702.     }
  703.  
  704.  
  705.  
  706.  
  707.  
  708.     // Метод возвращает массив уволенных сотрудников, с датами принятия на работу и увольния.
  709.     public function getHiredFiredData()
  710.     {
  711.         $getUsers   = self::find([
  712.            "conditions" => "role_id = ?0 AND is_deleted = ?1",
  713.            "bind"       => [Roles::ROLE_AGENT, 1],
  714.         ]);
  715.         $firedUsers = [];
  716.  
  717.         foreach ($getUsers as $key => $value) {
  718.  
  719.             $value->created_at = explode(' ', $value->created_at)[0];
  720.             $value->deleted_at = explode(' ', $value->deleted_at)[0];
  721.             $firedUsers[]      = $value;
  722.         }
  723.  
  724.         return $firedUsers;
  725.     }
  726.  
  727.  
  728.  
  729.  
  730.  
  731.     /**-------------------------------------
  732.      * Получить текущего пользователя
  733.      *
  734.      * @return Users
  735.      *-------------------------------------*/
  736.     public static function getCurrentUserID()
  737.     {
  738.         /** @var Users $user */
  739.         $user = Phalcon\Di::getDefault()->get('session')->get('user');
  740.  
  741.  
  742.         return $user ? $user->id : 0;
  743.     }
  744. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement