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

Дополнительный ввод при создании темы

Тема в разделе "Статьи по XenForo Framework", создана пользователем Grell, 14.10.2014.

Загрузка
  1. Grell

    Grell Пользователь

    Регистрация:
    10.04.14
    Сообщения:
    77
    Симпатии:
    38
    Версия XF:
    1.3.2
    Стоит задача - добавить при создании темы пару дополнительных обязательных полей, при создании темы они должны быть заполнены, значения должны быть обработаны, если их нет или ввод неправильный - то должна возникать ошибка, и тема создаваться не должна.

    Со вставкой полей в шаблоны, в принципе, особых заморочек нету, самое интересное начинается в момент создания самой темы. В методе ControllerPublic_Forum::actionAddThread до момента записи темы вообще нет удобного момента, чтобы воткнуться и устроить там проверку ввода и кидаться исключениями в случае неправильности.
    Как устроить код в данном случае? Не в датаврайтере же городить это всё, ей-богу. Хотя в крайнем случае и на это прийдется пойти, если ничего лучше не подскажете.
     
  2. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Grell, да, только через предварительную запись входных данных в регистри или в статик переменную в контроллере и извлечение их датарайтере.

    Если таких плагинов на форуме планируется много и чтобы не захламлять регистри, то можно использовать мой плагин https://github.com/Yoskaldyr/cmf_core там все можно сделать описанием конфига (какое поле инпута в каком экшн/контроллере брать и в какой датарайтер писать)

    P.S. Хотя документации как именно описывать конфиг я так и сделал, если будут вопросы то в личку или issue на гитхабе - скину пример
     
    Mirovinger нравится это.
  3. Grell

    Grell Пользователь

    Регистрация:
    10.04.14
    Сообщения:
    77
    Симпатии:
    38
    Версия XF:
    1.3.2
    Спасибо! Обязательно ознакомлюсь, хотя получается немного усложненно.

    Регистри - это, если я правильно понимаю, это тот класс, от которого унаследован XenForo_Application? Т.е. Zend_Registry и методы get и set у него? Если да, то думаю, лучше действительно не захламлять.
    Если через статик передавать, я думаю, такой код будет приемлем (изображаю схематично)? Все правильно себе представляю?
    PHP:
    class MyPlugin_ControllerPublic_Forum extends XFCP_...
    {
         
    // нужный экшен
         
    function actionAddThread()
         {
             
    // сохранили ввод в собственный класс
             
    MyPlugin_InputContainer::saveInput($this->_input->filter('my_input''my_another_input'));
             return 
    parent::actionAddThread();
         } 
    }
    PHP:
    class MyPlugin_DataWriter_Thread extends XFCP_...
    {
        function 
    _discussionPreSave()
        {
            
    parent::_discussionPreSave();
            
    // извлекли-обработали-сохранили, как будто в контроллере под методом $writer->preSave();
            // если не обработалось - то выкинули ошибку через $this->error
            
    $input MyPlugin_InputContainer::readInput();
            ...
        }
    }
     
  4. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Grell, Можно так, но насчет регистри я имел ввиду прямой вызов XenForo_Application::set / XenForo_Application::get без наследования.
    Вариант в примере выше со статик методами тоже норм, тут больше как разработчику нравится
    Аналогично вариант с регистри:
    PHP:
    class MyPlugin_ControllerPublic_Forum extends XFCP_...
    {
         
    // нужный экшен
         
    function actionAddThread()
         {
             
    // сохранили ввод в регистри
             
    XenForo_Application::set('myPluginUniqueKey'$this->_input->filter('my_input''my_another_input'));
             return 
    parent::actionAddThread();
         }
    }
    PHP:
    class MyPlugin_DataWriter_Thread extends XFCP_...
    {
        function 
    _discussionPreSave()
        {
            
    parent::_discussionPreSave();
            
    // извлекли-обработали-сохранили, как будто в контроллере под методом $writer->preSave();
            // если не обработалось - то выкинули ошибку через $this->error
            
    $input XenForo_Application::get('myPluginUniqueKey');
            ...
        }
    }
    Но не стоит забывать что в регистре входных данных может не быть или может происходить пакетная обработка тем (например при модерировании) где необходимого инпута просто нет, т.е. надо не забывать регистри/статику очищать и проверять на isset (в примере выше этого нет). Т.е. запись в датарайтер должна быть опциональна, только если данные в регистри установлены и должна присутствовать очистка после извлечения.
     

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