Как работает хук user_profile_update.php?

#1 26 января 2016 в 20:25
Большинство хуков которые работают на валидацию вводимых данных позволяют проверять вводимые данные и при необходимости хук кроме самих данных возвращает еще и ошибку $errors['.....'] для вывода в форму.

Но для чего работает хук при редактирования профиля пользователя user_profile_update.php?

Вот собственно вырезка из кода где хук используется: profile_edit.php

  1. // Проверям правильность заполнения
  2. $errors = $form->validate($this, $profile);
  3.  
  4. if (!$errors){
  5. $is_allowed = cmsEventsManager::hookAll('user_profile_update', $profile, true);
  6. if ($is_allowed !== true && in_array(false, $is_allowed)) { $errors = true; }
  7. }
  8.  
  9. if (!$errors){
  10.  
  11. // Обновляем профиль и редиректим на его просмотр
  12. $this->model->updateUser($profile['id'], $profile);
Он либо возвращает true — значит все нормально, либо false, тогда на странице выводит ошибка в заполнении полей. А как указать какое поле именно вызвало ошибку? Где я что пропустил?

p.s. мне нужно сделать дополнительную валидацию полей при редактировании профиля.
з.ы. хаки не предлагать
#2 26 января 2016 в 20:37

Но для чего работает хук при редактирования профиля пользователя user_profile_update.php?

kreator
Проверяет емаил и никнейм на отсутствие их в "чёрном списке".
#3 26 января 2016 в 21:11
странно просто. во многих местах хук при валидации возвращает ошибки, а тут нет
#4 26 января 2016 в 21:48
Каждый хук пишется для своих целей. Вы можете написать свой хук user_profile_update и он параллельно обработает эти же данные, как вам надо и вернёт ошибки какие укажите, но вот только в файле profile_edit.php нужно будет делать хаки, чтобы обработать данные из вашего хука. А вам это уже не интересно.
#5 26 января 2016 в 23:11
Событие "user_profile_update" в системе из коробки обрабатывает только один контроллер "auth" в \system\controllers\auth\hooks\user_profile_update.php.

  1. class onAuthUserProfileUpdate extends cmsAction {
  2.  
  3. public function run($profile){
  4.  
  5. $user = cmsUser::getInstance();
  6.  
  7. if ($user->is_admin) { return true; }
  8.  
  9. if (!$profile) { return false; }
  10.  
  11. if (!$this->isEmailAllowed($profile['email'])){
  12. cmsUser::addSessionMessage(sprintf(LANG_AUTH_RESTRICTED_EMAIL, $profile['email']), 'error');
  13. return false;
  14. }
  15.  
  16. if (!$this->isNameAllowed($profile['nickname'])){
  17. cmsUser::addSessionMessage(sprintf(LANG_AUTH_RESTRICTED_NAME, $profile['nickname']), 'error');
  18. return false;
  19. }
  20.  
  21. return true;
  22.  
  23. }
  24.  
  25. }
Хук выводит описание ошибки на странице. Это сообщение о запрещённой почте:
  1. cmsUser::addSessionMessage(sprintf(LANG_AUTH_RESTRICTED_EMAIL, $profile['email']), 'error');
А это — о запрещённом нике:
  1. cmsUser::addSessionMessage(sprintf(LANG_AUTH_RESTRICTED_NAME, $profile['nickname']), 'error');
Непонятно, какую именно валидацию Вам нужно сделать, kreator. Но поскольку для вызова хука используется cmsEventsManager::hookAll(), то Вы действительно можете сделать свой обработчик с нужными проверками и он будет вызван до или после хука в user_profile_update.php. Если вызов будет после, то вы можете даже переопределить результат true от предыдущего обработчика на своё значение false. Если Ваш хук сработает первым и вернёт false, то true от следующих хуков Ваш false не изменят. Пока последовательность вызова обработчиков никак не регулируется. Судя по всему обработчики вызываются по алфавитной сортировке имён контроллеров. Но может быть и иначе, например, по расположению записей папок контроллеров в файловой системе.

Также в своём обработчике Вы тем же способом (через cmsUser::addSessionMessage) можете вывести желаемое сообщение пользователю.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.