2009-08-10 7 views
5

Come si implementa una barra laterale in Zend Framework? So che posso usare un segnaposto o qualcosa di simile in Zend_layout, ma come faccio a generare automaticamente il codice per la barra laterale nei miei controller senza dover chiamare una classe della barra laterale in ogni controller? La mia configurazione è la seguenteCome implementare una barra laterale in Zend Framework

Application 
- modules 
    - blog 
    - other modules 

Voglio solo la barra laterale per il mio modulo di blog.

Ho trovato questo http://www.zfforums.com/zend-framework-components-13/model-view-controller-mvc-21/how-layout-sidebar-etc-2677.html ma non capisco l'ultima parte "solo iniettare il layout, registrarlo con il front controller ..."

risposta

6

Si potrebbe semplicemente avere un'azione e la vista in uno dei controller che rende la barra laterale.

dal layout per il modulo blog basta chiamare:

<? echo $this->action('action','controller','module',array('optionalparams'=>1); ?> 

sulla posizione in cui si vuole avere. Quindi una chiamata a un'azione.

+0

Questo è molto costoso, credo. – blockhead

+0

cosa intendi per costoso? AFAIK è questo il modo per farlo. Il codice menzionato nel link di zfforums, rompe con il pattern di MVC IMHO. – Rufinus

+0

Grazie, sapevo che dovrebbe essere facile. Ho solo bisogno di capire come posso avere diversi layout per modulo. Per ora ho lo stesso layout per ogni modulo. Blockhead: come vuoi dire costoso? Sarebbe meno costoso se chiamo l'azione all'interno del mio controller? La mia prima idea era quella di creare un controller predefinito che fissasse la barra laterale e quindi ereditasse da quel controller in tutti i miei controller di blog. – unkownt

3

Se si utilizza Zend_Layout, è sufficiente aggiungere la barra laterale con il viewhelper Azione come ha detto Rufinus.

nello script di layout:

<div id="sidebar"> 
<?php echo $this->action('action', 'controller', 'module', array('optionalparams'=>1)); ?> 
</div> 
<div id="content"> 
<?php echo $this->layout()->content; ?> 
</div> 

Questo dovrebbe soddisfare i requisiti pubblicati nella sua interrogazione.

+0

Grazie per aver confermato la risposta di Rufinus – unkownt

4

Invece di utilizzare lo stack azione e l'helper vista action(), è possibile eseguire il rendering di uno "script di visualizzazione parziale" che include gli elementi della barra laterale.

# in your layout.phtml 
<div id="sidebar"> 
    <?php echo $this->render('blog/_sidebar.phtml'); /*relative to your view scripts directory*/ ?> 
</div> 

# in blog/_sidebar.phtml 
<div id="blog_categories"> 
    <?php foreach ($this->categories as $category): ?> 
     <?php echo $category->name; ?> 
    <?php endforeach; ?> 
</div> 

L'helper render() vista viene utilizzato per il rendering del contenuto di un altro script vista. Ha lo stesso scopo di tutti gli altri script di visualizzazione, quindi se ci sono delle variabili assegnate alla vista, saranno disponibili per il tuo parziale. Quindi nell'esempio sopra, la variabile categorie è stata impostata nel controller.

C'è un altro view helper chiamato helper vista partial(). Questa funzione è un po 'più costosa in quanto crea il proprio ambito variabile. In altre parole, nessuna delle tue attuali variabili di visualizzazione sarà disponibile. Si avrà una lavagna pulita con cui lavorare, il che significa che si deve passare in qualsiasi variabile è necessario:

# in your layout.phtml 
<div id="sidebar"> 
    <?php echo $this->partial('blog/_sidebar.phtml', array('categories2'=>$this->categories)); ?> 
</div> 

# in blog/_sidebar.phtml 
<div id="blog_categories"> 
    <?php foreach ($this->categories2 as $category): ?> 
     <?php echo $category->name; ?> 
    <?php endforeach; ?> 
</div> 

non mi trovo con partial() molto spesso dal momento che è più costoso, e raramente bisogno di creare un contesto separato.

Per quanto riguarda la configurazione delle variabili da utilizzare nella barra laterale parziale ($this->categories in questo esempio), ho utilizzato un numero di metodi diversi a seconda del problema particolare. Se è specifico per un azione di controllo, scriverò il codice e assegnare nello script vista:

# controller 
public function somethingAction() 
{ 
    $this->view->categories = $this->_getCategoriesForThisParticularAction(); 
    // other controller code 
} 

Se il mio codice è più generico a tutte le azioni del controllore, io utilizzare la funzione preDispatch() del controller. Se è più generico per più controller, inserirò il codice nel init() del mio controller di base (un controller che si estende per la maggior parte dei miei controller).

A volte non inserisco nemmeno il codice nel mio controller. Se è abbastanza semplice, inserisco semplicemente il codice nel parziale. Se è un po 'più complesso, lo sposterò a un assistente della vista. Questo potrebbe interrompere il pattern MVC, ma penso che dipenda davvero dal caso particolare per determinare il miglior posizionamento.