Ordinamento degli attributi del prodotto configurabile nel menu a discesa 2.12


9

L'ordine del menu a discesa non è coerente con l'ordine dell'attributo stesso. Nelle dimensioni dell'attributo l'ho ordinato Newborn 0-3 mesi

e nel menu a discesa viene visualizzato come 0-3 Neonato

la taglia Newborn è stata aggiunta pochi giorni dopo le altre taglie e i prodotti semplici neonati sono stati importati dopo lo 0-3 mesi. Qualche suggerimento su come ottenere l'ordine del menu a discesa per seguire l'ordine dell'elenco all'interno dell'attributo? Ho cancellato la cache e reindicizzato. Ho letto che @Khoa TruongDinh ha avuto lo stesso problema ma non ho visto una soluzione al problema, quindi ripubblo.


inoltre, esistono già i prodotti con attributi con dimensione 0-3 e sto aggiungendo tutti i prodotti con attributi con dimensione Newborn.
babywit

Risposte:


14

Ho riscontrato lo stesso problema di ordinamento delle opzioni di attributo in front-end, poiché ho verificato questo problema e ho scoperto che durante il recupero delle opzioni di attributo non è stato aggiunto alcun filtro di ordinamento nella query per impostazione predefinita in Magento 2.1.2, quindi per risolvere questo problema è necessario per aggiungere il codice qui sotto per aggiungere l'ORDINE By in funzione getAttributeOptions sulla riga n. 282 nel file: vendor / magento / module-configurable-product / Model / ResourceModel / Product / Type / Configurable.php Ora, funziona bene per me.

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

Se non riesci a modificare il codice, sostituisci questa funzione getAttributeOptions con il codice come di seguito:

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

grazie mille per questo, ma non sono esperto di php. Non sono sicuro di dove aggiungere la tua correzione. Questo è quello che ho da 280-282 e ho provato ad aggiungerlo prima di; il 282 ma questo non ha funzionato. 280 'attributo.attributo_id =?', 281 $ superAttribute-> getAttributeId () 282);
babywit

se non riesci a modificare il codice, ti preghiamo di sostituirlo
Jagdish Ram

Qualcuno ha scritto un'estensione che applica questa patch?
TheNorthern_Light,

Inoltre, questo non sembra funzionare in 2.1.9.
TheNorthern_Light,

In 2.1.14 la funzionalità è stata spostata in Magento\ConfigurableProduct\Model\AttributeOptionProvider. Sembra risolto a prima vista, ma non sono sicuro di possibili bug.
simonthesorcerer

3
  1. Vai alla pagina Prodotto configurabile -> Modifica configurazione -> Fai clic su successivo-successivo - successivo e non modificare nulla
  2. Quindi salvare il prodotto e dovrebbero essere in ordine.

Aggiorna o salva il prodotto?
Lasantha,

Come farlo con oltre 300 prodotti?
Mohammed Joraid,

In realtà, aprendo solo la pagina di modifica del prodotto configurabile, e quindi solo il salvataggio, si risolve direttamente l'ordinamento. Quindi 1- Apri il prodotto 2- Fai clic su Salva. Ma come farlo funzionare senza andare a tutti i prodotti manualmente e salvarli. Ho provato ad aggiungere tutti i prodotti al sito sperando che si inneschi un evento di salvataggio ma l'ordinamento non è stato risolto. usando MAG2.2.2
Mohammed Joraid il

1

Se intendi che Newborn è un valore di attributo, devi andare in Negozi -> Attributi (Prodotto) , trovare l'attributo necessario e anche trascinare e rilasciare con il mouse per cambiare la posizione delle opzioni. inserisci qui la descrizione dell'immagine

La posizione dei menu a discesa stessi (dimensioni, colore, forma) può essere impostata durante la generazione di prodotti associati. Apri il modulo di modifica -> Impostazioni avanzate -> Modifica configurazioni - Passo valori degli attributi e con l'aiuto degli attributi di trascinamento della selezione inserisci qui la descrizione dell'immagine


Si, esattamente. "All'interno della dimensione dell'attributo l'ho ordinato Newborn 0-3 mesi" Quindi all'interno dell'attributo stesso Newborn è SOPRA 0-3 mesi e nel menu a discesa del prodotto viene visualizzato con 0-3 mesi SOPRA Newborn.
babywit

Per quanto ne so, l'ordinamento all'interno dell'attributo stesso non funziona correttamente in Magento 2.1.2
babywit

Qualcuno ha idea di cosa sta causando questo problema con l'ordine degli attributi che non vengono visualizzati nell'ordine elencato nell'attributo o una soluzione alternativa per far sì che gli attributi vengano visualizzati nell'ordine corretto? Voglio lanciare il mio negozio ma questo mi sta facendo impazzire.
babywit


1

Poiché questo problema è ancora presente anche nell'ultima versione 2.1.7, è possibile utilizzare questa soluzione alternativa:

Vai alla pagina del prodotto configurabile-> Configurazioni-> rimuovi tutti i prodotti semplici

Dopodiché aggiungili di nuovo nell'ordine desiderato:

Aggiungi prodotti manualmente-> Filtra prodotti per nome-> Aggiungi prodotti semplici nell'ordine desiderato.


1

In v2.3.x è possibile ordinare l'ordine degli attributi in base all'etichetta dell'opzione in un selettore a discesa del prodotto configurabile estendendo

Magento\ConfigurableProduct\Model\AttributeOptionProvider

e usando

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

Per ordinare l'array di dati dell'opzione restituita $ data in getAttributeOptions ()


puoi elaborarlo di più?
Kowsigan Atsayam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.