Anstatt den Aktionsstapel und den View Helper action()
zu verwenden, könnten Sie ein "Teilansichtsskript" rendern, das Ihre Seitenleistenelemente enthält.
# 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>
Das ist render()
View Helfer verwendet, um den Inhalt eines anderen View Skript zu machen. Es hat den gleichen Umfang wie alle anderen Ansichtsskripten. Wenn der Ansicht also Variablen zugewiesen sind, sind sie für Ihre Teilansicht verfügbar. Im obigen Beispiel wurde die categories-Variable im Controller festgelegt.
Es gibt einen anderen View-Helper namens partial()
View Helper. Diese Funktion ist etwas teurer, da sie einen eigenen variablen Bereich erstellt. Mit anderen Worten, keine Ihrer aktuellen Ansichtsvariablen wird verfügbar sein. Sie werden einen sauberen Schiefer, mit zu arbeiten, was bedeutet, dass Sie in allen möglichen Variablen passieren müssen Sie brauchen:
# 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>
ich mich nicht finden mit partial()
sehr oft, da es teurer ist, und ich brauche nur selten zu erstellen ein separater Kontext
Bis zur Einrichtung der Variablen für die Verwendung in der Sidebar teilweise (in diesem Beispiel), habe ich eine Reihe von verschiedenen Methoden je nach dem speziellen Problem verwendet. Wenn es auf eine Controller-Aktion ist spezifisch, werde ich den Code schreiben und es in der Ansicht Skript zuweisen:
# controller
public function somethingAction()
{
$this->view->categories = $this->_getCategoriesForThisParticularAction();
// other controller code
}
Wenn mein Code mehr generisch für alle Aktionen des Controllers ist, werde ich den preDispatch()
Funktion des Controllers nutzen. Wenn es für mehrere Controller generischer ist, lege ich den Code in den init()
meines Basis-Controllers (ein Controller, den die meisten meiner Controller erweitern).
Manchmal lege ich den Code nicht einmal in meinen Controller. Wenn es einfach genug ist, stecke ich den Code einfach in den Teil. Wenn es ein wenig komplexer ist, werde ich es zu einem View-Helfer verschieben. Dies kann das MVC-Muster brechen, aber ich denke, es hängt wirklich von dem speziellen Fall ab, um die beste Platzierung zu bestimmen.
Das ist sehr teuer, glaube ich. – blockhead
was meinst du mit teuer? AFAIK ist so der Weg. Der Code, der in der Zfforums-Verknüpfung erwähnt wird, bricht mit dem MVC-Muster IMHO. – Rufinus
Danke, ich wusste, dass es einfach sein sollte. Ich muss nur herausfinden, wie ich verschiedene Layouts pro Modul haben kann. Im Moment habe ich für jedes Modul das gleiche Layout. Blockhead: Wie meinst du teuer? Wäre es weniger teuer, wenn ich die Aktion in meinem Controller anrufe? Meine erste Idee war, einen Standard-Controller zu erstellen, der die Seitenleiste reparierte und dann von diesem Controller in allen meinen Blog-Controllern erbte. – unkownt