Function Silverstripe 3模板循环函数和嵌套循环

Function Silverstripe 3模板循环函数和嵌套循环,function,loops,controller,nested,silverstripe,Function,Loops,Controller,Nested,Silverstripe,早上好 我一直在努力解决Silverstripe问题,一段时间以来,它一直在对嵌套循环和循环中的函数进行模板解析,这让人抓狂 如果我能得到除ajax之外的替代解决方案(它必须是纯php/html/ss),那将是可以接受的,谢谢 [情况] 我有两个数据对象:ObjectA[有多个ObjectB]和ObjectB[有一个ObjectA]。 我已经使用CSS引导实现了一个选项卡窗格,并希望在各自的选项卡中显示链接的这两个对象。 示例: ObjectA\u Car映射到[ObjectB\u Proces

早上好

我一直在努力解决Silverstripe问题,一段时间以来,它一直在对嵌套循环和循环中的函数进行模板解析,这让人抓狂

如果我能得到除ajax之外的替代解决方案(它必须是纯php/html/ss),那将是可以接受的,谢谢

[情况]
我有两个数据对象:ObjectA[有多个ObjectB]和ObjectB[有一个ObjectA]。
我已经使用CSS引导实现了一个选项卡窗格,并希望在各自的选项卡中显示链接的这两个对象。 示例:
ObjectA\u Car映射到[ObjectB\u Process1,ObjectB\u Process2]
ObjectA_平面映射到[ObjectB_进程3,ObjectB_进程4]

场景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 %>   
///>sample extension code
public function testfn(){
    return "<pre>testfn called!</pre>";
}//testfn

///>sample.ss
$testfn <!-- WORKS OUTSIDE OF LOOP -->
<% loop ObjectA_DataList %>
    $Top.testfn <!-- SHOULD WORK LIKE THIS -->
<% end_loop %>
//>sample.ss片段
$ObjectA_DataList.Title

$ObjectA_DataList.Description 调试:$Pos 调试:ObjectA计数:$Top.Pos 调试:ObjectA Count2:$Up.Pos 调试:$Pos
在上面的示例中,我的目的是尝试将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 %>
///>sample_controller.php
public function sample(SS_HTTPRequest $request){
    // get ObjectA
    $ObjectA = ObjectA::get();

    // run through all ObjectA and add the
    // information from ObjectB to a list of both
    $data = new ArrayList();
    foreach($ObjectA as $objA){
        $objB = ObjectB::get()->filter(array(
            'Status' => 'Enabled',
            'ObjectA_ID' => $objA->ID
        ));
        $data->add(array(
            'ObjA' => $objA,
            'ObjB' => $objB
        ));
    }//foreach loop

    return $this->customise(array('mysample' => $data))
        ->renderWith(array('sample', 'Page'));
}//sample

///>sample.ss
<% loop $mysample %>
    <!-- for a single DataObject -->
    <p>ObjA: $ObjA.ID</p>

    <!-- for a DataList -->
    <% loop $ObjB %>
        <p>ObjB: $ID</p>
    <% end_loop %>
<% end_loop %>
//>示例扩展代码
公共函数testfn(){
返回“testfn called!”;
}//测试fn
///>sample.ss
$testfn
$testfn
情景3
我厌倦了让上述场景正常工作,然后尝试使用控制器。
因此,我决定将ArrayList传递给模板,并使用一个循环对其进行迭代。
但是,我似乎无法说出这些值。见下文:

///>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 %>   
///>sample extension code
public function testfn(){
    return "<pre>testfn called!</pre>";
}//testfn

///>sample.ss
$testfn <!-- WORKS OUTSIDE OF LOOP -->
<% loop ObjectA_DataList %>
    $Top.testfn <!-- SHOULD WORK LIKE THIS -->
<% end_loop %>
//>sample\u controller.php
公共函数示例(SS_HTTPRequest$请求){
///…片段。。。
$buildArr=array();
foreach($ObjectA作为$objA){
$buildArr[$objA->ID]['objA']=$objA;//存储对象A
$objB=ObjectB::get()->过滤器(数组('Status'=>'Enabled','ObjectA_ID'=>$objA->ID));
$buildArr[$objA->ID]['objB']=$objB;//存储对象B
}//foreach循环
$sample_data=newarraylist($buildArr);
//如果我在这里倒垃圾,一切看起来都很好。
//因此,$sample_数据数组似乎没有什么问题
$data=array('mysample'=>$sample\u data);
返回$this->customize($data)->renderWith(数组('sample','Page');
}//样品
///>sample.ss
非常感谢您提供的任何帮助。

早上好

我可以使用场景2和场景3帮助您找到解决方案。对于第一个循环,我不知道如何正确处理第一个循环的范围

场景2

这个很简单。您只需参考一般范围顶部:

//>示例扩展代码
公共函数testfn(){
返回“testfn called!”;
}//测试fn
///>sample.ss
$testfn
$Top.testfn
场景3

我在这里调整了第三个场景以完成任务:

//>sample\u controller.php
公共函数示例(SS_HTTPRequest$请求){
//反对
$ObjectA=ObjectA::get();
//运行所有ObjectA并添加
//从ObjectB到这两者列表的信息
$data=newarraylist();
foreach($ObjectA作为$objA){
$objB=ObjectB::get()->过滤器(数组(
“状态”=>“已启用”,
'ObjectA_ID'=>$objA->ID
));
$data->添加(数组)(
“ObjA”=>$ObjA,
“ObjB”=>$ObjB
));
}//foreach循环
返回$this->customize(数组('mysample'=>$data))
->renderWith(数组('sample','Page'));
}//样品
///>sample.ss
ObjA:$ObjA.ID

ObjB:$ID

这种方法应该与单个数据对象以及数据列表(类似于ArrayList)一起使用。根据添加到控件内ArrayList的数据,需要调整SS文件

如果您还有其他问题,请告诉我


免责声明:未经测试且无任何保修,仍应有效

我通常会将钱连同利息一起退还。这可能就是为什么我的错误答案总是很受欢迎的原因。但是考虑到场景2和场景3,我必须同意@spekulatius。我对场景1也很感兴趣,因为我遇到了同样的问题。也许有人可以对从控制器返回的模板部分做些什么,这样你们就可以将模板与普通代码混合使用了?@spekulatius:非常感谢。两种解决方案都有效。在场景3中,您刚开始时输入了一个小错误,即$ObjectA。它应该是$ObjectA=ObjectA::get(),您犯了一个错误,将B分配给了a,而且ArrayList的构造函数需要一个数组参数。所以,new ArrayList()应该是new ArrayList(array());非常感谢一个优秀的解决方案。关于“jberculo”评论的后半部分:“也许可以使用从控制器返回的模板部分做些什么,这样您就可以将模板与普通代码混合使用了?”。我赞成。这会有很大帮助。我修复了ObjectB::get()。关于ArrayList。它可以使用数组调用,也可以不使用数组调用。“_构造(数组$items=array()){”如果未提供任何参数,则将空数组设置为默认值。对于场景#1,我仍在考虑解决方案。如果我提出,我将添加它。任何包装在HTMLCode对象中的返回都将打印出来。这通常通过使用forTemplate函数来完成。您可以在下面找到更多信息:如果您对此有疑问,请提出一个问题另一个问题:)