Warum werden Attribute von Bundle-Artikeln eines Bundle-Produkts auch im Bundle-Produkt selbst gespeichert? (datenbanktechnisch)

8

Kürzlich habe ich untersucht, wie die Optionen des mehrschichtigen Navigationsfilters auf der Kategorieseite ermittelt und abgerufen werden. Ich habe ein bisschen in die Modelle und die Datenbank dafür gegraben und dort den folgenden Mechanismus gefunden, den ich nicht verstehe:

Situation: Angenommen, ich habe ein Attribut mit dem Namen color(attribute_id = 133), ein einfaches Produkt A(entity_id = 26) und ein gebündeltes Produkt B(entity_id = 27) und werde als Bundle-Element in Ahinzugefügt .BMagento ver. 1.9.0.1

Schritt 1: color ist nicht für beide Aund eingestelltB

Geben Sie hier die Bildbeschreibung ein

Schritt 2: color wird gesetzt als Black(value_id = 19) fürB

Geben Sie hier die Bildbeschreibung ein

Schritt 3: color wird gesetzt als White(value_id = 18) fürA

Geben Sie hier die Bildbeschreibung ein

In Schritt 3 konnten wir sehen, dass anscheinend Attribute der Bundle-Elemente ( Ain diesem Fall) auch so gespeichert werden, als wären sie die Attribute des Bundle-Produkts ( Bin diesem Fall) selbst. Und ich glaube, aus diesem Grund werden die Attribute der Bundle-Elemente von Bundle-Produkten auch im mehrschichtigen Navigationsfilter angezeigt.

Ich möchte fragen, warum es so gestaltet ist. Warum speichert das System Attribute der untergeordneten Produkte auch im übergeordneten Produkt? Wie hilft es bei einem bestimmten Prozess im System?

Danke im Voraus.

d.yuk
quelle

Antworten:

2

Dies gilt auch für konfigurierbare Produkte.

Wenn Sie nach weißen Schuhen suchen und die konfigurierbaren Produkte dieses Problem für Sie lösen, wird das Produkt angeboten. Ich denke es ist so einfach. Wenn Ihr gesuchtes Produkt Teil eines Bundle-Produkts ist, wird dieses Produkt ebenfalls angeboten.

Fabian Blechschmidt
quelle
Danke für deine Antwort. Ich verstehe Ihre Punkte, bin aber neugierig, warum dies so erreicht werden muss. Weil es mir so scheint, als würde es die Flexibilität verringern, wenn jemand nicht möchte, dass die Attribute der untergeordneten Produkte mit dem übergeordneten Produkt verknüpft werden (oder einfach nicht, dass Attribute der untergeordneten Produkte im Filter angezeigt werden). . Und ich bin mir nicht sicher, welchen Zwecken dieser "Mechanismus" dient, außer Daten für den Filter vorzubereiten. Ich bin mir also nicht sicher, ob ich diesen Schritt sicher entfernen kann, ohne andere Teile des Systems zu manipulieren.
d.yuk
Das tust du nicht. Entfernen Sie es und testen Sie es. Ich denke es ist kein Problem. In der Vergangenheit habe ich nur Informationen hinzugefügt, einige jedoch nie entfernt. Aber trotzdem: versuchen und testen :-) Viel Glück!
Fabian Blechschmidt
1
Ja, ich denke du hast recht. Am Ende habe ich herausgefunden, dass diese "Links" tatsächlich während der Neuindizierung von Produktattributen erstellt werden. Ich denke, diese Beziehungen werden für schnellere Such- und Filterzwecke erstellt, und es sollte in Ordnung sein, sie zu entfernen. Danke noch einmal.
d.yuk
@ d.yuk Ich versuche das gleiche zu erreichen. Könnten Sie posten, wie Sie dies mit dem Indexer erreicht haben?
Aaron Pollock
1
@ AaronPollock Ich habe die Frage bearbeitet und die Methode dort platziert. Hoffe es könnte helfen. Viel Glück!
d.yuk
7

Update: So verhindern Sie, dass der Indexer untergeordnete Produkte einschließt

  1. Erweitern und ändern Mage_Catalog_Model_Resource_Product_Indexer_Eav_Abstract.
  2. Suchen Sie nach der Funktion _prepareRelationIndex().
  3. Ändern Sie die SQL Query Builder-Anweisung wie folgt:

Code:

$select = $write->select()
    ->from(array('l' => $this->getTable('catalog/product_relation')), 'parent_id')
    ->join(
        array('cs' => $this->getTable('core/store')),
        '',
        array())
    ->join(
        array('i' => $idxTable),
        'l.child_id = i.entity_id AND cs.store_id = i.store_id',
        array('attribute_id', 'store_id', 'value'))
    ->join(
        array('e' => 'catalog_product_entity'),
        'l.parent_id = e.entity_id',
        array())
    ->group(array(
        'l.parent_id', 'i.attribute_id', 'i.store_id', 'i.value'
    ))
    ->where('e.type_id != ?', 'bundle');

So verhindern Sie, dass der Indexer untergeordnete Produkte einschließt Referenz : Hinzufügen von rot hervorgehobenen Codes

d.yuk
quelle