2012-12-21 19 views
15
私はヘルパー、その方法で自分自身を習熟助けが必要

ためproductAttribute()メソッドを理解するヘルプ、および製品の属性。具体的に:次のコード行は、商品画像のHTMLを生成は製品ページ

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

:ここ$_helper->productAttribute($product, $attributeHtml, $attributeName)

は、私は/見直しを使用していたファイルです。

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; 
} 

助けていただければ幸いです。

+0

ハンドラを追加でき、これらのハンドラが実行されています。何が起きているのかを見るためにデバッグできませんか?それは他の要素のためにより有用かもしれない抽象的な方法かもしれません:) – EricG

+0

優れた提案。私はまだMagentoのための効率的な方法を考え出していますし、提案にはオープンしています。 抽象的な方法としては、意味があります。何が起こっているのかについてのステップも高く評価されます。 :) – MSD

+0

Google Chromeには優れたデバッガがあります。インスペクタ(Ctrl-Shift-J)を開き、「ソース」に移動します。 Ctrl-Shift-Fを使用して、すべてのソースを検索することができます。または、srcを手動で開き、ブレークポイントを設定します。それからステップしてください:) – EricG

答えて

27

非常に良い質問!

だから、実際にはこのヘルパーの目的について少し。その名前から、すでにデータの出力に使用されているという結論を出すことができます。メソッド名も自明で、ハンドラに依存して製品属性値を出力するだけです。現在、商品属性値の出力に使用されるproductAttribute()と、カテゴリ1に使用されるcategoryAttribute()の2つの方法があります。カテゴリと製品のコアテンプレートのすべてのデータは、1.4.xバージョンのいずれかで追加されたが、わからない限り、この方法で(価格属性を除く)出力されます。主な考えは、属性のデータをフィルタリングすることを可能にすることでした。たとえば、カテゴリ説明に{{widget ... }}の構造を使用できます。これは特別な方法で実現します。この方法は、実際に同じ機能を行いますが、異なるエンティティの両方

。 -

  • 属性コードをフィルタ取得した値 - 属性モデル
  • を取得するために使用されるコード

    • エンティティ(カテゴリや製品、メソッド名に依存します)
    • 属性値:それらの両方は、3つの引数を受け取りますこの方法の

    第1内側は、Magentoのではない場合、それはescapeHtml()方法でテキストをエスケープ、値内のHTMLマークアップの余裕を確認します。また、属性にadminの入力としてtextareaがある場合、すべての改行文字は<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!

    +0

    誠実な対応をありがとうございます。絶対にトンを学んだ。私はこれをアップヴォートすることができればと思います。 – MSD

    +2

    @MSDあなたがアップヴォートできない場合は、いつでも回答を受け入れることができます。あなたが質問を解決するのに役立ちましたら、回答を受け入れることを検討してください。 – Kalpesh

    +1

    この解決方法は、magento 2.0.0.0-dev47(イベントが削除されている)から時代遅れです。プラグインを使用する必要があります。 – Quisse