Magento - 在控制器和块之间传递数据

非常快速和简单的问题,但我找不到一个像样的答案 - 什么是将数据从控制器传递到Magento中的块的最佳方法。

如果它有所作为,我将按如下方式加载布局:

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

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

我应该补充一点,我一直在使用注册表,如下所示:

在控制器中:

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

在块中:

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

不确定这是否是最好的方法。


答案 1

你没有。

在Magento的MVC方法中,控制器不负责为视图设置变量(在Magento的情况下,视图是布局和块)。控制器在模型上设置值,然后从这些相同的模型中读取块。在Magento的世界观中,让一个Block依靠控制器做一件特定的事情是紧密耦合的,应该避免。

控制器的工作是对模型执行某些操作,然后告诉系统它的布局渲染时间。就是这样。布局/块作业是根据系统模型的状态以某种方式显示HTML页面。

所以,如果我想模仿传统的PHP MVC行为,我会

  1. 创建一个简单的模型类,从中继承Varien_Object

  2. 在控制器中,使用Mage::getSingleton('foo/bar')

  3. 使用魔术 getter/setter 在模型上设置值(您可以在继承自 的对象中获取这些值),或 等。Varien_ObjectsetData

  4. 在块中,使用 再次实例化模型并读回值。Mage::getSingleton('foo/bar')

使用 Magento 实例化模型时,会将对象实例化为单例。因此,如果您重新实例化一个对象(再次使用 ),您将获得相同的对象。Mage::getSingleton(...)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()


推荐