代码之家  ›  专栏  ›  技术社区  ›  Drew Hunter

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

  •  46
  • Drew Hunter  · 技术社区  · 15 年前

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

    如果有什么不同,我将按如下方式加载布局:

     $this->loadLayout(array('default', 'myModule_default'));
    
        $this->_initLayoutMessages('customer/session')
             ->_initLayoutMessages('catalog/session')
             ->renderLayout();
    

    我要补充的是,我使用登记册的情况如下:

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

    在街区:

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

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

    6 回复  |  直到 15 年前
        1
  •  83
  •   Alana Storm    15 年前

    你没有。

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

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

    1. 创建一个简单的模型类 Varien_Object

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

    3. 使用magic getter/setters在模型上设置值(在继承自 ),或 setData 等等。

    4. 在块中,使用 Mage::getSingleton('foo/bar') 把这些值读回来。

    Mage::getSingleton(...) Magento将实例化对象 作为单身汉 . 所以,如果你重新实例化一个对象 Mage::getSingleton('foo/bar') )你得到的是同一个物体。

        2
  •  35
  •   Amit Bera    10 年前

    Mage_Core_Block_Template (即使用模板来显示)一旦块被 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
  •  4
  •   Josh Pennington    15 年前

    我在中的作用是通过执行以下操作来设置控制器中的变量:

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

    然后在视图中,使用以下代码检索值:

    $variable = $this->getVariable();
    
        4
  •  2
  •   Jonathan Day    15 年前

    你在正确的轨道上使用 Mage::registry() 接近。另一种选择是使用自动getter和setter,例如。 $this->setRandomVariableName($data) $this->getRandomVariableName() . 我还没有调查它们是否最终位于堆栈中的同一位置(我假设它们在会话中是特定于请求的),但是它们在代码中实现了相同的目标。

    使用getter和setter有时会让人感到困惑,因为它看起来像是通过ORM而不是“临时”会话变量访问数据,所以您可能会做出一个编码风格的一致性决定来使用 Mage::registry 对于这些类型的变量。你的选择真的。

        5
  •  0
  •   Taras    14 年前

    对于某些值,可以使用setData/getData对。 我在控制器中使用setData,在块中使用getData。

        6
  •  0
  •   paderEpiktet    14 年前

    @在JavaServer Faces中绘制了一些背景,在PHP/Magento中比较新,我想声明

    “‘不共享’PHP架构”,

    PHP is not Java: Session Management Whitepaper" ,导致PHP中的所有对象(甚至类)都具有范围“request”。

    如果我得到了阿拉斯点,他建议用

    • 一个“有状态”模型对象,其属性中包含一些不一定存储在数据库中的数据

    因为像这样的工具 MTool 减少了创建新模型的时间,这似乎真的很有意义。

    推荐文章