2017-02-14 4 views
2

Je n'arrive pas à obtenir une variable dans un modèle qui contient une GroupedList de DataObjects ayant une relation has_one avec un autre DataObject.Silverstripe Liste groupée DataObjects - get variable de has_one dans le modèle

Exemple: L'équipe DataObject appartient à une région. Lorsque je reçois une liste groupée des équipes, regroupées par RegionID, je n'arrive pas à comprendre comment accéder à la région.NAME dans le modèle.

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 ne fonctionne pas dans le modèle et j'ai essayé quelques autres choses. J'ai le sentiment que la solution est assez évidente mais je ne peux pas la voir et je suis coincé.

Répondre

2

Pour contourner ce problème, vous pouvez saisir le premier élément les éléments du groupe actuel (aka $Children) et vérifiez la région actuelle comme ceci:

<% 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 %> 

Sidenote: s'il vous plaît nommer vos « champs db` de $ plus comme la standard, 'CamelCase' au lieu de 'UPPERCASE'.

+0

Merci, ça marche très bien pour ma situation. Si cela devient plus complexe, je pourrais faire une boucle manuelle comme UncleCheese suggéré. (Les noms de champs de cas UPPER sont une chose héritée ...) – kiwiana

+0

J'ai raccourci à '$ Children.First.Region.NAME' maintenant vous pouvez l'utiliser sans' <% with ..%> ' –

1

Ce n'est pas comme ça que GroupedList fonctionne. Il correspond seulement à la valeur du champ, pas à la relation elle-même. Il me semble que vous feriez mieux de boucler les régions et de créer une boucle interne pour les équipes, n'est-ce pas?

+0

Ok, merci, je vais le faire à la place alors ... – kiwiana