Привет,
Я делаю одностраничный сайт в 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.
Спасибо,
Томас
То, что вы пытаетесь сделать, похоже на модуль под названием Блоки контента.
В этом модуле они имеют идентичную ситуацию, когда они перебирают блоки и вставляют правильный шаблон для этого блока.
Модуля 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 %>
я сделал что-то подобное в моем одностраничный модуль
попробуйте что-нибудь подобное:
/**
* 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
Вы можете определить файл шаблона, скажем, Slug.ss, куда вы помещаете HTML-код, который хотите зациклить, и сохраняете его в themes / your-theme / templates / Includes.
Тогда вы можете просто зациклить его с этим кодом:
<% if SlugItems %>
<% loop SlugItems %>
<% include Slug %>
<% end_loop %>
<% end_if %>