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.