Konfigurowalna kolejność sortowania atrybutów produktu w menu rozwijanym 2.12


9

Kolejność listy rozwijanej nie jest zgodna z kolejnością samego atrybutu. W ramach wielkości atrybutu mam to zamówione Newborn 0-3 miesięcy

aw menu rozwijanym pojawia się jako 0-3 Noworodek

rozmiar Noworodka dodano kilka dni po innych rozmiarach, a noworodka proste produkty importowano po 0-3 miesiącach. Wszelkie sugestie dotyczące sposobu uporządkowania listy rozwijanej w celu śledzenia kolejności listy w atrybucie? Wyczyściłem pamięć podręczną i ponownie zindeksowałem. Przeczytałem, że @Khoa TruongDinh miał ten sam problem, ale nie widziałem rozwiązania problemu, więc przesyłam ponownie.


również produkty atrybutów o rozmiarze 0-3 już istnieją i dodam wszystkie produkty atrybutów o rozmiarze Noworodka.
babywit,

Odpowiedzi:


14

Napotkałem ten sam problem z sortowaniem opcji atrybutów w interfejsie, ponieważ sprawdziłem ten problem i stwierdziłem, że podczas pobierania opcji atrybutów w zapytaniu w Magento 2.1.2 nie ma dodanego filtru sortowania, więc aby rozwiązać ten problem, potrzebujesz aby dodać poniższy kod w celu dodania ZAMÓWIENIA W funkcji getAttributeOptions w wierszu nr 282 w pliku: vendor / magento / module-configurable-product / Model / ResourceModel / Product / Type / Configurable.php Teraz działa dla mnie dobrze.

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

Jeśli nie możesz edytować kodu, zastąp tę funkcję getAttributeOptions kodem jak poniżej:

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);
}

dziękuję bardzo za to, ale nie jestem dobrze zorientowany w php. Nie jestem pewien, gdzie dodać poprawkę. To właśnie mam z 280-282 i próbowałem dodać to przed; na 282, ale to nie zadziałało. 280 'attribute.attribute_id =?', 281 $ superAttribute-> getAttributeId () 282);
babywit

jeśli nie możesz edytować kodu, zastąp go
Jagdish Ram

Czy ktoś napisał rozszerzenie, które stosuje tę poprawkę?
TheNorthern_Light

Ponadto wydaje się, że to nie działa w 2.1.9.
TheNorthern_Light

W 2.1.14 funkcjonalność została przeniesiona do Magento\ConfigurableProduct\Model\AttributeOptionProvider. Wygląda na rozwiązany na pierwszy rzut oka, ale nie jestem pewien możliwych błędów.
simonthesorcerer

3
  1. Przejdź do strony Konfigurowalnego produktu -> Edytuj konfigurację -> Kliknij przycisk Dalej - Dalej - Dalej i niczego nie zmieniaj
  2. Następnie zapisz produkt i powinny być w porządku.

Odśwież czy zapisać produkt?
Lasantha

Jak to zrobić z ponad 300 produktami?
Mohammed Joraid

Właściwie tylko otwarcie konfigurowalnej strony edycji produktu, a następnie zapisanie bezpośrednio naprawia kolejność sortowania. Tak 1- Otwórz produkt 2- Kliknij Zapisz. Ale jak sprawić, by działało to bez konieczności ręcznego przechodzenia do wszystkich produktów i ich zapisywania. Próbowałem zbiorczo dodać cały produkt do witryny, mając nadzieję, że spowoduje to zapisanie zdarzenia, ale sortowanie nie zostało naprawione. przy użyciu MAG2.2.2
Mohammed Joraid

1

Jeśli masz na myśli, że Noworodek jest wartością atrybutu, musisz przejść do Sklepów -> Atrybuty (Produkt) , znaleźć potrzebny atrybut, a także przeciągnij i upuść za pomocą myszy, zmieniając pozycję opcji. wprowadź opis zdjęcia tutaj

Pozycję samych menu rozwijanych (rozmiar, kolor, kształt) można ustawić podczas generowania powiązanych produktów. Otwórz formularz edycji -> Ustawienia zaawansowane -> Edytuj konfiguracje - Krok wartości atrybutów oraz za pomocą atrybutów przeciągnij i upuść wprowadź opis zdjęcia tutaj


Tak, dokładnie. „W ramach rozmiaru atrybutu mam zamówione dla Noworodka 0-3 miesięcy” Tak więc w samym atrybucie Noworodek wynosi POWYŻEJ 0-3 miesięcy, aw menu rozwijanym produktu pojawia się z 0-3 miesięcy POWYŻEJ Noworodka.
babywit

O ile mogę stwierdzić, porządkowanie w obrębie samego atrybutu nie działa poprawnie w magento 2.1.2
babywit

Czy ktoś ma pojęcie, co powoduje ten problem, gdy kolejność atrybutów nie wyświetla się w kolejności wymienionej w atrybucie lub sposób obejścia problemu, aby atrybuty były wyświetlane we właściwej kolejności? Chcę uruchomić mój sklep, ale to mnie pobudza.
babywit


1

Ponieważ ten problem występuje nadal również w najnowszej wersji 2.1.7, można skorzystać z tego obejścia:

Przejdź do strony konfigurowalnego produktu-> Konfiguracje-> usuń wszystkie proste produkty

Następnie dodaj je ponownie w żądanej kolejności:

Dodaj produkty ręcznie-> Filtruj produkty według nazwy-> Dodaj proste produkty w żądanej kolejności.


1

W wersji 2.3.x można sortować kolejność atrybutów według etykiety opcji w konfigurowalnym selektorze rozwijanym produktu, rozszerzając

Magento\ConfigurableProduct\Model\AttributeOptionProvider

i za pomocą

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

Aby posortować zwróconą tablicę danych opcji $ data w getAttributeOptions ()


czy możesz to bardziej rozwinąć?
Kowsigan Atsayam
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.