Konfigurierbare Sortierreihenfolge für Produktattribute in Dropdown 2.12


9

Die Reihenfolge der Dropdown-Liste stimmt nicht mit der Reihenfolge des Attributs selbst überein. Innerhalb der Attributgröße habe ich es Neugeborene 0-3 Monate bestellt

und in der Dropdown-Liste wird es als 0-3 Neugeboren angezeigt

Die Größe Neugeborene wurde einige Tage nach den anderen Größen hinzugefügt und die einfachen Neugeborenenprodukte wurden nach 0-3 Monaten importiert. Irgendwelche Vorschläge, wie Sie die Reihenfolge der Dropdown-Liste ermitteln können, um der Reihenfolge der Liste innerhalb des Attributs zu folgen? Ich habe den Cache geleert und neu indiziert. Ich habe gelesen, dass @Khoa TruongDinh das gleiche Problem hatte, aber keine Lösung für das Problem gesehen hat.


Außerdem sind die Attributprodukte mit der Größe 0-3 bereits vorhanden, und ich füge alle Attributprodukte mit der Größe Newborn hinzu.
Babywit

Antworten:


14

Ich hatte das gleiche Problem beim Sortieren von Attributoptionen im Front-End. Als ich dieses Problem überprüfte und feststellte, dass beim Abrufen der Attributoptionen in Magento 2.1.2 standardmäßig kein Sortierfilter in der Abfrage hinzugefügt wurde, muss dieses Problem behoben werden So fügen Sie den folgenden Code hinzu, um ORDER By in der Funktion getAttributeOptions in Zeile 282 in der Datei hinzuzufügen: vendor / magento / module-configurationable-product / Model / ResourceModel / Product / Type / Configurable.php Jetzt funktioniert es gut für mich.

->joinInner(
        ['attribute_opt' => $this->getTable('eav_attribute_option')],
        'attribute_opt.option_id = entity_value.value',
        []
    )->order(
        'attribute_opt.sort_order ASC'
    );

Wenn Sie den Code nicht bearbeiten können, ersetzen Sie diese Funktion getAttributeOptions durch den folgenden Code:

public function getAttributeOptions($superAttribute, $productId)
{
    $scope  = $this->getScopeResolver()->getScope();
    $select = $this->getConnection()->select()->from(
        ['super_attribute' => $this->getTable('catalog_product_super_attribute')],
        [
            'sku' => 'entity.sku',
            'product_id' => 'product_entity.entity_id',
            'attribute_code' => 'attribute.attribute_code',
            'value_index' => 'entity_value.value',
            'option_title' => $this->getConnection()->getIfNullSql(
                'option_value.value',
                'default_option_value.value'
            ),
            'default_title' => 'default_option_value.value',
        ]
    )->joinInner(
        ['product_entity' => $this->getTable('catalog_product_entity')],
        "product_entity.{$this->getProductEntityLinkField()} = super_attribute.product_id",
        []
    )->joinInner(
        ['product_link' => $this->getTable('catalog_product_super_link')],
        'product_link.parent_id = super_attribute.product_id',
        []
    )->joinInner(
        ['attribute' => $this->getTable('eav_attribute')],
        'attribute.attribute_id = super_attribute.attribute_id',
        []
    )->joinInner(
        ['entity' => $this->getTable('catalog_product_entity')],
        'entity.entity_id = product_link.product_id',
        []
    )->joinInner(
        ['entity_value' => $superAttribute->getBackendTable()],
        implode(
            ' AND ',
            [
                'entity_value.attribute_id = super_attribute.attribute_id',
                'entity_value.store_id = 0',
                "entity_value.{$this->getProductEntityLinkField()} = "
                . "entity.{$this->getProductEntityLinkField()}",
            ]
        ),
        []
    )->joinLeft(
        ['option_value' => $this->getTable('eav_attribute_option_value')],
        implode(
            ' AND ',
            [
                'option_value.option_id = entity_value.value',
                'option_value.store_id = ' . $scope->getId(),
            ]
        ),
        []
    )->joinLeft(
        ['default_option_value' => $this->getTable('eav_attribute_option_value')],
        implode(
            ' AND ',
            [
                'default_option_value.option_id = entity_value.value',
                'default_option_value.store_id = ' . \Magento\Store\Model\Store::DEFAULT_STORE_ID,
            ]
        ),
        []
    )->where(
        'super_attribute.product_id = ?',
        $productId
    )->where(
        'attribute.attribute_id = ?',
        $superAttribute->getAttributeId()
    )->joinInner(
        ['attribute_opt' => $this->getTable('eav_attribute_option')],
        'attribute_opt.option_id = entity_value.value',
        []
    )->order(
        'attribute_opt.sort_order ASC'
    );

    return $this->getConnection()->fetchAll($select);
}

