2017-05-24 6 views
0

J'ai deux objets de données parent et child avec parent ayant beaucoup child s. Child a quelques boolean s qui décrivent son état et ne devraient être affichés sur cette page particulière que dans un certain état.Filtrage dans le modèle via la méthode dérivée sur DataObject

Dans mon modèle, j'ai:

<% with $Parent %> 
<% if $Child %><h1>Children</h1> 
    <% loop $Child %> 
     <p>$Child.Title</p> 
    <% end_loop %> 
<% end_if %> 
<% end_with %> 

Cependant, cela montrera évidemment tous les Child s, je peux mettre un filtre sur elle:

<% $Child.Filter('Show', '1') %> 

Cependant je ne peux pas faire plusieurs éléments pour le filtre (au moins que je peux comprendre), donc je pensais que je ferais une fonction sur le DataObject qui serait le booléen dérivé pour le montrer, mais ce n'est pas quelque chose que je peux filtrer.

Quel est le meilleur moyen de réaliser ce que j'essaie de faire?

Répondre

4

dire que ce sont nos Child et Parent classes:

Enfant

class Child extends DataObject { 
    private static $db = array(
     'Title' => 'Varchar(1024)', 
     'Awesome' => 'Boolean', 
     'Fun' => 'Boolean' 
    ); 

    private static $has_one = array(
     'Parent' => 'Parent' 
    ); 
} 

Parent

class Parent extends DataObject { 
    private static $db = array(
     'Title' => 'Varchar(1024)' 
    ); 

    private static $has_many = array(
     'Children' => 'Child' 
    ); 
} 

Nous pouvons ajouter des fonctions à la classe Parent pour retourner divers filtré Children listes:

class Parent extends DataObject { 
    private static $has_many = array(
     'Children' => 'Child' 
    ); 

    public function getAwesomeChildren() { 
     return $this->Children()->filter('Awesome', true); 
    } 

    public function getAwesomeFunChildren() { 
     return $this->Children()->filter(array(
      'Awesome' => true, 
      'Fun' => true 
     )); 
    } 
} 

Dans notre modèle, nous pouvons appeler:

<% if $AwesomeChildren %> 
    <h1>Children</h1> 
    <% loop $AwesomeChildren %> 
     <p>$Title</p> 
    <% end_loop %> 
<% end_if %>