2015-04-15 10 views
5

Il nostro sito ha un oggetto chiamato "TrailNotice" che ha una relazione molti_many con il tipo di pagina "TrailSection".Come visualizzare molti_molti oggetti nel modello di pagina in Silverstripe

class TrailNotice extends DataObject { 

    private static $many_many = array(
    'TrailSections' => 'TrailSection' 
); 

Questo consente a un singolo TrailNotice da applicare su più TrailSections tramite caselle di controllo nel CMS:

$fields->addFieldToTab('Root.Main', new CheckboxSetField('TrailSections', 'Applies to which trail sections?', DataObject::get('TrailSection')->map('ID', 'Title'))); 

Come faccio a visualizzare le TrailNotices attaccato ad una TrailSection nel controllore pagina TrailSection?

Ho iniziato con il seguente codice:

class TrailSection_Controller extends Page_Controller { 

    public function TrailNotices(){ 
    $TrailNotices = DataObject::get('TrailNotice'); 
    return $TrailNotices; 
    } 

Ma questo metterò tutti gli oggetti TrailNotice. Come faccio a filtrarli in modo che vengano visualizzati solo i TrailNotices collegati a TrailSection?

risposta

6

È necessario definire un many_many su entrambi i modi, allora si può accedere da entrambi i lati . Un lato ha un $many_many

class TrailNotice extends DataObject { 

    private static $many_many = array(
    'TrailSections' => 'TrailSection' 
); 

dall'altro lato è necessario definire $belongs_many_many

class TrailSection extends DataObject { 

    private static $belongs_many_many = array(
    'TrailNotices' => 'TrailNotice' 
); 

Poi nel modello si può chiamare la lista delle relazioni e anello su di esso:

<% loop $TrailNotices %> 
    $Title 
<% end_loop %> 

Vedere infographic per tutte le relazioni possibili (grazie a @nightjar per fornire la grafica).

+0

Grande, grazie. – BaronGrivet

0

SilverStripe memorizza molte_molte relazioni RelationList che possono accedere all'oggetto utilizzando $this->RelationName() (in questo caso $this->data()->TrailNotices()). RelationList è una sottoclasse di DataList in modo da poterlo considerare molto simile a uno DataObject::get() per filtrare l'elenco.

class TrailSection_Controller extends Page_Controller { 

    public function TrailNotices(){ 
    $TrailNotices = $this->data()->TrailNotices(); 
    return $TrailNotices; 
    } 

Ci sono più informazioni su ORM di SilverStripe e DataObject Relations a l'aiuto Dataobject Relationship Management e (il contenuto più recente) SilverStripe Lessons

3

si deve implementare un $ belongs_many_many nel modello TrailSection, qualcosa di simile:

class TrailSection extends DataObject { 

    private static $belongs_many_many = array(
    'TrailNotices' => 'TrailNotice' 
); 

} 

allora si può semplicemente anello oltre $ TrailNotices in template TrailSection.ss, senza fare niente nel controller:

<% loop $TrailNotices %> 
    $Title<br> 
<% end_loop %> 

È possibile controllare il campione Mentor nel collegamento di Stephen Dataobject Relationship Management