Vielen Dank dafür, aber ich bin nicht gut mit PHP vertraut. Ich bin nicht sicher, wo ich in Ihrem Fix hinzufügen soll. Dies ist, was ich von 280-282 habe und versucht habe, es vor dem hinzuzufügen; auf 282 aber das hat nicht funktioniert. 280 'attribute.attribute_id =?', 281 $ superAttribute-> getAttributeId () 282);
Babywit

Wenn Sie den Code nicht bearbeiten können, ersetzen Sie ihn bitte
Jagdish Ram

Hat jemand eine Erweiterung geschrieben, die diesen Patch anwendet?
TheNorthern_Light

Dies scheint auch in 2.1.9 nicht zu funktionieren.
TheNorthern_Light

In 2.1.14 wurde die Funktionalität auf verschoben Magento\ConfigurableProduct\Model\AttributeOptionProvider. Sieht auf den ersten Blick gelöst aus, ist sich aber nicht sicher über mögliche Fehler.
Simonthesorcerer

3
  1. Gehen Sie zur konfigurierbaren Produktseite -> Konfiguration bearbeiten -> Klicken Sie auf Weiter - Weiter - Weiter und ändern Sie nichts
  2. Speichern Sie dann das Produkt und sie sollten in Ordnung sein.

Produkt aktualisieren oder speichern?
Lasantha

Wie geht das mit über 300 Produkten?
Mohammed Joraid

Wenn Sie nur die konfigurierbare Produktbearbeitungsseite öffnen und dann direkt speichern, wird die Sortierreihenfolge korrigiert. Also 1- Öffnen Sie das Produkt 2- Klicken Sie auf Speichern. Aber wie man das macht, ohne alle Produkte manuell aufzurufen und zu speichern. Ich habe versucht, alle Produkte in großen Mengen zur Site hinzuzufügen, in der Hoffnung, dass sie ein Speicherereignis auslösen, aber die Sortierung wurde nicht behoben. mit MAG2.2.2
Mohammed Joraid

1

Wenn Sie meinen, dass Neugeborenes ein Attributwert ist, müssen Sie zu Stores -> Attribute (Produkt) gehen , das erforderliche Attribut suchen und Drag & Drop mit der Maus verwenden, um die Position der Optionen zu ändern. Geben Sie hier die Bildbeschreibung ein

Die Position der Dropdown-Listen selbst (Größe, Farbe, Form) kann beim Generieren der zugehörigen Produkte festgelegt werden. Öffnen Sie das Bearbeitungsformular -> Erweiterte Einstellungen -> Konfigurationen bearbeiten - Schritt Attributwerte und mithilfe von Drag & Drop-Verschiebungsattributen Geben Sie hier die Bildbeschreibung ein


Ja genau. "Innerhalb der Attributgröße habe ich es bestellt Neugeborene 0-3 Monate" Innerhalb des Attributs selbst ist Neugeborene also ÜBER 0-3 Monate und in der Produkt-Dropdown-Liste wird es mit 0-3 Monaten ÜBER Neugeborenen angezeigt.
Babywit

Soweit ich das beurteilen kann, funktioniert die Reihenfolge innerhalb des Attributs selbst in Magento 2.1.2
Babywit

Hat jemand eine Idee, was dieses Problem verursacht, wenn die Reihenfolge der Attribute nicht in der im Attribut angegebenen Reihenfolge angezeigt wird, oder eine Problemumgehung, damit die Attribute in der richtigen Reihenfolge angezeigt werden? Ich möchte meinen Laden eröffnen, aber das macht mich verrückt.
Babywit


1

Da dieses Problem auch in der neuesten Version 2.1.7 weiterhin besteht, können Sie diese Problemumgehung verwenden:

Gehen Sie zur konfigurierbaren Produktseite-> Konfigurationen-> entfernen Sie alle einfachen Produkte

Danach fügen Sie sie erneut in der gewünschten Reihenfolge hinzu:

Produkte manuell hinzufügen-> Produkte nach Namen filtern-> Einfache Produkte in der gewünschten Reihenfolge hinzufügen .


1

In Version 2.3.x können Sie die Reihenfolge der Attribute nach Optionsbezeichnung in einer konfigurierbaren Produkt-Dropdown-Auswahl sortieren, indem Sie sie erweitern

Magento\ConfigurableProduct\Model\AttributeOptionProvider

und mit

usort($data, function($a, $b) {
    return $a['option_title'] <=> $b['option_title'];
});

So sortieren Sie das zurückgegebene Optionsdatenarray $ data in getAttributeOptions ()


Kannst du es näher erläutern?
Kowsigan Atsayam
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.