2010-03-05 8 views
6

Ich erstelle eine Bibliothek von Anzeigeobjekten für unsere Anwendung. Sie stellen den HTML-Code vieler gängiger Objekte (Benutzer, Konversationen, Nachrichten usw.) in verschiedenen Ansichten dar. Mit Views meine ich, dass das Objekt verschiedene 'Zoom Levels' von sich selbst mit unterschiedlichem Markup zurückspucken kann.Zend Framework - Viewscripts/Partials vs View Helpers verwenden

Einige Anzeigeobjekte enthalten andere Anzeigeobjekte, um z. ein Benutzerlistenobjekt rendert Benutzerobjekte in einer bestimmten Ansicht (diese Ansicht spuckt sie in Listeneinträge zurück, damit sie in die Liste passen)

Ich versuche, diese in die richtige Art und Weise zu bringen, Dinge in ZF zu tun, aber Ich kann nicht entscheiden, ob das alles View-Helfer sein sollen, oder ob es sich um View-Scripts/Partials handelt.

Sie nur Skripts anzeigen und Rendern mit -> render() scheint ein wenig schmutzig, weil alle Informationen oder Parameter, die ich an sie übergeben möchte, dem Ansichtsobjekt zugewiesen werden muss.

Partials scheinen etwas korrekter zu sein, außer dass sie nicht sicher sind, ob es in diesen Fällen eine Anzeigelogik macht (wenn 'showNotificationStatus' als Parameter übergeben wird, wird diese Spanne gerendert). Oder wenn es koscher ist, dass Partials andere Teiltöne wiedergeben (eine Benutzerliste, die das Benutzerobjekt rendert).

View Helfer scheinen möglicherweise der richtige Weg, es zu tun, aber ich weiß nicht, ob das Überfrachtung View Helfer ist. Jedes Objekt könnte ein View-Helfer sein und einen Objektansicht-Parameter akzeptieren, so dass er weiß, in welcher Zoom-Ebene/Container er sich rendern soll, oder jede Objektansicht könnte sogar sein eigener Helfer sein (es gibt also keine große Schalteranweisung in einem Objekt). Eine nette Sache über die Ansichten ist, dass Sie Parameter übergeben können und immer noch Zugriff auf den Ansichtskontext haben, wenn Sie etwas von dieser Ebene benötigen.

Die meisten von diesen akzeptieren Modelle, wobei einige zusätzliche Parameter benötigen, um zu wissen, was zu tun ist (zB showNotificationStatus von oben). Was ist das richtige Werkzeug dafür?

Antwort

15

Eine der Kernideen von Partials ist, dass sie so wiederverwendbar wie möglich sind - daher haben sie ihren eigenen variablen Umfang. Ich verwende Partials als ziemlich dumme Container für kleine HTML-Teile. Keine wichtige Logik außer ein paar if() oder foreach() Aussagen.

Wenn ich ernsthafte Logik brauche - ich benutze einen Helfer. Helfer sollten für den Umgang mit Logik und Aufruf von Rendermethoden verantwortlich sein. Ich weiß, dass Helfer in der Rails-Welt dazu neigen, kleine Teile der Logik zu verkapseln, wie die Konstruktion von Links oder Bild-Tags. Das ist großartig, aber ich denke nicht, dass es schaden würde, sie in ZF komplexer zu machen. Ich benutze sie im Wesentlichen, um meine Geschäftsobjekte in Ansichten zu übersetzen.

Ich denke, der beste Weg, um beide Partials und Helfer zu verwenden, ist Helfer haben die Daten einrichten, dann geben Sie es in Teiltöne. Auf diese Weise bleibt Ihr HTML sehr einfach zu pflegen (und ich vermute, dass jedes Mal, wenn jemand echo "<a href='". $my_link . '"/>" ein Kätzchen stirbt irgendwo).

EDIT (auszuarbeiten):

Die Sache Helfer zu erinnern ist, dass sie wie normale Klassen behandelt werden können, einen Konstruktor mit Argumenten verwenden und private Mitglieder.Wenn Sie einen Helper instanziieren, können Sie also ein Geschäftsobjekt erstellen und dann über mehrere Methoden HTML (über Teiltabellen) rendern.

Also meiner Ansicht:

<?php $helper = $this->_helper->MyUserHelper($users); ?> 
<ul> 
    <?php $helper->user_list(); ?> 
</ul> 

Hier wird die user_list() Methode gibt eine Sammlung von <li> Elemente mit allen richtigen Daten in ihnen.

Meine Helfer könnte wie folgt aussieht:

class MyWidgetHelper 
{ 
    private $_widget; 

    public function __construct($users) 
    { 
    $this->_users = $users; 
    } 

    public function user_list() 
    { 
    // do any necessary logic here 
    // then return the html that gets rendered. 
    // you can call a partial from here, and it just returns an HTML string. 
    return $this->_view->partial('partials/_user_item.phtml', array('users' => $users) 
    } 
} 
+0

Bryan Ich denke, das ist wirklich eine gute Information. Gibt es irgendeine Chance, ein bisschen zu erarbeiten? Nehmen wir an, Sie haben ein Business-Objekt, das auf einer Reihe verschiedener Zoomstufen (von Details) dargestellt werden kann. Haben Sie einen Helfer, der verschiedene Teiltöne basierend auf einem übergebenen Parameter rendert? Viele Helfer mit entsprechenden Teiltönen? Im Allgemeinen betrachtest du allgemein eine 1 zu 1 Beziehung? Und ist es cool für Partials, andere View-Helfer zu nutzen? (Stellen Sie sich eine Konversation vor, die eine Liste von Benutzern enthält. Sie müssen die Benutzer innerhalb der Konversation partiell rendern.) –

+0

Ich habe zu meiner Antwort oben ein Beispiel hinzugefügt. In meinem Beispiel verwende ich Helfer, um Teiltöne zu steuern, aber ich sehe nicht, warum du es nicht anders herum tun könntest. Ich bevorzuge es, meinen HTML-Code so frei von PHP-Logik wie möglich zu halten. –

+0

Hervorragend. Danke einem Haufen Bryan! –

0

Helfer sind für die Logik (z. B. Objekt in Array konvertieren), Partials sind zum Dekorieren von Logik (rekursives Array als <ul> Baum anzeigen).

Denken Sie daran, dass Sie auch $this->render('anyfile.ext') oder include() verwenden können.

+0

Eine Sache, die diese Linie für mich verwischt, gibt es Helfer, die mit ZF liefern, die genau für die Erstellung von HTML-Elementen zur Verfügung gestellten Daten sind. Sehen Sie alle Formular Helfer auf http://zendframework.com/manual/1.10/en/zend.view.helpers.html eg. formCheckbox erzeugt eine Checkbox mit Daten, die Sie übergeben –

+1

Helfer, die verschiedene HTML-Ausgabe haben können, verwenden Sie 'setPartial()'. Wenn das Ausführen von Partials zu teuer ist (oder Sie sicher sind, dass die Ausgabe jedes Mal gleich ist), ist es einfacher, HTML einfach in den Helper zu schreiben. Implementieren Sie einfach 'setPartial()' mit Fallback zum Standard-Markup, wenn Partial nicht gesetzt ist. – takeshin

Verwandte Themen