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

Dre*_*ter 46 php variables model session-variables magento

真的很快速和简单的问题,但我找不到一个合适的答案 - 什么是从控制器传递数据到Magento块的最佳方法.

如果它有所不同,我正在加载布局如下:

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

    $this->_initLayoutMessages('customer/session')
         ->_initLayoutMessages('catalog/session')
         ->renderLayout();
Run Code Online (Sandbox Code Playgroud)

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

在控制器中:

Mage::register('data', $data);
Run Code Online (Sandbox Code Playgroud)

在块中:

$data = Mage::registry('data');
Run Code Online (Sandbox Code Playgroud)

不知道这是否是最好的方法.

Ala*_*orm 83

你没有.

在Magento的MVC方法中,控制器不负责为视图设置变量(在Magento的情况下,视图是布局和块).控制器在模型上设置值,然后从这些模型中读取块.在Magento对世界的看法中,让Block依靠控制器执行特定的操作是紧密耦合,应该避免.

你的控制器的工作是对模型做某些事情,然后告诉系统它的布局渲染时间.而已.根据系统模型的状态,以某种方式显示HTML页面是您的布局/块工作.

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

  1. 创建一个继承自的简单Model类 Varien_Object

  2. 在控制器中,使用.实例化该对象 Mage::getSingleton('foo/bar')

  3. 使用魔术getter/setter在您的Model上设置值(您可以在继承的对象中获取这些值Varien_Object)setData,等等.

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

使用Mage::getSingleton(...)Magento 实例化Model时,会将对象实例化为单例.因此,如果您重新实例化一个对象(再次使用Mage::getSingleton('foo/bar')),那么您将获得相同的对象.

  • @Neil是的,那里有很多混乱.Magento使用了一些zend框架组件,但它本身就是一个框架. (2认同)

Vin*_*nai 35

如果您正在使用继承的块Mage_Core_Block_Template(即使用模板显示),您可以使用assign()方法分配数据,一旦块被实例化,loadLayout()

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

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

然后,在.phtml模板中,您可以简单地使用

<?php echo $data ?>
Run Code Online (Sandbox Code Playgroud)

这在magento中并不常用,但由于它是作为公共方法实现的,因此声明稳定,我相信这样做很好.这也是约定启动在带有下划线(例如$_product = $this->getProduct())的模板中声明的变量的原因,因此可以将它们与指定的变量区分开来.