カスタムインデクサーを作成する方法


9

特定の商品属性のカスタムインデクサーを作成しようとしています。
する必要がある:

  • 製品の属性値を読み取る
  • 何らかの方法で処理する(関連性がない)
  • インデックステーブルに保存する

上記の手順はカスタムスクリプトで実装できますが、Magentoの他のインデクサーで使用されているパターンを使用してインデクサーを統合します。

Magentoのデフォルトのインデクサーがこの抽象クラスを実装しているMage_Index_Model_Indexer_Abstract
ことがわかります。コードからプロセスを理解するのは簡単ではないように見え、ドキュメントも見つかりません。

助けてくれてありがとう。

回答:


19

以下の情報は、全体の基本的な理解につながる一般的なガイドラインである必要があるindexer thingため、完全な「ウォークスルー」ではありません...(この回答に貢献したい場合は、大歓迎です)

ここでは少なくとも3つのステップが必要です。

  1. インデックステーブルと関連するリソースモデルを作成する
  2. 実装するインデクサーモデルを作成する Mage_Index_Model_Indexer_Abstract
  3. インデクサーをMagento構成に追加する

推奨ドキュメント:

  1. おそらくこれを掘り下げる最良の方法は、見てみることですMage_Catalog_Model_Product_Indexer_Price(これは、より簡単なインデックス実装の1つです)。
  2. 現在、このリソースは、必要なアクションが何かを決定するプロセス全体を理解するための最良のガイドになっています。

ステップ1
他のモジュールテーブルと同様に、インデックステーブルをインストーラーに追加するだけです。
リソースモデルReindex Allは、reindexAll()メソッドのロジックを実装する必要があります。おそらくここですべてのエンティティを処理し、すべてのデータを抽出します。

STEP 2
_registerEvent()_processEvent()ここで重要な方法です、あなたがそれらの背後にあるロジックを理解するには、以下のガイドにビットを掘るする必要があります。

基本的に、「イベントタイプ」と「エンティティタイプ」に_registerEvent()基づいて、データをに追加し$eventます。この追加データは_processEvent()メソッドで使用されます。

モデルには少なくとも以下のメソッドを実装する必要があります。

/**
 * Data key for matching result to be saved in
 */
const EVENT_MATCH_RESULT_KEY = 'some_key';

/**
 * Initialize resource model
 *
 */
protected function _construct()
{
    $this->_init('module/resource_model');
}

/**
 * @var  Used by matchEvent()
 * for example if you are processing products ...
 */
protected $_matchedEntities = array(
    Mage_Catalog_Model_Product::ENTITY => array(
        Mage_Index_Model_Event::TYPE_SAVE,
        Mage_Index_Model_Event::TYPE_MASS_ACTION,
        Mage_Index_Model_Event::TYPE_DELETE
    )
);

 /**
 * Get Indexer name
 *
 * @return string
 */
public function getName(){
    return 'My indexer Name';
}

/**
 * Get Indexer description
 *
 * @return string
 */
public function getDescription()
{
    return 'My indexer Description';
}

/**
 * Register indexer required data inside event object
 *
 * @param   Mage_Index_Model_Event $event
 *
 * Register data required by process in event object
 * @param Mage_Index_Model_Event $event
 */
protected function _registerEvent(Mage_Index_Model_Event $event)
{
    $event->addNewData(self::EVENT_MATCH_RESULT_KEY, true);
    $entity = $event->getEntity();
    $dataObj = $event->getDataObject();

    if ($entity == Mage_Catalog_Model_Product::ENTITY) {
        if ($event->getType() == Mage_Index_Model_Event::TYPE_SAVE) {
            $event->addNewData('yourmodule_update_product_id', $dataObj->getId());
        } elseif ($event->getType() == Mage_Index_Model_Event::TYPE_DELETE) {
            $event->addNewData(' yourmodule _delete_product_id', $dataObj->getId());
        } elseif ($event->getType() == Mage_Index_Model_Event::TYPE_MASS_ACTION) {
            $event->addNewData(' yourmodule _mass_action_product_ids', $dataObj->getProductIds());
        }
    }
}

/**
 * Process event based on event state data
 *
 * @param   Mage_Index_Model_Event $event
 */
protected function _processEvent(Mage_Index_Model_Event $event){
    /** DO STUFF **/
    return $this;
}

ステップ3
これを構成に追加します。[モジュール/モデル]はステップ2で作成したモデルです。このため、この時点でsystem-> indexerに移動すると、新しいエントリが表示されます

<global>
    ......
    <index>
        <indexer>
            <some_key>
                <model>module/model</model>
            </some_key>
        </indexer>
    </index>
    ......
</global> 

出典:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.