2009-08-10 12 views
5

Wie implementiere ich eine Sidebar in Zend Framework? Ich weiß, dass ich einen Platzhalter oder etwas ähnliches in Zend_layout verwenden kann, aber wie erzeuge ich automatisch den Code für die Sidebar in meinen Controllern, ohne eine Sidebar-Klasse in jedem Controller aufrufen zu müssen? Mein Setup ist wie folgtWie man eine Sidebar im Zend Framework implementiert

Application 
- modules 
    - blog 
    - other modules 

ich die Sidebar nur für mein Blog Modul soll.

Ich habe dies http://www.zfforums.com/zend-framework-components-13/model-view-controller-mvc-21/how-layout-sidebar-etc-2677.html gefunden, aber ich verstehe nicht, den letzten Teil „nur Ihr Layout injizieren, registrieren Sie es mit dem Front-Controller ...“

Antwort

6

Sie könnten nur noch eine Aktion und Ansicht in einem Ihrem Controller was die Seitenleiste rendert.

aus dem Layout für das Blog-Modul Sie rufen Sie einfach an:

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

auf der Position, wo Sie es haben wollen. Also ein Aufruf zu einer Aktion.

+0

Das ist sehr teuer, glaube ich. – blockhead

+0

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

+0

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

3

Wenn Sie Zend_Layout verwenden, fügen Sie einfach die Seitenleiste mit dem Action ViewHelper hinzu, wie Rufinus sagt.

im Layout Skript:

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

Dies sollte die Anforderungen in Ihrer Frage gestellt erfüllen.

+0

Vielen Dank für die Bestätigung Rufinus Antwort – unkownt

4

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.

Verwandte Themen