Ничто не передает данные в блоки. После того, как действие контроллера выполнит взаимодействие модели, он отвечает за
Загрузка объекта макета (который косвенно загружает и создает блочные объекты)
Скажите этому объекту макета визуализировать страницу.
Большинство действий контроллера Magento делают это с двумя вызовами в конце действия контроллера.
$this->loadLayout();
$this->renderLayout();
В Magento ничто не устанавливает данные в представлении. Вместо этого представление (то есть блочные объекты) запрашивает данные у системы . Вы можете увидеть пример этого в классе блока 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;
}
...
Здесь метод getTagInfo
этого блока запрашивает у модели информацию. Таким образом, разработчик шаблонов внешнего интерфейса получает доступ к
$this->getTagInfo();
метод. У меня также есть хороший авторитет , что метод _prepareLayout
блока является идеальным местом для помещения большей части, если не всех, вашего кода извлечения данных в блок.
Второй шаблон, который вы увидите, это шаблон реестра Magento. Это система Magento, которая позволяет устанавливать общесистемную (но не PHP) глобальную переменную.
Mage::register('foo', 'some value');
echo Mage::registry('foo');
Иногда разработчик Magento использует реестр для установки переменной в действии контроллера, а затем захват возвращается в блоках. Например, в контроллере счетов консоли администратора.
#File: app/code/core/Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php
protected function _initInvoice()
{
...
$invoice = Mage::register('current_invoice', $invoice);
return $invoice;
}
и затем Блок будет ссылаться на него позже.
#File: app/code/core/Mage/Sales/Block/Order/Print/Invoice.php
public function getInvoice()
{
return Mage::registry('current_invoice');
}
Я не в восторге от шаблона реестра, но он используется основной командой, так что он, вероятно, кошерный.
Наконец, если вы хотите эмулировать шаблон «тупого представления», используемый в большинстве сред PHP MVC, попробуйте что-то вроде этого
$this->loadLayout();
$block = $this->getLayout()->getBlock('block_name');
$block->setSomeData('My Data');
$block->setData('alternate_syntax', 'Some other data');
$this->renderLayout();
и затем в файле блока и / или шаблона.
echo $this->getSomeData();
echo $this->getData('some_data');
echo $this->getAlternateSyntax();
echo $this->getData('alternate_syntax');
После того, как вы позвоните loadLayout
, Magento создаст все объекты блока. То, что вы делаете выше, это получение ссылки на конкретный объект блока, а затем установка его данных.
Согласно комментариям Vinai ниже, есть также метод assign
блока, который нужно рассмотреть.
Аналогично setData
, после вызова loadLayout
(или из _prepareLayout
) блока вы можете сделать что-то вроде
$this->loadLayout();
$block = $this->getLayout()->getBlock('block_name');
$block->assign('my_view_var','Something for the view');
$this->renderLayout();
и затем в файле phtml
вашего блока вы сможете вывести эту переменную представления
echo $my_view_var;