如何在silverstripe中循环模板

时间:2014-11-17 21:29:00

标签: php content-management-system 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 %>

大惊喜......它是一样的,因为我读到include和renderWith做同样的工作。 好吧,我真的不知道一个好的解决方案,如果我的模板名称像X一样,我想实现比包含一些模板更精细的东西,例如。

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

如果你知道一个好的解决方案,请在这里写一下!这将成为我的一天:D。

谢谢, 托马斯

3 个答案:

答案 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)

我在onepage module

中做了类似的事情

尝试类似的事情:

    /**
    * 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 %>