【问题标题】:Silverstripe - Is it possible to use a variable in an include statement?Silverstripe - 是否可以在包含语句中使用变量?
【发布时间】:2013-08-24 01:33:57
【问题描述】:

我正在使用 silverstripe 模板,我想遍历当前页面的子页面,并根据该子页面的类型在“包含”控件中动态输入模板名称。

这是我目前的代码:

    <div id="tertiary-content">                   
        <% if $Children %>
            <% loop $Children %>
                <% include $ClassName %>
            <% end_loop %>
        <% end_if %>
    </div>

(我的模板/包含目录中有与 $ClassName 变量相关的 ss 文件)

这是我得到的错误:

错误是:遇到未知的开放块“循环”。也许您错过了结束标签或拼写错误?

我从一个 silverstripe 论坛中找到了这篇文章,这让我认为它应该可以工作: http://www.silverstripe.org/archive/show/1023

真的可以在包含控件中有一个变量吗?

【问题讨论】:

  • 我不知道 Silverstripe 但你绝对可以在 php 中使用变量作为包含。包含通常是withing ''。
  • Silverstripe 使用自己的模板系统,这实际上是不使用 php 的模板(.ss 文件),我也尝试将 $ClassName 变量放入 {} 但这给了我同样的错误

标签: templates variables include silverstripe


【解决方案1】:

您可以直接从模板中调用renderWith,例如:

<div id="tertiary-content">                   
    <% if $Children %>
        <% loop $Children %>
            $renderWith($ClassName)
        <% end_loop %>
    <% end_if %>
</div>

【讨论】:

    【解决方案2】:

    您可以在 Page 类中编写一个函数,该函数根据当前类名加载一个 ss 模板。在您的 Page.php 文件中。

    class Page extends SiteTree {
    
    /**
     * Returns a template based on the current ClassName
     * @return {mixed} template to be rendered
     **/
    public function getIncludeTemplate(){
        return $this->renderWith($this->ClassName);
    }
    
    }
    

    然后在你的模板中

    <div id="tertiary-content">                   
        <% if $Children %>
            <% loop $Children %>
                $IncludeTemplate
            <% end_loop %>
        <% end_if %>
    </div>
    

    【讨论】:

    • 我很确定在加载页面时会调用 renderWith() 并且我正在使用 jquery 加载子内容。标记是因为如果我不使用 jquery 隐藏/显示内容,这是一个很好的解决方案
    • 如果您使用 jQuery 加载子内容,那么我假设您是通过 AJAX 加载内容?如果是这样,那么返回 JSON/HTML/etc 的控制器方法可以对子对象类型进行此测试,并返回适当的输出。
    【解决方案3】:

    做了一些测试,无法让&lt;% include $ClassName %&gt; 工作。但是您可以通过以下方式解决它:

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

    没有那么漂亮,但可以。

    【讨论】:

    • 这就是我目前解决问题的方式,我希望让它更加动态,所以如果我们将来想添加另一种页面类型,我们就不必更改此代码来考虑为了它。这绝对是解决问题的一种方法,谢谢!
    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2015-06-09
    • 2021-07-28
    • 2020-08-03
    • 2019-11-14
    相关资源
    最近更新 更多