Ordre de tri des attributs de produit configurable dans Dropdown 2.12


9

L'ordre de la liste déroulante n'est pas cohérent avec l'ordre de l'attribut lui-même. Dans la taille de l'attribut, je l'ai commandé nouveau-né 0-3 mois

et dans la liste déroulante, il apparaît comme 0-3 nouveau-né

la taille Newborn a été ajoutée quelques jours après les autres tailles et les produits simples nouveau-nés ont été importés après le 0-3 mois. Des suggestions sur la façon d'obtenir l'ordre de la liste déroulante pour suivre l'ordre de la liste dans l'attribut? J'ai vidé le cache et réindexé. J'ai lu que @Khoa TruongDinh avait le même problème mais n'a pas vu de solution au problème, donc je republie.


aussi, les produits d'attribut avec la taille 0-3 existent déjà et j'ajoute tous les produits d'attribut avec la taille Newborn.
babywit

Réponses:


14

J'ai rencontré le même problème de tri des options d'attribut à l'avant, Comme j'ai vérifié ce problème et constaté que lors de la récupération des options d'attribut, il n'y a pas de filtre de tri ajouté par défaut dans la requête dans Magento 2.1.2, donc pour résoudre ce problème, pour ajouter le code ci-dessous pour ajouter la commande ORDER By dans la fonction getAttributeOptions sur la ligne n ° 282 dans le fichier: vendor / magento / module-configurable-product / Model / ResourceModel / Product / Type / Configurable.php Maintenant, cela fonctionne bien pour moi.

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

Si vous ne pouvez pas modifier le code, veuillez remplacer cette fonction getAttributeOptions par le code ci-dessous:

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

merci beaucoup pour cela mais je ne connais pas bien le php. Je ne sais pas où ajouter votre correctif. C'est ce que j'ai de 280 à 282 et j'ai essayé de l'ajouter avant le; sur 282 mais cela n'a pas fonctionné. 280 'attribute.attribute_id =?', 281 $ superAttribute-> getAttributeId () 282);
babywit

si vous ne parvenez pas à modifier le code, veuillez le remplacer
Jagdish Ram

Quelqu'un a-t-il écrit une extension qui applique ce correctif?
TheN Northern_Light

De plus, cela ne semble pas fonctionner dans 2.1.9.
TheN Northern_Light

Dans 2.1.14, la fonctionnalité a été déplacée vers Magento\ConfigurableProduct\Model\AttributeOptionProvider. Apparence résolue à première vue, mais je ne suis pas sûr des bugs possibles.
simonthesorcerer

3
  1. Accédez à la page du produit configurable -> Modifier la configuration -> Cliquez sur suivant -suivant - suivant et ne changez rien
  2. Ensuite, enregistrez le produit et ils devraient être en ordre.

Actualiser ou enregistrer le produit?
Lasantha

Comment faire cela avec plus de 300 produits?
Mohammed Joraid

En fait, seule l'ouverture de la page de modification du produit configurable, puis l'enregistrement direct corrige directement l'ordre de tri. Donc 1- Ouvrez le produit 2- Cliquez sur enregistrer. Mais comment faire fonctionner cela sans aller à tous les produits manuellement et les enregistrer. J'ai essayé d'ajouter en masse tous les produits au site en espérant que cela déclencherait un événement de sauvegarde, mais le tri n'a pas été corrigé. en utilisant MAG2.2.2
Mohammed Joraid

1

Si vous voulez dire que le nouveau-né est une valeur d'attribut, vous devez aller dans Magasins -> Attributs (Produit) , trouver l'attribut nécessaire et également utiliser le glisser-déposer avec votre souris pour changer la position des options. entrez la description de l'image ici

La position des listes déroulantes elles-mêmes (taille, couleur, forme) peut être définie lors de la génération des produits associés. Ouvrir le formulaire d'édition -> Paramètres avancés -> Modifier les configurations - Étape des valeurs d'attribut et à l'aide des attributs de glisser-déplacer entrez la description de l'image ici


Oui, exactement. "Dans la taille de l'attribut, je l'ai commandé Nouveau-né 0-3 mois" Donc, à l'intérieur de l'attribut lui-même, Nouveau-né est AU-DESSUS de 0-3 mois et dans la liste déroulante des produits, il apparaît avec 0-3 mois AU-DESSUS du nouveau-né.
babywit

Donc, pour autant que je sache, l'ordre dans l'attribut lui-même ne fonctionne pas correctement dans magento 2.1.2
babywit

Quelqu'un a-t-il une idée de ce qui cause ce problème avec l'ordre des attributs n'apparaissant pas dans l'ordre répertorié dans l'attribut ou une solution de contournement pour que les attributs s'affichent dans le bon ordre? Je veux lancer mon magasin mais cela me rend fou.
babywit


1

Étant donné que ce problème est toujours présent également dans la dernière version 2.1.7, vous pouvez utiliser cette solution de contournement:

Accédez à la page du produit configurable-> Configurations-> supprimer tous les produits simples

Après cela, ajoutez-les à nouveau dans l'ordre souhaité:

Ajouter des produits manuellement-> Filtrer les produits par nom-> Ajouter des produits simples dans l'ordre souhaité.


1

Dans v2.3.x, vous pouvez trier l'ordre des attributs par étiquette d'option dans un sélecteur déroulant de produit configurable en étendant

Magento\ConfigurableProduct\Model\AttributeOptionProvider

et en utilisant

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

Pour trier le tableau de données d'option renvoyé $ data dans getAttributeOptions ()


pouvez-vous élaborer davantage?
Kowsigan Atsayam
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.