Magento - передача данных между контроллером и блоком - программирование
Подтвердить что ты не робот

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

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

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

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

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

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

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

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

В блоке:

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

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

4b9b3361

Ответ 1

Нет.

В подходе Magento MVC контроллер не должен устанавливать переменные для представления (в случае Magento вид - макет и блоки). Контроллеры задают значения в моделях, а затем блоки считывают из тех же моделей. В Magento вид на мир, имея Блок, полагающийся на контроллер, делающий определенную вещь, является плотной связью, и его следует избегать.

Задача вашего контроллера - делать определенные вещи для моделей, а затем сообщать системе о времени рендеринга макета. Это. Это ваша задача Layout/Blocks для отображения HTML-страницы определенным образом в зависимости от состояния системных моделей.

Итак, если бы я хотел подражать традиционным поведениям PHP MVC, я бы

  • Создайте простой класс Model, наследуемый от Varien_Object

  • В контроллере создайте экземпляр этого объекта с помощью Mage::getSingleton('foo/bar')

  • Задайте значения в Модели с помощью волшебных приемников/сеттеров (вы получите их в объектах, которые наследуют от Varien_Object), или setData и т.д.

  • В блоках снова создайте модель с помощью Mage::getSingleton('foo/bar') и верните значения обратно.

Когда вы создаете экземпляр модели с помощью Mage::getSingleton(...), Magento будет создавать объект как однострочный. Итак, если вы повторно создаете объект (снова с помощью Mage::getSingleton('foo/bar')), вы возвращаете тот же объект.

Ответ 2

Если вы используете блоки, наследующие 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()), поэтому их можно отличить от назначенных переменных.

Ответ 3

Что для меня работало в том, чтобы установить переменную в контроллере, выполнив:

Mage::register('variable', 'value');

И затем в представлении вы получите значение, используя следующий код:

$variable = $this->getVariable();

Ответ 4

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

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

Ответ 5

Вы можете использовать пару setData/getData для некоторых значений. Я использовал setData в контроллере и getData в блоке.

Ответ 6

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

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

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

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

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

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