Ответ 1
Ничто не передает данные в блоки. После того, как действие контроллера выполнило свою модель взаимодействия, оно отвечает за
-
Загрузка объекта макета (который косвенно загружает и создает объекты блока)
-
Сообщите этому объекту макета для отображения страницы.
Большинство действий контроллера 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();
метод. У меня также есть хороший авторитет, что метод block _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 создаст все объекты блока. То, что вы делаете выше, получает ссылку на конкретный объект блока и затем устанавливает его данные.
В комментариях к Перу Винай ниже также рассматривается метод блока 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;