你好,
我在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 %>
大惊喜......它是一样的,因为我读到include和renderWith做同样的工作。 好吧,我真的不知道一个好的解决方案,如果我的模板名称像X一样,我想实现比包含一些模板更精细的东西,例如。
<% if $ClassName = 'SomeClass' %>
<% include SomeClass %>
<% else_if $ClassName = 'SomeOtherClass' %>
<% include SomeOtherClass %>
<% else %>
<% include DefaultClass %>
<% end_if %>
如果你知道一个好的解决方案,请在这里写一下!这将成为我的一天:D。
谢谢, 托马斯
答案 0 :(得分:3)
您尝试做的事情类似于名为Content Blocks的模块。
在该模块中,它们具有相同的情况,它们循环遍历块并为该块插入正确的模板。
模块的Page.ss
:
<% loop $ActiveBlocks %>$Me<% end_loop %>
$ActiveBlocks
指的是function on a DataExtension by the same name。
这是你已经熟悉的所有东西。您可能不太了解的部分是模板中的$Me
值。 It can be used to refer to the current object context the template is rendered with,在您的情况下是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 %>
答案 1 :(得分:2)
尝试类似的事情:
/**
* 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 %>
HTH,
WMK
答案 2 :(得分:0)
您可以定义一个模板文件,比如Slug.ss,您可以在其中放置要循环的HTML,并将其保存到themes / your-theme / templates / Includes中。
然后你可以用这段代码循环它:
<% if SlugItems %>
<% loop SlugItems %>
<% include Slug %>
<% end_loop %>
<% end_if %>