1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

Как реализовать красивый вывод своих ошибок модуля аля ксено-ошибки?

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем Gambit, 15.04.2015.

Загрузка
  1. Gambit

    Gambit Новичок

    Регистрация:
    15.04.15
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.4.5
    есть модуль, который обрабатывает некую информацию.
    В некоторых случаях необходимо прекратить работу модуля и вызвать ошибку с нужным текстом на экран. (например, вордпресс реализует это через wp_die())
    В некоторых случаях не надо прекращать работу модуля, и просто вызывать ошибку с нужным текстом. (например, у некоторых цмс есть своя глоб переменная $_error, которая копит все ошибки и они выводятся при из наличии)

    Подскажите, как это правильно реализовать на XenForo?
    А то так сходу не смог найти общепринятых выводов ошибок.
    Неужели придётся писать что-то своё?
    п.с. вариант php die() не подходит.
     
  2. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Если нужно просто отобразить текст ошибки, то обычно это делается так:
    Код:
    throw $this->getErrorOrNoPermissionResponseException(new XenForo_Phrase('ваша_фраза'));
    или
    Код:
    throw $this->getErrorOrNoPermissionResponseException('Указываем тут текст ошибки');
    Если нужно вывести не ошибку, а указать, что нет прав для выполнения действия, то применяется такой метод:
    Код:
    throw $this->getNoPermissionResponseException();
     
    FractalizeR и Mirovinger нравится это.
  3. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    P.S. Это вызывается в контроллере, если что.
     
  4. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    243
    Версия XF:
    1.1.3
    Ну это не очень красиво имхо.

    return $this->responseNoPermission();
    return $this->responseMessage(new XenForo_Phrase('имя фразы'));
    return $this->responseError(new XenForo_Phrase(' имя фразы'));

    имхо красивее
     
    FractalizeR нравится это.
  5. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Ключевая фраза у спрашивающего была:
    Если использовать return, то далеко не везде можно будет обработать ошибку и вывести ее пользователю.
    Использование throw позволяет в любом месте вызвать ошибку и отобразить ее пользователю. Также вызов метода об отсутствии прав автоматически отобразит окно логина, если пользователь не зарегистрирован.
    То есть return $this->response... всего лишь подменяет шаблон вывода, заменяя его на простой вывод текста. Использование throw в любом месте прервет исполнение и отобразит ошибку с нужным текстом. Это широко применяется в контроллерах следующим образом:
    Код:
    protected function _preDispatch($action)
    {
      $this->_assertPermissionToView();
    }
    
    protected function _assertPermissionToView()
    {
      if (!XenForo_Visitor::getInstance()->hasPermission('general', 'spViewOrg'))
      {
        throw $this->getNoPermissionResponseException();
      }
    }
    В моем случае, если пользователь не имеет соответствующего права на просмотр контента, то выдается стандартное сообщение о том, что нет прав. При этом, если пользователь незалогинен, то ему еще и окно логина отобразится.

    И уже нет необходимости в каждом экшене контроллера прописывать требуемые права. Конечно, все зависит от задачи. Но для моих задач идеально подходит именно вызов исключения.
     
    FractalizeR нравится это.
  6. Gambit

    Gambit Новичок

    Регистрация:
    15.04.15
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.4.5
    Спасибо за ответы. Всё в точку. Для различных ситуаций подходят различные эксепшены.
    Остаётся добавить, что в них ещё можно передавать не только текст, но и html.
    Например, для добавления кнопки "Назад",
    throw $this->getErrorOrNoPermissionResponseException(new XenForo_Phrase('моя_фраза') . '<a href>' . new XenForo_Phrase('Назад') . '</a>');
     

Поделиться этой страницей