1

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

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

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

4

2 回答 2

3

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

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

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

  • 块类:每个 .phtml 文件都有一个$this对象。这意味着您的模板文件是在对象的上下文中呈现的。该对象是块类的一个实例。布局 XML 文件定义用于该特定块的块类。在布局介绍中了解更多信息。

    如果其中的信息$var1仅用于这些块中的演示目的,您可以将信息存储在其中一个块对象本身中。由于块是按层次结构构建的(并且您使用循环),您可以考虑使用父块来存储信息。您可以使用$this->getParentBlock(). 如果您找到了您的对象,您可以调用$block->setYourVariableName('value')以保存该值并$block->getYourVariableName()再次读取它。您还可以通过访问子块$block->getChild('block_name')或使用它们的数据$block->getChildData('your_variable_name')在API 文档中查找更多有用的方法。

  • 模型单例:另一种方法是单例模型。单例确保仅存在某个类的一个实例。这样,您始终可以访问同一个对象并共享数据。也许这对您来说不是完美的解决方案,因为您必须创建一个新的模型类来存储那个小信息位。

    另一方面,有足够多的用例表明构建单独的模型是有意义的。同样,由于我不知道您在做什么,因此创建模型可能会很好。您仍然可以决定是将模型存储为块的一部分还是使用单例访问它。如果您想使用单例,请参阅Alan Storm 的这篇文章,“Magento 的单例模式”部分。

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

    请在执行此操作之前考虑其他选项,因为您不想在注册表中填充大量微小的信息位。如果您想使用它,请再次查看Alans 的文章

于 2012-11-17T05:24:46.377 回答
1

添加到 Mattihias 的非常详细的答案中,如果您最终确实使用了注册表(不是过度使用的东西),请确保在不需要保持其清洁时立即从注册表中删除该条目。

Mage::unregister('registry_key')
于 2012-11-23T18:06:08.033 回答