2010-10-23 11 views
46

Domanda davvero semplice e veloce ma non riesco a trovare una risposta decente a questo - Qual è il modo migliore per passare i dati da un controller a un blocco in Magento.Magento - Passaggio di dati tra un controller e un blocco

Incase si fa la differenza, sto caricando il layout come segue:

$this->loadLayout(array('default', 'myModule_default')); 

    $this->_initLayoutMessages('customer/session') 
     ->_initLayoutMessages('catalog/session') 
     ->renderLayout(); 

Devo aggiungere, che ho utilizzato il Registro di sistema come segue:

Nel controllore:

Mage::register('data', $data); 

Nel blocco:

$data = Mage::registry('data'); 

Non sono sicuro se questo è il modo migliore per farlo però.

risposta

79

Non lo fai.

Nell'approccio MVC di Magento, non è responsabilità del controllore impostare le variabili per la vista (nel caso di Magento, la vista è Layout e blocchi). I controller impostano i valori su Modelli, quindi i blocchi leggono dagli stessi modelli. Nella visione di Magento del mondo, avere un blocco basandosi sul controller che fa una cosa specifica è un accoppiamento stretto, e dovrebbe essere evitato.

Il lavoro del controller è eseguire determinate operazioni sui Modelli, quindi comunicare al sistema che è il tempo di rendering del layout. Questo è tutto. È il tuo lavoro Layout/Blocchi per visualizzare una pagina HTML in un certo modo, a seconda dello stato dei Modelli del sistema.

Quindi, se ho voluto emulare i comportamenti tradizionali PHP MVC avevo

  1. Creare una semplice classe modello le eredita da Varien_Object

  2. Nel regolatore, un'istanza di tale oggetto utilizzando il Mage::getSingleton('foo/bar')

  3. Impostare i valori sul modello utilizzando il magic getter/setter (si ottengono questi oggetti in oggetti che ereditano da Varien_Object) o setData, e tc.

  4. Nei blocchi, creare nuovamente il modello con un Mage::getSingleton('foo/bar') e leggere i valori indietro.

Quando si crea un'istanza di un modello con Mage::getSingleton(...) Magento sarà un'istanza dell'oggetto come Singleton. Quindi, se riattivi un oggetto (di nuovo con Mage::getSingleton('foo/bar')) stai tornando indietro allo stesso oggetto.

+1

Grazie, questo chiarisce la mia confusione dopo essere venuto da applicazioni Zend MVC standard. –

+2

@Neil Sì, c'è un Magento usa molti componenti di framework di zend, ma è, di per sé, un framework –

+0

+1 a questa risposta, tuttavia penso che la risposta di Vinai sia buona, specialmente quando sei alle fasi iniziali di sviluppo e devi vedere che i tuoi dati vengono caricati e trasmessi correttamente. Personalmente, consiglierei di utilizzare il metodo "ultra-disaccoppiato" in una fase successiva, per evitare di avere troppe cose da prova subito. – Diego

2

Sei sulla strada giusta utilizzando l'approccio Mage::registry(). L'altra opzione è usare getter e setter automatici, ad es. $this->setRandomVariableName($data) nel controller e quindi nel blocco utilizzare $this->getRandomVariableName(). Non ho indagato se finiscono nella stessa posizione nello stack (presumo nella sessione in quanto sono specifiche della richiesta), ma ottengono lo stesso obiettivo nel codice.

Utilizzando i getter e setter occasionalmente può diventare confuso come può apparire come si accede ai dati tramite l'ORM, piuttosto che una variabile di sessione "temporanea", per cui si potrebbe prendere una decisione consistenza codifica in stile da utilizzare Mage::registry per coloro tipi di variabili. La tua scelta davvero.

+0

Ho già provato questo, supponendo che ci sarebbero getter e setter magici, ma ho sempre un errore di metodo non definito. –

+0

Hmm, forse è necessario un modello istanziato per eseguire l'attivazione/attivazione automatica della magia. Potrebbe non funzionare su $ in un contesto di controller. Se il tuo controller ha già un oggetto creato da 'Mage :: getModel ('module/model'), dovresti essere in grado di usarlo. Probabilmente dà anche alla variabile più contesto che è una buona cosa ... –

+2

Magic getPropName e setPropName funzionano solo sugli oggetti che ereditano da Varien_Object. –

4

Che cosa ha funzionato per me in è quello di impostare la variabile nel controller facendo:

Mage::register('variable', 'value'); 

E poi la vista si sarebbe recuperare il valore utilizzando il seguente codice:

$variable = $this->getVariable(); 
34

Se si utilizza blocchi che ereditano Mage_Core_Block_Template (vale a dire che utilizzano un modello per visualizzare) è possibile assegnare i dati utilizzando il metodo di assegnazione(), una volta che i blocchi sono stati istanziare da loadLayout()

$this->loadLayout(array('default', 'myModule_default')); 

$this->getLayout()->getBlock('your.block.name.in.the.layout')->assign('data', $data); 

Poi, nel modello .phtml, si può semplicemente utilizzare

<?php echo $data ?> 

Questo non è usato molto spesso in Magento, ma dal momento che è implementato come metodi pubblici e quindi dichiarato stabile, credo che sia giusto farlo. Questo è anche il motivo per cui la convenzione avvii le variabili dichiarate in un modello con un trattino basso (ad esempio $_product = $this->getProduct()), in modo che possano essere distinte dalle variabili assegnate.

+1

Interessato perché usare 'assign()' è meglio di magic setter, ad es. 'SetData()'? –

+0

No, direi che sono equivalenti. – Vinai

+0

@JonathanDay Evito i metodi magici come la peste perché i moderni IDE che eseguono analisi statiche soffocano su codice "magico" che non è integrato da annotazioni (la maggior parte di Magento). Anche l'Intellisense è un vantaggio. –

0

È possibile utilizzare la coppia setData/getData per alcuni valori. Ho usato setData nel controller e getData nel blocco.

0

@Drew Con una certa esperienza in JavaServer Faces e piuttosto nuovo in PHP/Magento vorrei affermare che la

" 'quota di nulla' architettura del PHP",

vedere PHP is not Java: Session Management Whitepaper", porta alla Infatti tutti gli oggetti (e anche le classi) in PHP hanno l'ambito "richiesta".

Se ho avuto punto Alani poi si indica di utilizzare

  • un 'stateful' oggetto modello che ha alcuni dati nei suoi attributi che non è necessariamente memorizzati nel database
  • e il pattern Singleton, dal l'uso di Mage :: getSingleton, per rendere questo modello statico, che viene istanziato nel controller, accessibile al blocco e quindi nel modello effettivo che rende l'output.

E poiché uno strumento come MTool riduce il tempo necessario per creare un nuovo modello, questo sembra davvero avere senso.

Problemi correlati