[php] Magento - передача данных между контроллером и блоком



Answers

Если вы используете блоки, которые наследуют Mage_Core_Block_Template (т. Mage_Core_Block_Template Используют шаблон для отображения), вы можете назначить данные с помощью метода assign (), как только блоки были loadLayout()

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

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

Затем в шаблоне .phtml вы можете просто использовать

<?php echo $data ?>

Это не используется очень часто в magento, но поскольку оно реализовано как общедоступные методы и, таким образом, объявлено стабильным, я считаю, что все в порядке. Это также является причиной того, что соглашение запускает переменные, объявленные в шаблоне с подчеркиванием (например, $_product = $this->getProduct() ), поэтому их можно отличить от назначенных переменных.

Question

Очень быстрый и простой вопрос, но я не могу найти достойный ответ на этот вопрос. Каков наилучший способ передать данные от контроллера блоку в Magento.

Если это имеет значение, я загружаю макет следующим образом:

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

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

Я должен добавить, что я использовал реестр следующим образом:

В контроллере:

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

В блоке:

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

Не уверен, что это лучший способ сделать это.




@Drew С некоторым фоном в JavaServer Faces и довольно новым в PHP / Magento я хотел бы заявить, что

«« нечего использовать »архитектуру PHP»,

см. PHP не Java: «Руководство по управлению сеансом» , приводит к тому, что все объекты (и даже классы) в PHP имеют «запрос» области.

Если я получу Аланс, то он советует использовать

  • объект состояния с «stateful», который имеет некоторые данные в своих атрибутах, которые не обязательно хранятся в базе данных
  • и singleton pattern, используя Mage :: getSingleton, чтобы сделать эту модель состояния, которая создается в контроллере, доступ к блоку и, следовательно, в фактическом шаблоне, который отображает вывод.

И поскольку такой инструмент, как MTool сокращает время создания новой модели, это действительно имеет смысл.




Вы на правильном пути, используя подход Mage::registry() . Другой вариант - использовать автоматические геттеры и сеттеры, например $this->setRandomVariableName($data) в контроллере, а затем в блоке использовать $this->getRandomVariableName() . Я не исследовал, попадают ли они в одно и то же место в стеке (я предполагаю, что в сеансе они специфичны для запросов), но они достигают той же цели в коде.

Использование getters и seters может иногда запутываться, так как может показаться, что вы получаете доступ к данным через ORM, а не к временной переменной сеанса, поэтому вы можете сделать решение о согласованности в стиле кодирования использовать Mage::registry для этих типов переменных. Ваш выбор действительно.






Related