16

我需要帮助来熟悉助手、他们的方法和产品属性。具体来说:$_helper->productAttribute($product, $attributeHtml, $attributeName)

以下是我正在使用/查看的文件:

app\code\core\Mage\catalog\helper\output.php  
app\design\frontend\[theme name]\template\catalog\product\view\media.phtml

以下代码行为产品图片生成 html。

echo $_helper->productAttribute($_product, $_img, 'image');

帮助程序类代码在以下代码段中描述了该方法。返回什么,步骤是什么,为什么我要使用这种方法而不是简单地回显模板文件前一行中描述的 img html?

public function getHandlers($method)
{
    $method = strtolower($method);
    return isset($this->_handlers[$method]) ? $this->_handlers[$method] : array();
}

public function process($method, $result, $params)
{
    foreach ($this->getHandlers($method) as $handler) {
        if (method_exists($handler, $method)) {
            $result = $handler->$method($this, $result, $params);
        }
    }
    return $result;
}

public function productAttribute($product, $attributeHtml, $attributeName)
{
    /* Code that is not relevant to this example */

    $attributeHtml = $this->process('productAttribute', $attributeHtml, array(
        'product'   => $product,
        'attribute' => $attributeName
    ));

    return $attributeHtml;
}

任何帮助表示赞赏。

4

1 回答 1

31

非常好的问题!

所以实际上有点关于这个助手的目的。从它的名字你已经可以断定它是用来输出数据的。方法名称也是不言自明的,它只是输出产品属性值取决于处理程序。目前有两种方法,productAttribute()一种是用于输出产品属性值categoryAttribute(),一种是用于分类。类别和产品的核心模板中的所有数据都是通过这种方法输出的(价格属性除外),据我记得它是在 1.4.x 版本之一中添加的,但不确定。主要思想是使过滤属性数据成为可能。例如,您可以{{widget ... }}在类别描述中使用构造,它是通过特殊方法实现的。

这两种方法实际上执行相同的功能,但针对不同的实体。他们俩都收到 3 个参数:

  • 实体(类别或产品,取决于方法名称)
  • 属性值 - 被过滤的值
  • 属性代码 - 用于检索属性模型的代码

首先在这个方法中,Magento 检查值中 html 标记的允许,如果没有,它使用escapeHtml()方法转义文本。此外,如果属性在管理员中有一个文本区域作为输入,则所有换行符都将替换为<br />标记。

如果允许使用 html,Magento 会检查是否允许{{widget ...}}在配置中使用特殊结构(此结构的正式名称是指令)。如果允许使用指令,则将实例化特殊指令处理器并处理值。

完成所有核心处理后,Magento 调用处理程序。

此处理程序是核心模块不使用的附加功能,但您可以使用自己的自定义来实现一些不错的自定义。这是示例:您希望将产品名称的所有输出都设为大写。然后您可以添加自己的处理程序,为此请遵循以下简单步骤:

  1. 定义观察者catalog_helper_output_construct

    <config>
       <frontend>
           <events>
               <catalog_helper_output_construct>
                   <observers>
                        <your_module>
                            <class>your_module/observer</class>
                            <method>handleHelperOutputInitialization</method>
                        </your_module>
                   </observers>
               </catalog_helper_output_construct>
           </events>
       </frontend>
    </config>
    
  2. 创建你的观察者类,我也将它作为处理程序。代码非常简单:

    class Your_Module_Model_Observer 
    {
        public function handleHelperOutputInitialization($observer) 
        {
            $helper = $observer->getEvent()->getHelper();
            $helper->addHandler('productAttribute', $this);
        }
    
       public function productAttribute($helper, $value, $parameters) 
       {
            $attribute = $parameters['attribute'];
            if ($attribute->getAttributeCode() == 'name') {
               return strtoupper($value);
            }
            return $value;
       }
    }
    
  3. 确保处理程序类中的方法名称与值处理器的方法名称完全相同,在本例中为productAttribute().

享受学习 Magento!

于 2012-12-22T17:02:54.863 回答