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

Получение ID только что созданной темы в actionAddThread

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

Загрузка
  1. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Вот столкнулся с такой проблемой. При создании темы вызывается метод actionAddThread в XenForo_ControllerPublic_Forum. При расширении класса в своем методе мы не сможем получить ID новой темы, кроме как через:
    Код:
        public function actionAddThread()
        {
            $response = parent::actionAddThread();
            $threadLink = $response->redirectTarget;
    ...
    
    Т.е. вытащить новый ID можно из линка. Но это работает не всегда, так как в родительском методе $response может давать линк не на thread, а на forum:
    Код:
            if (!$this->_getThreadModel()->canViewThread($thread, $forum))
            {
                $return = XenForo_Link::buildPublicLink('forums', $forum, array('posted' => 1));
            }
            else
            {
                $return = XenForo_Link::buildPublicLink('threads', $thread);
            }
    
    Т.е. зависит от прав пользователя - может ли он видеть свою же только что созданную тему.

    И как вытащить ID новой темы без переписывания полностью родительского метода?
     
  2. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    из линка вытаскивать - это перебор вообще-то.
    Кроме контроллера надо расширять и датарайтер, чтобы к примеру в реестре сохранять последний вызов
    $thread = $writer->getMergedData();
    а в контроллере дергать из реестра.
    Вместо реестра можно юзать переменную класса для кеша вызова - это как удобнее будет.
     
  3. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Да. К выводу о том, что нужно будет расширять DataWriter, я тоже пришел, так как других вариантов просто нет. А можно поподробнее о реализации? Я не понимаю, как расширить XenForo_DataWriter_Discussion_Thread, чтобы где-то сохранить новый ID :(
     
  4. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    расширяем getMergedData как-то так:
    PHP:
        public function getMergedData($tableName '')
        {
     
            
    $output=parent::getMergedData($tableName);
            
    XenForo_Application::set('last_thread'$output);
            return 
    $output;
        }
    а в контроллере после вызова parent-а в любом месте:
    PHP:
            $new_thread=XenForo_Application::get('last_thread');
    P.S. Использовать set get - самый простой вариант в плане количества кода, но не самый лучший по архитектуре, т.е. злоупотреблять реестром не стоит.
     
    infis нравится это.
  5. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Спасибо! В принципе эта операция не частая, поэтому не критично.
     

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