Magento中文件之间的全局变量

时间:2012-11-16 22:08:22

标签: php magento scope

我现在在Magento工作,我遇到了变量范围问题。我有两个文件在愿望清单上显示。我需要在这两个文件之间传递一个变量,我可以成功地做到,我遇到的问题是这两个文件在循环中运行而我无法更改这些值。我们使用的基本代码如下: 文件1:

global $var1;
//$var1 = '';
if($condition == true){
  $var1 = 'string';
}

另一个文件正确回显$ var1,给我'string'。然后该文件再次循环并重复该过程。我遇到的问题是,如果我取消注释第二行以重置变量,它总是保持空字符串。 if语句肯定会被触发,变量就不会被设置。我是否误解了全局可访问变量在php中的工作原理?

2 个答案:

答案 0 :(得分:3)

如果您想以Magento方式执行此操作,则应将信息连接到对象

在不知道任何具体细节的情况下,我们无法确定,但您的$var1值很可能在逻辑上与愿望清单,愿望清单项目或与其相关的内容(如客户或产品)。

话虽如此,您可以通过不同的方式在Magento布局模板文件之间传递信息(您基本上想要做的事情)。我不能给你具体的代码,因为我不知道你想要做什么,但我可以给你一些选择:

  • 阻止类:每个.phtml文件都有一个$this对象。这意味着您的模板文件将在对象的上下文中呈现。该对象是块类的实例。布局XML文件定义了用于此特定块的块类。请在intro to layouts

    中详细了解相关信息

    如果$var1中的信息仅用于这些块中的演示目的,您可以将信息存储在其中一个块对象中。由于块是在层次结构中构建的(并且您使用循环),因此您可以考虑使用父块来存储信息。您可以使用$this->getParentBlock()获取父块。如果您找到了自己的对象,可以致电$block->setYourVariableName('value')保存该值,然后$block->getYourVariableName()再次阅读。您还可以使用$block->getChild('block_name')通过$block->getChildData('your_variable_name')或其数据访问子块。在API documentation

  • 中找出更多有用的方法
  • 模特单身人士:另一种方法是单身模型。单例确保只存在某个类的一个实例。这样,您始终可以访问同一个对象并共享数据。也许这对你来说不是一个完美的解决方案,因为你必须创建一个新的模型类来存储那些小信息。

    另一方面,有足够的用例建立一个单独的模型是有道理的。再说一次,因为我不知道你在做什么,所以创建一个模型可能会非常好。您仍然可以决定是将模型存储为块的一部分还是使用单例访问它。如果您想使用单身人士,请参阅此article by Alan Storm,“Magento的单身人士模式”部分。

  • 注册表:我会将此作为最后的手段。注册表是一个中央和全球“为我存储此信息/获取此信息”对象。它易于使用,但如果你想接受最佳实践,你应该尽可能避免使用它。 (一些琐事:Magento的单例实现实际上使用了注册表,但隐藏了你的细节。)

    在执行此操作之前,请考虑其他选项,因为您不希望在注册表中添加大量信息。如果您想使用它,请再次查看Alans article

答案 1 :(得分:1)

添加到Mattihias的非常详细的答案,如果你最终使用注册表(不是过度使用的东西),请确保一旦不需要保持它清理就从注册表中删除该条目。

Mage::unregister('registry_key')