Nada transfiere datos a los bloques. Después de una acción de controlador ha hecho su interactuando modelo, que es responsable de
Carga de un objeto de presentación (que, indirectamente, cargas y crea objetos de bloque)
Dile a ese objeto de diseño para representar una página.
La mayoría de las acciones del controlador Magento hacen esto con dos llamadas al final de una acción del controlador.
$this->loadLayout();
$this->renderLayout();
En Magento, nada establece datos en la vista. En cambio, la vista (es decir, los objetos de bloque) pregunte al sistema por datos. Puede ver un ejemplo de esto en la clase de bloque Mage_Tag_Block_Customer_View
.
#File: app/code/core/Mage/Tag/Block/Customer/View.php
...
public function getTagInfo()
{
if (is_null($this->_tagInfo)) {
$this->_tagInfo = Mage::getModel('tag/tag')
->load($this->getTagId());
}
return $this->_tagInfo;
}
...
Aquí, el método de este bloque getTagInfo
pide al modelo directamente para su conocimiento. De esta forma, el desarrollador de plantilla front-end tiene acceso a un
$this->getTagInfo();
método. También tengo en good authority que el método _prepareLayout
de un bloque es el lugar perfecto para poner la mayoría, sino todo, de su código de búsqueda de datos en un bloque.
Un segundo patrón que verá utilizado es el patrón de registro de Magento. Este es un sistema de Magento que le permite establecer una variable global en todo el sistema (pero no en PHP).
Mage::register('foo', 'some value');
echo Mage::registry('foo');
A veces un desarrollador de Magento se utilice el registro para establecer una variable en una acción del controlador, y luego agarrar está de vuelta en los bloques. Por ejemplo, en el controlador de factura de la consola de administración.
#File: app/code/core/Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php
protected function _initInvoice()
{
...
$invoice = Mage::register('current_invoice', $invoice);
return $invoice;
}
y luego un bloque lo referenciará más adelante.
#File: app/code/core/Mage/Sales/Block/Order/Print/Invoice.php
public function getInvoice()
{
return Mage::registry('current_invoice');
}
no estoy loco por el patrón de registro, pero es utilizado por el equipo central, por lo que es probable que haya kosher.
Por último, si usted está mirando para emular el "punto de vista mudo" patrón usado en la mayoría de los marcos de PHP MVC, intentar algo como esto
$this->loadLayout();
$block = $this->getLayout()->getBlock('block_name');
$block->setSomeData('My Data');
$block->setData('alternate_syntax', 'Some other data');
$this->renderLayout();
y luego en el bloque y/o archivo de plantilla.
echo $this->getSomeData();
echo $this->getData('some_data');
echo $this->getAlternateSyntax();
echo $this->getData('alternate_syntax');
Después de llamar loadLayout
, Magento habrá creado todos los objetos de bloque. Lo que está haciendo arriba es obtener referencia a un objeto de bloque específico y luego establecer sus datos.
Según los comentarios de Vinai a continuación, también hay un método de assign
de bloque a considerar.
similares a setData
, después de llamar loadLayout
(o de la de un bloque _prepareLayout
) método, se puede hacer algo como
$this->loadLayout();
$block = $this->getLayout()->getBlock('block_name');
$block->assign('my_view_var','Something for the view');
$this->renderLayout();
y luego en el expediente de su bloque phtml
, serías capaz de salida que la Vista de variables
echo $my_view_var;
Alan, debemos comenzar a coordinar. Su respuesta es la mejor porque responde a la pregunta implícita de OP, que es "Magento, ¿YU NO RENDER COMO LA MAYORÍA de PHP MVC?", Algo que todos hemos preguntado ... :-D – benmarks
Gracias Alan, lo resumió muy bien ! Lo único que se me ocurre agregar es el método 'assign()' del bloque de plantilla. Rara vez se usa, pero algunas personas lo prefieren 'setData()' porque coincide con el enfoque clásico de "asignar variables de plantilla". – Vinai
Gracias Alan. Muy buena explicación, despejó la mayoría de mis dudas. – RIK