【发布时间】:2014-11-19 15:04:47
【问题描述】:
早上好,
我一直在与 Silverstripe 作斗争,它正在对嵌套循环和循环内的函数进行模板解析一段时间,这变得令人抓狂。
如果我能得到除 ajax 之外的替代解决方案(它必须是纯 php/html/ss),那将是可以接受的,谢谢。
[情况]
我有 2 个数据对象:ObjectA [has_many ObjectB] 和 ObjectB [has_one ObjectA]。
我已经使用 CSS-Bootstrap 实现了一个选项卡窗格,并希望在各自的选项卡中显示这两个链接的对象。
示例:
ObjectA_Car 映射到 [ObjectB_Process1, ObjectB_Process2]
ObjectA_Plane 映射到 [ObjectB_Process3, ObjectB_Process4]
场景 1:
请参阅下面的示例伪代码:
///>sample.ss snippet
<% loop ObjectA_DataList %>
<div class="tab-pane">
<h3>$ObjectA_DataList.Title</h3> <!-- Prints ObjectA Title -->
<hr />
<h4>$ObjectA_DataList.Description</h4> <!-- Prints ObjectA Description -->
DEBUG: $Pos <!-- Prints ObjectA loop count/index -->
<!-- PROBLEM STARTS HERE -->
<% loop ObjectB_DataList %>
DEBUG: ObjectA Count: $Top.Pos <!-- Always prints 1, regardless -->
DEBUG: ObjectA Count2: $Up.Pos <!-- Same issue as above -->
DEBUG: $Pos <!-- due to scope, this now prints ObjectB loop count/index -->
<% end_loop %>
</div> <!--//#tab-pane-->
<% end_loop %>
我在上面示例中的目的是尝试将 ObjectB 循环内的 ObjectA $Pos 与属于 ObjectB 的 ID 进行匹配。不工作,因为我无法在 ObjectB 中获取 ObjectA 当前循环 $Pos。
场景 2:
接下来我尝试使用一个函数。
///>sample extension code
public function testfn(){
return "<pre>testfn called!</pre>";
}//testfn
///>sample.ss
$testfn <!-- WORKS OUTSIDE OF LOOP -->
<% loop ObjectA_DataList %>
$testfn <!-- DOES NOT WORK! -->
<% end_loop %>
场景 3
我厌倦了试图让上述场景发挥作用,然后尝试使用控制器。
因此,我决定将一个 ArrayList 传递给模板,并使用一个循环对其进行迭代。
但是,我似乎无法获得价值。见下文:
///>sample_controller.php
public function sample(SS_HTTPRequest $request){
///... snippet ...
$buildArr = array();
foreach($ObjectA as $objA){
$buildArr[$objA->ID]['objA'] = $objA; //store ObjectA
$objB = ObjectB::get()->filter(array('Status'=>'Enabled','ObjectA_ID'=>$objA->ID));
$buildArr[$objA->ID]['objB'] = $objB; //store ObjectB
}//foreach loop
$sample_data = new ArrayList($buildArr);
//if I do a var_dump here, everything looks great.
//so nothing seems to be the problem with the $sample_data array
$data = array('mysample' => $sample_data);
return $this->customise($data)->renderWith(array('sample', 'Page'));
}//sample
///>sample.ss
<% loop mysample %>
<!-- I don't know how to get the data out -->
<!-- I've tried $Title, $mysample.Title, $mysample.ObjectA.Title -->
<!-- nothing seems to work. -->
<% end_loop %>
非常感谢您提供的任何帮助,谢谢。
【问题讨论】:
标签: function loops controller nested silverstripe