Magento - 自定义模块结构

时间:2012-05-10 20:13:04

标签: php magento

Heyo,现在已经开始研究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>

现在,对于班级......我不确定BlockHelper是否合适。我和Block一起去了,但是 - idk ......我可能错了(这些东西的教程变化很大)。

本地/ WACI / ProductFlag /砌块/ 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()方法(并不奇怪),或者只是没有出现。我的配置文件是正确的,但我认为就是这样。

耶布斯。 我全都转过身来。

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

干杯!

1 个答案:

答案 0 :(得分: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 /助手/ 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); ?>

所以......更进一步。