Использование переменной в xen:include template

grisha2217

Проверенные
Сообщения
913
Решения
6
Реакции
1,389
Баллы
5,715
Недавно сам лично столкнулся с вопросом, как заинклюдить шаблон, название которого хранится в переменной
Вопрос на оф форуме

Если вы разбираетесь в синтаксисе шаблонов в движке, возможно, вы попробовали задать название переменной через xen:set var
HTML:
<xen:set var="$templateVar">mytemplate</xen>
<xen:include template="$templateVar" />

Такой код не будет работать, так как сначала инклюдятся шаблоны в шаблоне, а потом уже задаются переменные, то есть конструкция xen:include template выполнится раньше, чем xen:set var

Попробую объяснить, в каких случаях вы захотите использовать переменную в названии шаблонов: например, вы хотите показать определенный блок (шаблон) в определенном разделе:
Раздел id 1 -> Блок 1
Раздел id 3 -> Блок 3
Раздел id 19 -> Блок 19

Приступим к решению. Буду использовать код с рабочего проекта.
Во-первых, надо найти ViewPublic, отвечающий за отображение страницы с определенный шаблоном. Например, для шаблона forum_view это XenForo_ViewPublic_Forum_View.
В моём коде, в зависимости от категории я хочу показать определенный шаблон:
PHP:
class Market_ViewPublic_Index extends XenForo_ViewPublic_Base
{
    public function renderHtml()
    {
        if ($this->_params['filter']['category_id']) // проверяем, есть ли вообще нужная переменная
        {
            $templateName = 'market_search_bar_platform_' . $this->_params['filter']['category_id'];
            $categorySearchBar = $this->createTemplateObject($templateName, $this->_params)->render(); // создаем и рендерим нужный шаблон
            $this->_params['categorySearchBar'] = $categorySearchBar; // добавляем в параметры (ака ViewParams в любом контроллере)
        }
    }
}

Простыми словами:
1. Первое, что мы делаем, проверяем наличие нужной переменной (это не обязательно, если уверены, что переменная всегда существует)
2. Создаем объект шаблона и рендерим его
3. В параметры вставляем наш готовый код с шаблона

Замечание:
В созданном шаблоне нельзя использовать переменные, которые были определены в родительском шаблоне через xen:set var (зато можно использовать параметры, которые вы передали в функцию createTemplateObject.

Далее в шаблоне уже можно использовать {xen:raw $categorySearchBar}
 
Последнее редактирование:
.<xen:hook name="my_case_template" />
PHP:
<?php

class BS_MyCaseTemplate_Listener
{
    public static function hook($hookName, &$contents, array $hookParams, XenForo_Template_Abstract $template)
    {
        if ($hookName === 'my_case_template')
        {
            $params = $template->getParams();

            $templateName = sprintf('my_case_template_%s', $params['category']['category_id']);

            $contents .= $template->create($templateName, $params);
        }
    }
}
 
Последнее редактирование модератором:
BINGO_SHARK, я считаю, хуки - вещь не производительная, вешается обработчик и он выполняется на каждой странице... В настройках обработчика есть поле "подсказка" - когда будет выполнен обработчик, что там писать - не знаю...
Насчёт твоего решения.... Может, лучше расширить ViewPublic и переопределить метод? Или разницы нет?)
 
Их не рекомендованно использовать. Хуки были устаревшими и в 2.х уже не поддерживаются и специально удалены были. Есть tms.
 
А и по производительности хуже. Вообще в 1.x можно задрочиться с условиями, но в 2.x можно точно придумать как это сделать, так как там более гибкая и удобная система.
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу