0

.phtml在遵守 Magento 架构的同时,在模板中创建临时变量的最佳方法是什么?

例子

文件:/template/catalog/product/view.phtml

<?php
$myVar = $_product->getAttributeText('color');

if ( empty($myVar) ) {
    // does not exist
} else {
    // show the attribute
}
?>

除了这个表达式之外,其他任何地方都不需要 $myVar。

注意:我不是在寻找替代方法来编写避免创建变量的代码。为了便于讨论,假设需要创建一个临时变量。

应该$myVar是什么?

  1. $myVar
  2. $namespaced_myVar
  3. $_myVar
  4. Magento 的注册表模式http://alanstorm.com/magento_registry_singleton_tutorial
  5. 还有什么...

寻找一个“真实世界”的解决方案,而不是一个纯粹的答案。你会怎么写这个?

回答

结合 Ben 的回答和 Alan/Vinai 的对话中的这一点https://twitter.com/VinaiKopp/status/225318270591442945 - 这就是我要写的方式:

如果需要的不仅仅是基本逻辑,我将使用新方法扩展该类。

否则,我将在本地范围内创建新的变量,如下所示:

$mynamespace_myVar = 'xyz';

这就是我喜欢它的地方:

  • $mynamespace_提醒我我创建了这个而不是Magento
  • 这也使得其他开发人员不太可能覆盖我的变量

这是我不喜欢的:

  • 它不纯并且可能会损坏,但是对于整个站点,我可能只需要 <5 次,因此可以合理地屏蔽它。
  • $_用于显示 var 是该模板的本地变量不是“Magento 方式”,但它使代码更具可读性。

所以我的模板大多会有这样的代码:

$gravdept_someNiceData = true;
4

1 回答 1

3

一些历史:https ://stackoverflow.com/a/3955757/833795

关于 1、2 和 3:区分这些选择涉及进入“纯粹答案”领域,因为它们都是局部变量。

不需要使用注册表模式,因为所需的范围被声明为模板呈现的本地范围。

根据您的示例,Magento 中的适当构造可能是:

<?php if ($_product->getColor()): ?>
    <h2> I HAZ COLOR </h2>
<?php else: ?>
    <h2> I NO HAZ COLOR </h2>
<?php endif ?>

If there is anything but the simplest test of return values it's appropriate to add this logic as a method of the block class (using a rewrite), as it is in fact view logic which you've mentioned should be local to this context only.

于 2012-09-19T17:46:54.633 回答