FormLister регистрация веб-пользователя внутри личного кабинета другого пользователя

Пытаюсь решить такую задачу.

На сайте 2 группы пользователей:
company — агентства
web — агенты
При этом пользователей группы company создает админ в админке, а те в свою очередь пользователей группы web создают у себя в личном кабинете.
Таким образом, регистрации на сайте нет, она должна быть в личном кабинете, где компания сама регистрирует своих сотрудников.

Для реализации идея простая — форму регистрации разместил в личном кабинете для пользователей company.
Чтобы форма появилась, в контролере Register удалил функцию public function render, стр. 39-50, вот это

    public function render()
    {
        if ($id = $this->modx->getLoginUserID('web')) {
            $this->redirect('exitTo');
            $this->user->edit($id);
            $this->setFields($this->user->toArray());
            $this->renderTpl = $this->getCFGDef('skipTpl', $this->translate('register.default_skipTpl'));
            $this->setValid(false);
        };

        return parent::render();
    }

Форма появилась, что я уже зарегистрирован — не ругается, валидация работает, если логин и email заняты сообщает.
Но данные форма не отправляет, и ничего не сообщает — при нажатии кнопки Регистрация страница просто молча перезагружается и все.

Подскажите пожалуйста, как приспособить форму регистрации для работы в личном кабинет?

7 комментариев

avatar
Скорее всего проверка там не только при рендере формы, но и при отправке. Так что надо переписать все методы класса, где есть проверка.
avatar
Спасибо.
Такая мысль была, но пока больше ничего не нашел((
avatar
Добавился еще один вопрос, решил новый топик не создавать, а спросить здесь же.
Кроме регистрации внутри личного кабинета нужно сделать еще и редактирование ранее созданных пользователей, тоже в личном кабинете.
Небольшое пояснение — для идентификации компании и ее сотрудников в таблице web_user_attributes сотрудника используется поле zip, в которое вписывается id компании.

Немного доработал контроллер Profile — ниже строки 27
$uid = $modx->getLoginUserId('web');

Добавил
$agent = $_GET['aid'];
if(!empty($agent)) {
    $uid = $_GET['aid'];
}

Это работает, но в строку браузера можно подставить id любого веб-пользователя и будет возможность отредактировать любого — и своих, и чужих.
Поэтому добавил вывод «только своих» и добавил в if сравнение, получилось так
$uid = $modx->getLoginUserId('web');

$table = $modx->getFullTableName('web_user_attributes');
$res = $modx->db->select("internalKey", $table, "zip='".$uid."'");
while ($row = $modx->db->getRow($res)) {
    $ids[] = $row['internalKey'];
        $ids_user = implode(',', $ids);
}

$arr = array($ids_user);
$agent = $_GET['aid'];

if(!empty($agent) && !in_array($agent, $arr)){
	$uid = $_GET['aid'];
}

Но все-равно возможность редактировать «чужих» не закрылась. Такое впечатление, что in_array не работает или я криво написал, а может он вообще не к месту и надо делать по-другому.

Подскажите, пожалуйста, как сделать правильно.
  • paic
  • 0
avatar
Если ты этом прям сделал в файл Register.php, то садись два. После обновления FormLister или cms все сламается joxi.ru/YmEoQ99sJB5PLA. Если ты отнаследовался то все окей. Вообще я б или отнаследовался от базового контроллера, или сделал бы свой на основе Form, или юзал бы форм плюс prepare. А если ты и profile тоже редактировал в коде ну то печалька. Вообще задача у тебя не сложная.
По части проверки на своих, первое при выводе списка ты проверяеш по zip, при выводе формы и при сохранении.
Потому что если у тебя ид юзера в скрытом инпуте по никто не мешает подменить. Вообще если нужна консультация, платная конечно то пиши в телеграм @dzhuryn. Могу или сам писать код и тебе объяснять, или объяснять как делать а код пишешь ты, цена разная)))).
avatar
Пока сделал свой контроллер — для редактирования профиля компании родной Profile.php, а для редактирования профиля своего сотрудника ProfileAgent.php.
А регистрацию пока отложил((
avatar
Норм подход, по факту переделать чтоб ид юзера брало не из сесии но из гет параметра, но проверить чтоб были права на правку профиля юзера.
Из регистрацией тоже самое, пару методов подменить и будет ок. Сила ООП
avatar
Спасибо. Теоретически я и сам это понимаю, затык с практикой.
Кстати, и по удалению веб-пользователя — аналогичная задача.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.