2010-03-05 12 views
6

Sto creando una libreria di oggetti di visualizzazione per la nostra applicazione. Rendono l'html di molti oggetti comuni (utenti, conversazioni, messaggi, ecc.) In varie viste. Per punti di vista intendo l'oggetto può sputare indietro diversi 'livelli di zoom' di se stesso con marcature diverse.Zend Framework - Quando utilizzare viewscripts/partial vs view helpers

Alcuni oggetti di visualizzazione contengono altri oggetti di visualizzazione per il rendering ad es. un oggetto lista utente esegue il rendering degli oggetti utente in una determinata vista (questa particolare vista li sputa di nuovo negli elementi elenco in modo che rientrino nell'elenco)

Sto provando a spostarli nel modo corretto di fare le cose in ZF, ma Non riesco a decidere se questi dovrebbero essere tutti gli helper di visualizzazione, o se sono tutti gli script di visualizzazione/parziali.

La semplice visualizzazione degli script e il loro rendering con -> render() sembrano un po 'sporchi perché qualsiasi informazione o parametro che voglio passare ad essi deve essere assegnata all'oggetto della vista.

I parziali sembrano un po 'più corretti, tranne che non sono sicuri se è opportuno eseguire la logica di visualizzazione in questi (se' showNotificationStatus 'è passato come parametro, renderizza questo intervallo). O se il suo kosher per partial per rendere altri partial (una lista di utenti che rende l'oggetto utente).

Vedere gli helper sembra possibilmente il modo giusto per farlo, ma non so se questo è un uso eccessivo degli helper della vista. Ogni oggetto può essere un helper della vista e accettare un parametro objectview in modo che sappia quale livello/contenitore di zoom deve essere visualizzato, oppure ogni objectview potrebbe persino essere il proprio helper (quindi non c'è una grande istruzione switch all'interno di un oggetto). Una cosa bella delle viste è che puoi passare i parametri e ha ancora accesso al contesto della vista se hai bisogno di qualcosa da quel livello.

La maggior parte di questi accetterà modelli, con alcuni che richiedono alcuni parametri aggiuntivi per sapere cosa fare (ad esempio showNotificationStatus dall'alto). Qual è lo strumento adatto per questo?

risposta

15

Una delle idee principali dei partial è che sono pensati per essere il più riutilizzabili possibile - ecco perché hanno un loro scope variabile. Mi piace usare i partial come contenitori abbastanza stupidi per piccoli bit di HTML. Nessuna logica importante diversa da alcune affermazioni if() o foreach().

Se ho bisogno di logica seria, io uso un aiutante. Gli helper dovrebbero essere responsabili della gestione della logica e della chiamata dei metodi di rendering. So che nel mondo di Rails gli helper tendono a racchiudere piccoli frammenti di logica, come gestire la costruzione di link o tag di immagine. È grandioso, ma non credo che ci sia alcun danno nel renderle più complesse in ZF. In pratica li uso per tradurre i miei oggetti di business in viste.

Penso che il modo migliore per utilizzare sia parziali che helper sia disporre di helper per impostare i dati, quindi passarli in partial. In questo modo il tuo HTML rimane molto facile da mantenere (e ho il sospetto che ogni volta che qualcuno digiuna uno echo "<a href='". $my_link . '"/>" muore da qualche parte).

EDIT (elaborare):

La cosa da ricordare a proposito aiutanti è che possono essere trattati come classi normali, utilizzare un costruttore con argomenti e hanno membri privati.Quindi, quando installi un helper, puoi creare un oggetto business e quindi disporre di più metodi per il rendering dell'HTML (tramite partial).

Quindi, a mio avviso:

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

Qui, il metodo user_list() restituisce un insieme di <li> elementi con tutti i dati corretti in loro.

mie forze aiuto si presenta così:

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 Penso che questa sia davvero una buona informazione. Qualche possibilità di elaborare un po '? Supponiamo che tu abbia un oggetto business che può essere rappresentato in diversi livelli di zoom (di dettaglio). Hai un aiutante, che rende diversi parziali in base a un parametro che passi? Molti aiutanti con parziali corrispondenti? Fondamentalmente stai guardando in generale una relazione 1 a 1? Ed è bello per i partial fare leva su altri helper? (Immagina una conversazione, che contiene un elenco di utenti al suo interno. Devi rendere gli utenti all'interno della conversazione parziali.) –

+0

Ho aggiunto alla mia risposta sopra un esempio. Nel mio esempio, uso gli aiutanti per controllare i partial, ma non vedo perché non potremmo farlo viceversa. Preferisco semplicemente mantenere il mio codice HTML libero dalla logica del php che posso. –

+0

Eccezionale. Grazie mille, Bryan! –

0

Gli helper sono per la logica (ad esempio conversione di oggetto in matrice), i partial sono per la logica di decorazione (visualizzare l'array ricorsivo come albero <ul>).

Ricordare che è possibile utilizzare anche $this->render('anyfile.ext') o include().

+0

Una cosa che offusca quella linea per me, è che ci sono aiutanti forniti con ZF che sono proprio per la creazione di elementi HTML dai dati forniti. Vedi tutti gli helper del modulo su http://zendframework.com/manual/1.10/en/zend.view.helpers.html es. formCheckbox crea una checkbox con i dati che gli vengono passati –

+1

Gli helper che possono avere output HTML diversi, usano 'setPartial()'. Quando eseguire partial è troppo costoso (o sei sicuro che l'output sarà ogni volta lo stesso), è più semplice scrivere codice HTML in helper. Implementa semplicemente 'setPartial()' con fallback al markup predefinito, se partial non è impostato. – takeshin

Problemi correlati