Silverstripe 分组列表数据对象 - 从模板中的 has_one 获取变量

Silverstripe Grouped List DataObjects - get variable from has_one in template

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

示例: 我的 DataObject Team 属于一个区域。当我获得按 RegionID 分组的团队的 GroupedList 时,我不知道如何访问模板中的 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 在模板中不起作用,我尝试了其他一些方法。我觉得解决方案很明显,但我看不到它,我被卡住了。

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

作为变通方法,您可以获取当前组元素的第一个元素(又名 $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'。