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

1.1.x Переопределение стандартных функций

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем Agel_Nash, 5 июн 2012.

Загрузка
  1. Agel_Nash

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

    Регистрация:
    23.01.12
    Сообщения:
    16
    Симпатии:
    7
    Версия XF:
    1.1.2
    Встала задача поправить логику одной из стандартных фукнций XenForo. В частности, импорт пользователей в подписную базу сервиса smartresponder. Т.к. администратор сайта ведет рассылку именно через этот сервис, а не через сайт. Соответственно при снятии галочки "Получать письма от администрации форума, предназначенные для всех пользователей." в профиле пользователя e-mail должен удаляться из списка подписчиков. По идее можно отредактировать library/XenForo/ControllerPublic/Account.php и т.п. добавив нужную мне логику, но этот способ утопический, т.к. при обновлении движка придется постоянно править исходники.

    Есть идеи?
     
  2. Barbos

    Barbos Местный

    Регистрация:
    14.04.12
    Сообщения:
    115
    Симпатии:
    141
    Версия XF:
    1.1.2
    а каким способом пользователи импортируются в базу сервиса?
    вообще логика простая: если галка снята с " Получать рассылку сайта " то пользователя не импортировать...
    при импорте проверять поле receive_admin_email таблицы xf_user_option
     
  3. Pepelac

    Pepelac Продам луц в бутылках Команда форума

    Регистрация:
    28.09.10
    Сообщения:
    1.794
    Симпатии:
    1.349
    Достаточно повесить обработчик события load_class_controller, чтобы можно было дополнить стандартное действие сохранения настроек пользователя. В своем действии сделать проверку, была ли снята галочка и в зависимости от этого обновлять базу подписчиков.
     
  4. Agel_Nash

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

    Регистрация:
    23.01.12
    Сообщения:
    16
    Симпатии:
    7
    Версия XF:
    1.1.2
    Импорт в сервис просиходит через API.
    А логика понятна. В функции actionContactDetailsSave добавить обработку значения $writer->set('receive_admin_email') и если 1, то делать импорт. Если 0, то удалять. Вот только не добавлять в код движка мои примеси, а вынести это в отдельный модуль.
    Это я сделал. Завис на следующем шаге. Т.е. создал в library папку Subscribe. А в ней ControllerPublic с файлом Account.php

    PHP:
    class Subscribe_ControllerPublic_Account extends XenForo_ControllerPublic_Account
    {
    public function 
    actionImport(){
    }
    public function 
    actionDelete(){
    }
    }
    и EventListner с файлом Account.php
    PHP:
    class Subscribe_EventListener_Account
    {
        public static function 
    listen($class, array &$extend)
        {
            if (
    $class == 'XenForo_ControllerPublic_Account')
            {
                
    $extend[] = 'Subscribe_ControllerPublic_Account';
            }
        }
    }
    Теперь непонятно как вызвать actionImport если receive_admin_email=1 или actionDelete если receive_admin_email=0.
     
  5. Pepelac

    Pepelac Продам луц в бутылках Команда форума

    Регистрация:
    28.09.10
    Сообщения:
    1.794
    Симпатии:
    1.349
    Ваш класс Subscribe_ControllerPublic_Account должен расширять не стандартный ксеновский класс, а виртуальный класс XFCP_Subscribe_ControllerPublic_Account.

    В своем классе нужно переопределять стандартные действия класса XenForo_ControllerPublic_Account. То есть, если там есть действие example, то нужно делать так:

    PHP:
    public function actionExample()
    {
        
    $result parent::actionExample(); // выполнение стандартного действия и получение результата
       
        
    ...
       
        return 
    $result;
    }
    А на месте многоточия должна быть проверка состояния поля, где хранится информация о подписке и последуещее действие с базой подписчиков.

    Это решение чревато тем, что нужно будет еще переопределять ксеновское действие при удалении пользователя. Чтобы от этого избавится, можно попробовать расширить соответствующий DataWriter и там уже переопределять события _postSave и _postDelete. Это уже на ваше усмотрение.
     
    Egorpom и Agel_Nash нравится это.
  6. Agel_Nash

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

    Регистрация:
    23.01.12
    Сообщения:
    16
    Симпатии:
    7
    Версия XF:
    1.1.2
    Pepelac, спасибо огромное. Буду пробовать. А идея с DataWriter действительно хорошая. Так и поступлю.
     

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