Silverstripe Grouped List DataObjects - 从模板

时间:2017-02-14 04:09:51

标签: templates variables grouping silverstripe has-one

我努力在模板中获取变量,该模板包含与另一个DataObject具有has_one关系的DataObjects的GroupedList。

实施例: 我有DataObject团队属于一个区域。当我得到团队的GroupedList,按RegionID分组时,我无法弄清楚如何访问模板中的Region.NAME。

class Region extends DataObject {
private static $db = array (
    'NAME'    =>  'Varchar(128)',
    'INFO'    =>  'Varchar(128)',
    'PUBLIC'  =>  'Boolean'
);

public static $has_many = array(
    'Teams' => 'Team'
 );
}

class Team extends DataObject {
private static $db = array (
    'NAME'   => 'Varchar(255)',
    'LEAGUE' => 'Varchar(255)',
    'SORTNO' => 'Int'
);

 public static $has_one = array(
    'Region' => 'Region'
 );
}

class TeamRegionPage extends Page {
public function getRegionGroupedTeams(){
    return GroupedList::create(Team::get()->filter(array('PUBLIC' => 1))->sort('RegionID, SORTNO'));
}
}

TeamRegionPage.ss

<% loop $getRegionGroupedTeams.GroupedBy(RegionID) %>
<h2>Region name from has_one here: {$Region.NAME}</h2>

<% loop $Children %>
    $NAME<br>
<% end_loop %>

$ Region.NAME在模板中不起作用,我尝试了其他一些东西。我觉得解决方案很明显,但我看不到它,而且我被卡住了。

2 个答案:

答案 0 :(得分:3)

作为一种解决方法,您可以抓取当前组元素的第一个元素(又名$Children)并检查当前区域,如下所示:

<% loop $getRegionGroupedTeams.GroupedBy(RegionID) %>
    <h2>Region name from has_one here: 
        <% with $Children.First %>
            $Region.NAME
        <% end_with %>
    </h2>

    <% loop $Children %>
        $NAME<br>
    <% end_loop %>
<% end_loop %>

旁注:请将您的'$ db`字段命名为标准,'CamelCase'而不是'UPPERCASE'。

答案 1 :(得分:1)

这不是GroupedList的工作原理。它只匹配字段值,而不是关系本身。在我看来,你最好循环区域并为团队创建内循环,对吧?