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

Использование расширенного класса вне XenForo

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

Загрузка
  1. SAS1024

    SAS1024 Местный

    Регистрация:
    23.04.15
    Сообщения:
    85
    Симпатии:
    87
    Версия XF:
    1.4.10
    Приветствую.

    У меня следующая ситуация:
    Я создал для форума дополнение, которое конвертирует размещаемые ссылки в нужный мне вид.

    Класс объявлен следующим образом:
    Код:
    class OldGamesIntegration_Extend_BBCode_Formatter_Base extends XFCP_OldGamesIntegration_Extend_BBCode_Formatter_Base
    В листенере класс расширен как надо:
    PHP:
            /**
             * Конвертируем URL в названия игр
             * @param $class
             * @param $extend
             */
            
    public static function convertLinks$class, &$extend ) {

                if (
    $class == 'XenForo_BbCode_Formatter_Base') {
                    
    $extend[] = 'OldGamesIntegration_Extend_BBCode_Formatter_Base';
                }
            }
    И в принципе, всё работает как надо. Но только на форуме.

    При попытке использовать расширенный парсер ббкодов где-то извне (конкретно у меня - на сайте, который имеет общую авторизацию с форумом) я получаю ошибку
    Код:
    Fatal Error: Uncaught exception 'XenForo_Exception' with message 'Cannot load class using XFCP. Load the class using the correct loader first.'
    Может быть кто-нибудь подскажет - каким образом мне можно подключить расширенный класс где-то вне форума?
     
  2. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Чтобюы все работало:
    во первых должен быть подключен автолоадер (но судя по ошибке он уже подключен)
    во вторых создавать ббкод класс надо как-то так (пример из XenForo_Helper_String):
    PHP:
    $formatter XenForo_BbCode_Formatter_Base::create('XenForo_BbCode_Formatter_BbCode_Strip'false);
    $formatter->setMaxQuoteDepth($allowedDepth);
    $formatter->setCensoring($censorResults);

    $parser XenForo_BbCode_Parser::create($formatter);
    return 
    $parser->render($string);
    Надо понимать что форматтер он только обработки конкретного ббкода, рендер вызывает класс парсера и сам рендер может сильно зависить от того есть или нет view класс у него в парметрах.
    Одним словом советую посмотреть по коду ксена поискать XenForo_BbCode_Formatter_Base::create и посмотреть как оно используется
     
  3. SAS1024

    SAS1024 Местный

    Регистрация:
    23.04.15
    Сообщения:
    85
    Симпатии:
    87
    Версия XF:
    1.4.10
    Yoskaldyr, ну я как-то так и вызываю, только глубину цитат и цензор не выставляю.
    PHP:
            /**
             * BBCode -> HTML converter
             * @param string $text
             * @param bool   $disableSmilies
             * @return string
             */

            
    public static function ParseBBCode$text$disableSmilies false ) {
                
    $options = [ ];
                if ( 
    $disableSmilies ) {
                    
    $options['smilies'] = [ ];
                }

                
    $formatter XenForo_BbCode_Formatter_Base::create''$options );
                
    $parser    = new XenForo_BbCode_Parser$formatter );
                return 
    $parser->render$text );
            }
    Насколько я понял, проблема в том, что у меня класс расширяется только на форуме - с помощью Listener'а.
    Хотя я могу и ошибаться конечно.
     
  4. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    понятно чтобы все это работало должно быть проинициализированно приложение:
    PHP:
    require($fileDir '/library/XenForo/Autoloader.php');
    XenForo_Autoloader::getInstance()->setupAutoloader($fileDir '/library');
    XenForo_Application::initialize($fileDir '/library'$fileDir);
    XenForo_Application::set('page_start_time'$startTime);
    $dependencies = new XenForo_Dependencies_Public();
    $dependencies->preLoadData();
    Дальше любое динамическое наследование и все настройки будут работать в любом стороннем скрипте
     
    Mirovinger и SAS1024 нравится это.
  5. SAS1024

    SAS1024 Местный

    Регистрация:
    23.04.15
    Сообщения:
    85
    Симпатии:
    87
    Версия XF:
    1.4.10
    Ооо, спасибо большое, это именно то, что надо!
     
  6. DenisZZ

    DenisZZ Местный

    Регистрация:
    16.07.15
    Сообщения:
    4
    Симпатии:
    0
    Версия XF:
    1.4.8
    Здравствуйте всем!
    А как то же самое сделать на XenForo v2.1.1 ?
     

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