2012-05-10 5 views
2

ちょっと今、Magentoのテーマに取り組んでいます(...システムの理解はゆっくりだが着実に成長しています)。すぐにいくつかのカスタムモジュールの作業を開始する必要があるので、私はこの小さなプロジェクトから自分のベアリングを手に入れようとしています。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つの強固な方法があることを知っている...これは私が行ったものです)。

製品ブロックが表示されるたびにこれをテストし、今までこのコードを複製して機能させる必要がありました。それはうまくいきますが、逆のことです(ロジックをビューレイヤに入れてはいけません)。

[OK]を - そう、機能性を共有するために、単純なモジュールを作ることができます:

ローカル/ 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> 

さて、クラスのために...私は本当にわからないんだけどBlock O場合r Helperが適切です。私は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()を上書きする必要がありますか?再び。これは、このクラスをインスタンス化する場合

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

...私は明確ではないよ。おそらくない...私のlocal.xml

私はブロックを参照しますか?私はそうは思わない。とにかく、私はパラメータを使ってメソッドを呼び出す必要があるので、私はのproduct/view/media.phtmlでどう対処するかは分かりません。

テンプレートファイルが必要ではないと思いますが、文字列を出力しているだけですが、関連するテンプレートがないブロックモジュールは見たことがないと思います。たぶんヘルパークラスが適切でしょうか?

どのような場合でも、それは機能しません。
メディアクラスにgetIsFF()メソッドがない(驚くことではない)という致命的なエラーが表示されるか、まったく表示されません。私の設定ファイルは正しいですが、それはそれだと思います。

Jebus。 私はすべて回っています。

Mage skillzの誰かがこの単純な問題を明確にして正しい方向に向けることができますか?

乾杯!

+0

あなたが気にしない場合は、正確なエラーを投稿してください。 (スタックトレースあり) –

+0

こんにちは。返信ありがとうございます。私は最終的に仕事を辞める前に、これはちょうど昨夜働いていた。私は(最終的に)働くことができた簡単なヘルパークラスを作った。私のアーキテクチャが「正しい」かどうかは分かりませんが、ちょっとハッキリしています。私はmondayに出てきたものを投稿します。 ...マジェンタのUビデオも見ています。このプロセスのスピードアップに役立つかもしれません。 – Bosworth99

答えて

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

:まあ=私はこのわずかに修正し、作業溶液をsussed
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); ?> 

私はこれがまさにマジェントなやり方に適切かどうかはまだ分かりません。つまり、と思うのですが、と思って、自分のクラスに任せて、Modelフォルダに入れてください。

このようなことを理解しようとしている人のために、私はそれに夢中になったので、config.xmlファイルの意図は、利用可能なファクトリクラスをブロック/ヘルパー/モデルプール - そしてそのパスが包含ディレクトリにあること。テンプレートファイルのヘルパーコールは、ディレクトリの「短い名前」と実際のクラス名を識別します。

すなわち - あなたはヘルパーの複数のクラスを持つことができます:

<?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); ?> 

だから... ...一歩近づきます。

関連する問題