Как зациклить шаблоны в silverstripe

Привет,

Я делаю одностраничный сайт в silverstripe, и я создал несколько шаблонов, которые будут представлять различные части моего сайта.

Сначала я попытался выполнить цикл с помощью ‘include’ так:

<% if SlugItems %>
<% loop SlugItems %>
<% include $slug %>
<% end_loop %>
<% end_if %>

Но из того, что я нашел на форумах, это не способ сделать это, и я получил ошибку с отсутствующим тегом цикла … Итак, я попытался создать функцию

public function IncludeTemplate($template) {
return $this->renderWith($template);
}

А также

<% if SlugItems %>
<% loop SlugItems %>
<% IncludeTemplate($Slug) %>
<% end_loop %>
<% end_if %>

Большой сюрприз … Это то же самое, потому что я прочитал, что оба включают и рендеринга с одинаковой работой.
Ну, я действительно не знаю хорошего решения, и я хотел бы реализовать что-то более сложное, чем включение какого-либо шаблона, если мое имя шаблона похоже на X, например.

<% if $ClassName = 'SomeClass' %>
<% include SomeClass %>
<% else_if $ClassName = 'SomeOtherClass' %>
<% include SomeOtherClass %>
<% else %>
<% include DefaultClass %>
<% end_if %>

Если вы знаете хорошее решение, напишите здесь! Это сделало бы мой день: D.

Спасибо,
Томас

2

Решение

То, что вы пытаетесь сделать, похоже на модуль под названием Блоки контента.

В этом модуле они имеют идентичную ситуацию, когда они перебирают блоки и вставляют правильный шаблон для этого блока.

Модуля Page.ss:

<% loop $ActiveBlocks %>$Me<% end_loop %>

$ActiveBlocks относится к функция на DataExtension с тем же именем.

Это все вещи, с которыми вы уже знакомы. Часть, о которой вы, возможно, не знаете так много, $Me значение в шаблоне. Он может использоваться для ссылки на текущий контекст объекта, с которым отображается шаблон, в вашем случае это было бы Slug,

Это только часть магии, другая часть является функцией Block DataObject вызываемого forTemplate. Это называется при использовании $Me выяснить, как визуализировать DataObject.

Здесь вы можете просто выполнить классический renderWith позвоните так:

return $this->renderWith(array($this->Template, 'Slug'));

С этим знанием вы могли бы достичь того, что вы после, имея Slug DataObject выглядит примерно так:

class Slug extends DataObject
{
static $db = array();

function getTemplate()
{
$template = 'yourTemplate';

//Do your template logic checks in here to work out what you want to display

return $template;
}

function forTemplate()
{
return $this->renderWith(array($this->Template, 'Slug'));
}
}

Ваш шаблон выглядит примерно так:

<% if $Slugs %>
<% loop $Slugs %>
$Me
<% end_loop %>
<% end_if %>
3

Другие решения

я сделал что-то подобное в моем одностраничный модуль

попробуйте что-нибудь подобное:

    /**
* renders the current page using the ClassName_onepage template,
* e.g. Page_onepage
*
* @return HTMLText
*/
public function getOnePageContent(){
$templateName = SSViewer::get_templates_by_class($this->owner->Classname, '_onepage', 'SiteTree')
?: 'Page_onepage';
return $this->renderWith($templateName);
}

И в вашем шаблоне:

    <% if SlugItems %>
<% loop SlugItems %>
$OnePageContent
<% end_loop %>
<% end_if %>

НТН,

WMK

2

Вы можете определить файл шаблона, скажем, Slug.ss, куда вы помещаете HTML-код, который хотите зациклить, и сохраняете его в themes / your-theme / templates / Includes.

Тогда вы можете просто зациклить его с этим кодом:

<% if SlugItems %>
<% loop SlugItems %>
<% include Slug %>
<% end_loop %>
<% end_if %>
0
По вопросам рекламы [email protected]