以下の情報は、全体の基本的な理解につながる一般的なガイドラインである必要があるindexer thing
ため、完全な「ウォークスルー」ではありません...(この回答に貢献したい場合は、大歓迎です)
ここでは少なくとも3つのステップが必要です。
- インデックステーブルと関連するリソースモデルを作成する
- 実装するインデクサーモデルを作成する
Mage_Index_Model_Indexer_Abstract
- インデクサーをMagento構成に追加する
推奨ドキュメント:
- おそらくこれを掘り下げる最良の方法は、見てみることです
Mage_Catalog_Model_Product_Indexer_Price
(これは、より簡単なインデックス実装の1つです)。
- 現在、このリソースは、必要なアクションが何かを決定するプロセス全体を理解するための最良のガイドになっています。
ステップ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>
出典: