2013-08-21 44 views
3

我正在使用silverstripe模板,并且想循环浏览当前页面的子页面,并根据子页面的类型动态地在“包含”控件中输入模板名称。Silverstripe - 是否可以在include语句中使用变量?

这里是我的代码至今:

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

(我在我的模板SS文件/包括涉及到的$ className变量目录)

这是我得到的错误:

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

我发现这篇文章从silverstripe论坛,让我觉得它应该工作: http://www.silverstripe.org/archive/show/1023

它实际上是可能有在包括控制变量?

+0

我不知道Silverstripe但你绝对可以使用一个变量作为一个包含在PHP中。包括虽然通常与'''。 – legrandviking

+0

Silverstripe使用自己的模板系统,这实际上是不使用php的模板(.ss文件),我也尝试在{}中放置$ ClassName变量,但是这给了我相同的错误 –

回答

1

做了一些测试,不能得到<% include $ClassName %>的工作。但你可以用类似的东西解决它:

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

不是很漂亮,但做的工作。

+0

这就是我正在解决的问题目前的问题是,我希望能够使它更具动态性,所以如果我们希望将来再添加一个页面类型,我们就不需要改变这个代码来解决它。这绝对是解决它的一种方法,谢谢! –

6

您可以在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> 
+0

我很确定renderWith()是在页面加载时调用的,而我正在使用jquery加载子内容。因为这是一个很好的解决方案,如果我没有隐藏/使用jQuery显示内容 –

+0

如果您使用jQuery加载子内容,那么我假设您通过AJAX加载内容?如果是这样,那么返回JSON/HTML/etc的控制器方法可以对子对象类型进行此测试,并返回相应的输出。 –

3

你可以直接从模板调用renderWith,如:

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