Wie erstelle ich einen benutzerdefinierten Indexer?

9

Ich versuche, einen benutzerdefinierten Indexer für ein bestimmtes Produktattribut zu erstellen.
Ich muss einfach:

  • Lesen Sie den Produktattributwert
  • verarbeite es auf irgendeine Weise (nicht relevant)
  • Speichern Sie es in einer Indextabelle

Die obigen Schritte könnten in einem benutzerdefinierten Skript implementiert werden, aber ich möchte den Indexer mithilfe des von anderen Indexern in Magento verwendeten Musters integrieren.

Ich kann sehen, dass der Magento-Standardindexer diese abstrakte Klasse implementiert Mage_Index_Model_Indexer_Abstract
... Es sieht nicht einfach aus, den Prozess anhand des Codes zu verstehen, und ich kann keine Dokumentation dafür finden.

Jede Hilfe ist dankbar.

Fra
quelle

Antworten:

19

Die folgenden Informationen sollten eine allgemeine Richtlinie sein, die zu einem grundlegenden Verständnis des Ganzen indexer thingführt. Sie sind also keine vollständige exemplarische Vorgehensweise ... (wenn Sie zu dieser Antwort beitragen möchten, sind Sie herzlich willkommen.)

Hier sind mindestens 3 Schritte erforderlich:

  1. Erstellen Sie eine Indextabelle und ein zugehöriges Ressourcenmodell
  2. Erstellen Sie ein Indexer-Modell, das implementiert wird Mage_Index_Model_Indexer_Abstract
  3. Fügen Sie Ihren Indexer zur Magento-Konfiguration hinzu

Vorgeschlagene Dokumentation:

  1. Der wahrscheinlich beste Weg, dies zu untersuchen, ist ein Blick darauf Mage_Catalog_Model_Product_Indexer_Price(dies ist eine der einfacheren Indeximplementierungen).
  2. Diese Ressource ist derzeit der beste Leitfaden, um den gesamten Prozess zu verstehen und zu entscheiden, welche Aktion erforderlich ist.

SCHRITT 1
Fügen Sie einfach Ihre Indextabelle wie bei jeder anderen Modultabelle im Installationsprogramm hinzu.
Ihr Ressourcenmodell muss die Logik für Reindex Alldie reindexAll()Methode implementieren : Sie würden hier wahrscheinlich alle Entitäten verarbeiten und alle Daten extrahieren.

SCHRITT 2
_registerEvent() , _processEvent()sind hier die wichtige Methode. Sie müssen in der folgenden Anleitung ein wenig graben, um die Logik dahinter zu verstehen

Fügen _registerEvent()Sie im Grunde genommen einige Daten zu $event, basierend auf dem 'Ereignistyp' und dem 'Entitätstyp'. Diese zusätzlichen Daten werden in der _processEvent()Methode verwendet.

Sie müssen mindestens die folgenden Methoden in Ihrem Modell implementieren.

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

SCHRITT 3
Fügen Sie dies zu Ihrer Konfiguration hinzu. [Modul / Modell] ist das in Schritt 2 erstellte Modell. Wenn Sie also an dieser Stelle in System-> Indexer gehen, wird ein neuer Eintrag angezeigt

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

Quellen:

Fra
quelle