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





storage set (6)


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

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

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

$variable = $this->getVariable();

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

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

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

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

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

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

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

В блоке:

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

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




Вы этого не сделаете.

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

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

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

  1. Создайте простой класс Model, наследующий от Varien_Object

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

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

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

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




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




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

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




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




На более низком уровне неизменность означает, что память, в которой хранится строка, не будет изменена. Когда вы создаете строку "foo" , выделяется некоторая память для хранения значения "foo" . Эта память не будет изменена. Если вы изменяете строку, например, substr(1) , создается новая строка и выделяется другая часть памяти, которая будет хранить "oo" . Теперь у вас две строки в памяти: "foo" и "oo" . Даже если вы больше не собираетесь использовать "foo" , он будет придерживаться, пока не будет собран мусор.

Одна из причин, по которой строковые операции сравнительно дороги.







php variables magento model session-variables