Доброе утро,
Я боролся с Silverstripe, и это синтаксический анализ шаблонов в отношении вложенных циклов и функций внутри циклов уже некоторое время, что это становится безумием.
Если я смогу получить альтернативное решение помимо ajax (это должен быть чистый php/html/ss), это будет приемлемо, спасибо.
[Situation]
I have 2 Data Objects: ObjectA [has_many ObjectB], and ObjectB [has_one ObjectA].
I've implemented a tab-pane using CSS-Bootstrap, and would like to display these two objects linked in their respective tabs.
Example:
ObjectA_Car is mapped to [ObjectB_Process1, ObjectB_Process2]
ObjectA_Plane is mapped to [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 %>
Моя цель в приведенном выше примере заключалась в том, что я пытался сопоставить ObjectA $Pos внутри цикла ObjectB с идентификатором, принадлежащим ObjectB. Не работает, потому что я не могу получить текущий цикл ObjectA $Pos, находясь внутри ObjectB.
Сценарий 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 %>
Любая оказанная помощь очень ценится, спасибо.