你好,
我正在 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。
谢谢, 托马斯
最佳答案
听起来您想要做的事情类似于一个名为 Content Blocks 的模块.
在该模块中,它们具有相同的情况,即循环 block 并为该 block 插入正确的模板。
模块的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 %>
关于php - 如何在 Silverstripe 中循环模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26982308/