我现在在Magento工作,我遇到了变量范围问题。我有两个文件在愿望清单上显示。我需要在这两个文件之间传递一个变量,我可以成功地做到,我遇到的问题是这两个文件在循环中运行而我无法更改这些值。我们使用的基本代码如下: 文件1:
global $var1;
//$var1 = '';
if($condition == true){
$var1 = 'string';
}
另一个文件正确回显$ var1,给我'string'。然后该文件再次循环并重复该过程。我遇到的问题是,如果我取消注释第二行以重置变量,它总是保持空字符串。 if语句肯定会被触发,变量就不会被设置。我是否误解了全局可访问变量在php中的工作原理?
答案 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')