2

嘿嘿,一段时间以来一直在研究 magento 主题(......而且我对系统的理解正在缓慢但稳定地增长)。我需要尽快开始处理一些自定义模块,所以我从这个小项目开始了解我的方向:

我找到了一些代码来管理我一直在复制并粘贴到模板文件中的特定任务:

<?php         
    $ids    = $_product->getCategoryIds(); 
    $cat    = Mage::getModel('catalog/category')->load($ids[0]);     
    $isFF   = false;
    foreach ($ids as $key=>$val) {
        $cat = Mage::getModel('catalog/category')->load($val);
        $name = $cat->getName(); 
        if ( $name === 'Fast Fulfillment' ) {
            $isFF = true;
        }
    }
    if ($isFF) { echo '<span class="ff-logo"></span>'; } 
?>

非常简单。我只是检查产品是否属于特定类别,如果是,则生成一个元素。(我知道有大约 5 种可靠的方法可以做到这一点……这是我使用的方法)。

每次显示产品块时,我都需要对此进行测试,并且到目前为止,我一直在复制此代码以使其工作。它确实有效,但是是反击(我不应该将逻辑放入视图层)。

好的 - 所以,让我们制作一个简单的模块来共享功能:

本地/WACI/ProductFlag/etc/config.xml

<config>
    <modules>
        <WACI_ProductFlag>
            <version>0.1.0</version>
        </WACI_ProductFlag>
    </modules>
    <global>
        <blocks>
            <WACI_ProductFlag>
                <class>WACI_ProductFlag_Block_View</class>
            </WACI_ProductFlag>
        </blocks>
    </global>
</config>

等/模块/WACI_All.xml

<config>
    <modules>
        <WACI_CustomPageLayouts>
            <codePool>local</codePool>
            <active>true</active>
        </WACI_CustomPageLayouts>
    </modules>
    <modules>
        <WACI_ProductFlag>
            <codePool>local</codePool>
            <active>true</active>
        </WACI_ProductFlag>
    </modules>
</config>

现在,对于班级......我不确定 aBlock或 aHelper是否合适。我去了Block,但是 - idk...我可能错了(这些东西的教程差异很大)。

本地/WACI/ProductFlag/Block/View.php

<?php

    /**
     * WACI
     * 
     * @codepool   Local
     * @category   View
     * @package    WACI
     * @module      ProductFlag  
     */

    class WACI_ProductFlag_Block_View extends Mage_Core_Block_Template
    {
        private $_focus;
        private $_isFF = false;

        public function getIsFF( $product ){
            $this->_focus = "FF";
            $isFF   = false;
            $ids    = $product->getCategoryIds(); 
            $cat    = Mage::getModel('catalog/category')->load($ids[0]);   

            foreach ($ids as $key=>$val) {
                $cat = Mage::getModel('catalog/category')->load($val);
                $name = $cat->getName(); 

                if ( $name === 'Fast Fulfillment' ) {
                    $isFF = true;
                }
            }
        }

        protected function _toHtml(){
            $html = parent::_toHtml();

            if ($this->_focus === "FF") {
                if ($this->_isFF){
                    $html .= '<span class="ff-logo"></span>';
                }
            }

            return $html;
        }
    }
?>

希望很清楚,我只想根据任何给定产品的输入输出一个字符串。我应该覆盖_toHtml()传递字符串吗?再次。可能不是...

在我的local.xml中,我引用了该块:

<catalog_product_view>
<reference name="content">
            <reference name="product.info">
<block type="WACI/ProductFlag" name="product.flag" as="productFlag" output="toHtml" />...

...我不清楚这是否实例化了这个类?我不这么认为。无论如何,我不确定如何在我的product/view/media.phtml中解决它,因为我需要调用带有参数的方法。

我认为我不需要模板文件,因为我只是输出一个字符串,但我认为我没有见过没有关联模板的块模块。也许一个助手类是合适的?

无论如何,它是行不通的。
我要么收到一个致命错误,说我的媒体类没有getIsFF()方法(不足为奇),要么什么都没有出现。我的配置文件是正确的,但仅此而已,我想。

杰布斯。我都转了。

有法师技能的人可以澄清这个简单的问题并指出正确的方向吗?

干杯!

4

1 回答 1

3

没有建议?好吧=我提出了这个稍作修改且可行的解决方案:

本地/WACI/ProductFlag/etc/config.xml

<config>
    <modules>
        <WACI_ProductFlag>
            <version>0.1.0</version>
        </WACI_ProductFlag>
    </modules>
    <global>
        <blocks>
            <productflag>
                <class>WACI_ProductFlag_Block</class>
            </productflag>
        </blocks>
        <helpers>
            <productflag>
                <class>WACI_ProductFlag_Helper</class>
            </productflag>
        </helpers>
    </global>
</config>

本地/WACI/ProductFlag/Helper/Flag.php

class WACI_ProductFlag_Helper_Flag extends Mage_Core_Helper_Abstract
    {
        private $_isFF = false;

        public function getIsFF( $product ){

            $html   = '';
            $ids        = $product->getCategoryIds(); 
            $cat        = Mage::getModel('catalog/category')->load($ids[0]);   

            foreach ($ids as $key=>$val) {
                $cat = Mage::getModel('catalog/category')->load($val);
                $name = $cat->getName(); 

                if ( $name === 'Fast Fulfillment' ) {
                    $this->_isFF = true;
                }
            }

            if($this->_isFF) { 
                $html = '<span class="ff-logo"></span>';
            }

            return $html;
        }

    }

并通过简单的方法在任何模板文件中调用它:

<?php echo $this->helper('productflag/flag')->getIsFF($_product); ?>

我仍然不确定这是否完全适合 magento 的做事方式 - 即模型调用,我认为,应该降级到他们自己的类并放在 Model 文件夹中。

无论如何——对于任何其他试图弄清楚这些东西的人——当我胡思乱想的时候,我慢慢意识到 config.xml 文件的目的是将可用的工厂类添加到块/帮助器/模型池中——并且路径是包含目录。然后,模板文件中的帮助程序调用识别目录的“短名称”,然后是实际的类名。

ie - 你可以有多个类别的助手:

<?php echo $this->helper('productflag/class_one')->someMethod($_product); ?>
<?php echo $this->helper('productflag/class_two')->someOtherMethod($_product); ?>
<?php echo $this->helper('productflag/class_three')->yetAnotherMethod($_product); ?>

所以……更近了一步。

于 2012-05-14T14:48:45.113 回答