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.
Questo è molto costoso, credo. – blockhead
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
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