gpt4 book ai didi

php - 如何在 Silverstripe 中循环模板

转载 作者:行者123 更新时间:2023-12-01 20:21:14 25 4
gpt4 key购买 nike

你好

我正在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com