Как получить части шаблона Smarty с помощью fetch ()

Фон Smarty - это механизм создания шаблонов, который отделяет уровень представления от логического уровня веб-приложений. Он хорошо подходит для подхода модель-представление-управление к разработке веб-приложений. Представление может быть представлено шаблонами Smarty, которые содержат только теги HTML и Smarty. Элемент управления может быть реализован с помощью файлов PHP, которые обслуживают соответствующие представления на основе логики, содержащейся в них, через код PHP. Представление создается путем отображения шаблонов с помощью команды display(). В качестве альтернативы шаблон можно прочитать как переменную, не отображая его с помощью команды fetch(). Имя файла шаблона является аргументом обеих этих команд.

Проблема. Команда fetch() может прочитать весь шаблон. Чтобы читать части / части шаблона, каждая из этих частей обычно должна храниться в отдельном файле с собственным именем, которое может быть аргументом команды. Это создает ненужные файлы.

Вопрос Можно ли получить только части шаблона Smarty, помечая как-то разделы шаблона?

Пример случая Ниже я представляю образец файла шаблона с тегами Smarty и HTML, а также соответствующий файл контроллера с кодом PHP.

Файл шаблона (index.tpl)

<html>
<body>
    <div id="sec1">
        First section
    </div>
    <div id="sec2">
        Second section
    </div>
</body>
</html>

Файл контроллера (index.php)

<?php
    $smarty = new Smarty;
    $template = $smarty->fetch("index.tpl");
?>

В приведенном выше примере переменная $template будет содержать полный вывод со страницы шаблона. Ниже дамп его содержимого из примера.

$template => string(255)
"<html><body>
<div id="sec1">First section</div>
<div id="sec2">Second section</div>
</body></html>"

Однако предположим, что я хочу читать код из каждого из контейнеров DIV отдельно и сохранять их в отдельных переменных, как я могу этого добиться? Например, предположим, что у меня есть волшебная функция под названием fetch_sub(). Вот мои ожидания от его использования.

<?php
    $smarty = new Smarty;
    $div1 = $smarty->fetch_sub("index.tpl", "sec1");
    $div2 = $smarty->fetch_sub("index.tpl", "sec2");
?>

Тогда $div1 и т. Д. Будет содержать только соответствующую часть, а не весь шаблон.

Другая информация Я не новичок в Smarty и довольно хорошо разбираюсь в основных концепциях, а также в некоторых продвинутых концепциях Smarty. Ниже приведены мои попытки концептуализировать проблему и найти решение. Моя первоначальная приблизительная идея - разделить шаблон на разделы с помощью {capture}, а затем каким-либо ссылаться на каждый из этих разделов. Я представляю схематический пример идеи ниже.

    {capture name=sec1}
    <div id="sec1">
        First section
    </div>
    {/capture}
    . . .

person Hamman Samuel    schedule 09.08.2012    source источник


Ответы (2)


Smarty (начиная с Smarty 3.1) не имеет встроенной функции, которая позволила бы вам достичь своей цели. Я предлагал нечто подобное в 2011 году, но мы так и не подошли к его реализации.

Может быть, вы можете проанализировать сгенерированный HTML-код в DOM и помочь себе с xpath или чем-то в этом роде?

person rodneyrehm    schedule 10.08.2012

Вы можете попробовать это:

sec1.tpl

<div id="sec1">First section</div>

sec2.tpl

<div id="sec2">Second section</div>

index.tpl

<html><body>
{include file="sec1.tpl"}
{include file="sec2.tpl"}
</body></html>

А затем вы можете получить детали, вызвав:

 $smarty = new Smarty;
$div1 = $smarty->fetch("sec1.tpl");
$div2 = $smarty->fetch("sec2.tpl");
person Michal Przybylowicz    schedule 25.05.2015