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

1.4.x Отображение изображений из вложений вне XenForo

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

Загрузка
  1. SAS1024

    SAS1024 Активный пользователь

    Регистрация:
    23.04.15
    Сообщения:
    83
    Симпатии:
    83
    Версия XF:
    1.4.10
    Небольшая предыстория:
    Я хочу выводить содержимое первого сообщения выбранной темы где-то вне XenForo. Но при выводе (использую парсинг ббкодов, который написан здесь) у меня выводятся кривые ссылки на вложение.
    Например:
    http://xf.localhost/article/attachments/24414/
    А должна быть:
    http://xf.localhost/forum/attachments/190101554d59cec43f7-png.24414/

    Если я с помощью str_replace'а быдлокодю и заменяю /article/ на /forum/, то изображение тоже не отображается.

    Скажите, а решал ли кто-нибудь такую проблему?
     
  2. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1.919
    Симпатии:
    1.153
    Версия XF:
    1.0.4
    Из-за того что не используется вью класс при работе с ббкодами, отрабатывает упрошенное отображение (в классе ббкода можно глянуть ), поэтому ссылка на вложение получается без имени а только с цифровым Id. Но это не страшно скачиваться и так будет.

    Основная проблема в общей генерации ссылки. Т.е. большинство ссылок будут генерироваться не правильно (не только ббкоды). По умолчанию ксен генерирует только относительные ссылки, пока генератору ссылки не скажут обратное (префикс "full:" перед ссылкой).
    Смотреть надо XenForo_Link::buildPublicLink и XenForo_Link::_checkForFullLink
    И в _checkForFullLink видно
    что идет проверка basepath из:
    PHP:
           $paths XenForo_Application::get('requestPaths');
           
    $fullLinkPrefix $paths['fullBasePath'];
    А 'requestPaths' xenforo генерирует исходя из текущей папки запуска скрипта.
    Т.е. надо сразу после инициализации приложения посмотреть что в 'requestPaths' исправить на нужные значения и сделать XenForo_Application::set
    --- добавлено : Jun 17, 2015 7:41 AM ---
    @SAS1024 И еще - по умолчанию изображение не будет отображаться надо или ссылку конвертировать во вложение после ббкод рендера или расширять XenForo_BbCode_Formatter_Base::renderTagAttach
    Да и вообще работу рендера можно глянуть в XenForo_BbCode_Formatter_Base::renderTagAttach
     
    Последнее редактирование модератором: 25 июн 2015
    SAS1024 нравится это.
  3. SAS1024

    SAS1024 Активный пользователь

    Регистрация:
    23.04.15
    Сообщения:
    83
    Симпатии:
    83
    Версия XF:
    1.4.10
    Yoskaldyr, спасибо, с fullBasePath разобрался. Теперь пути к вложениям генерятся нормально. Что самое интересное - пути к смайликам все-равно остаются относительными.

    Еще посмотрел XenForo_BbCode_Formatter_Base::renderTagAttach. Получается что он, если вьюхи не указано, просто делает ссылку и всё. Это печально.

    https://xenforo.com/community/threads/parsing-bbcode-on-external-page-attachments-problem.77994/
    Вот здесь человек столкнулся с похожей проблемой, но мой уровень английского не позволяет мне понять что ему посоветовали :(
     
  4. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1.919
    Симпатии:
    1.153
    Версия XF:
    1.0.4
    @SAS1024 Ну там посоветовали делать 1 в 1 как в контроллере Thread actionIndex и во вьюхе Thread renderHtml
    Но это реально муторно - для отображения надо получить все вложения и их передавать в ббкод парсер (необходимо если нужно получить миниатюру)
    Если на стороннем скрипте нужно отображение всегда полного размера и не нужна никакая проверка прав, то проще расширить XenForo_BbCode_Formatter_Base::renderTagAttach и передавать какой-либо extraStates в рендер:
    Например, передаем в рендер extraStates ('myRender' => true)
    PHP:
    $formatter XenForo_BbCode_Formatter_Base::create'Base'$options );
    $parser = new XenForo_BbCode_Parser$formatter );
    return 
    $parser->render$text, array('myRender' => true));
    потом в расширенном методе
    PHP:
    public function renderTagAttach(array $tag, array $rendererStates)
    {
        if (!empty(
    $rendererStates['myRender']))
        {
            
    $id intval($this->stringifyTree($tag['children']));
            if (!
    $id)
            {
                return 
    '';
            }
            return 
    '<img alt="'.$id.'" src="' XenForo_Link::buildPublicLink('full:attachments', array('attachment_id' => $id)) . '"/>';
        }
        return 
    parent::renderTagAttach($tag$rendererStates);
    }
     
    Mirovinger и SAS1024 нравится это.
  5. SAS1024

    SAS1024 Активный пользователь

    Регистрация:
    23.04.15
    Сообщения:
    83
    Симпатии:
    83
    Версия XF:
    1.4.10
    Yoskaldyr, очень благодарю за помощь, всё получилось :)
     
    Yoskaldyr нравится это.

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