Fornire oggetti da viste in Magento
-
16-10-2019 - |
Domanda
In Zend Framework forniamo oggetti da schemi che vengono poi consumati nella vista. Un esempio di questo potrebbe essere:
$this->layout = new Zend_Layout();
$this->layout->username = 'John';
$this->layout->email = 'john@foofoobunnies.edu';
Il che poi avrei eco nel mio view.phtml:
<?= $this->username; ?>
<?= $this->email; ?>
Comunque mi ritrovo in Magento iscritto metodi di blocco che restituiscono interi oggetti per essere consumato dalla vista - per esempio:
Blocca / User.php
public function getUser(){
return Mage::getModel('mymodule/user')->load($this->getUserId());
}
E nella mia user.phtml :
$user = $this->getUser();
echo $user->getUsername();
echo $this->getEmail();
C'è un modo per tagliare fuori questo passaggio di dover metodi di blocco in scrittura per restituire i dati rilevanti? Sto usando questo metodo per 2-3 anni, quindi sono estraneo ad esso, ma sembra proprio come la Zend Two-Step / Composito paradigma visualizzazione layout è molto più veloce di incidere su.
Modifica
Semplicemente pensato che può essere possibile utilizzare proprietà dei blocchi nello stesso modo che usano i metodi di blocco, ad esempio $this->username
dove $ questo può essere un oggetto di tipo Mymodule_User_Block_User
; anche se non so se questa è una pratica capito o accettato in Magento, come non ho visto troppo spesso.
Soluzione
C'è sempre assign()
ed i getter e setter di cui sopra via Varien_Object::_call()
Altri suggerimenti
La modifica alla tua domanda praticamente riassume.
È possibile utilizzare $this
quando il blocco è un esempio di ciò che si sta tentando di accedere, entro limiti ragionevoli, naturalmente. Un blocco non sta per essere l'equivalente del rispettivo modello è necessario.
Ma in termini di passaggio di dati da e attraverso i blocchi, è possibile utilizzare XML o PHP per realizzarla.
In PHP
$this->getLayout()->getBlock('block_name')->setData('user', Mage::getModel('mymodule/user')->load($this->getUserId()));
o in XML
<block type="mymodule/user" name="block_name">
<action method="setUserId"><user_id>string_goes_here</user_id></action>
</block>
Si potrebbe rendere il proprio metodo di azione per impostare l'oggetto utente in sé (ovviamente, ho crudamente hardcoded una stringa, ma i principali stand).
Il metodo toHtml()
in Mage_Core_Block_Template include più o meno il file phtml, quindi, si è nel contesto del blocco. Si può fare tutto il blocco o l'ambiente Magento consente.
Utilizzando $this->username
non è delle migliori pratiche. Credo perché con il metodo get, si è assolutamente liberi di cambiare qualcosa più tardi, senza cambiare la logica di base con l'array di dati, estesa dal Varien_Object
. Aggiungere un controllo, ignorare la __get()
serie con getUsername()
e ritorno qualcosa di diverso nella matrice dei dati, ecc.