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/製品フラグ/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>

etc/modules/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>

Blockさて、クラスについては... aまたは aHelperが適切かどうかはよくわかりません。私は行ったがBlock、- idk... 私はおそらく間違っている (このようなもののチュートリアルは大きく異なります)。

ローカル/WACI/製品フラグ/ブロック/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/製品フラグ/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); ?>

これがマジェントの方法に正確に適しているかどうかはまだわかりません。つまり、モデル呼び出しは、独自のクラスに降格し、モデルフォルダーにドロップする必要があると思います。

いずれにせよ、そしてこのことを理解しようとしている他の人にとっては、config.xmlファイルの意図がブロック/ヘルパー/モデルプールに利用可能なファクトリクラスを追加することであることにゆっくりと気づきました。 path はそれを含むディレクトリへのパスです。次に、テンプレート ファイル内のヘルパー呼び出しは、ディレクトリの「短い名前」を識別し、次に実際のクラス名を識別します。

つまり、ヘルパーの複数のクラスを持つことができます。

<?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 に答える