Tri par attribut de produit configurable Magento 1.9.1

24

Comme je l'ai déjà mentionné, il semble y avoir un problème avec magento 1.9.1 et le tri des attributs des produits configurables. Les options d'un produit configurable dépendent désormais TOUJOURS de l'ID produit du produit simple. L'ordre des options d'attribut est ignoré.

Je suis retourné à magento 1.9.0.1. Peut-être que quelqu'un peut déterminer comment le tri dans 1.9.1 est effectué. Ce serait génial pour tous ceux qui utilisent des produits configurables pour résoudre ce problème.

Si quelqu'un veut voir ça, vous pouvez le faire ici dans la boutique de démonstration de magento. Je n'ai pas pu trier les tailles correctement.

Reinsch
la source

Réponses:

25

Remarque: Il a été porté à mon attention que cette solution ne fonctionne pas pour Magento 1.9.2. Afin de faire gagner du temps aux autres, je tiens à le signaler en haut de cet article. Si je développe ma propre solution ou trouve la solution de quelqu'un d'autre qui fonctionne pour 1.9.2, je mettrai à jour ce message à ce moment-là.

Remarque: La solution présentée ici étend un fichier de classe de bloc dans la bibliothèque principale de Magento. J'ai examiné le code source de Magento avant cette approche et déterminé qu'il n'y avait pas un bon événement à observer pour éviter cette approche. Si dans une future version de Magento ce problème de tri est résolu, vous pouvez annuler ces modifications ci-dessous simplement en désactivant l'extension dans son fichier XML app / etc / modules.

Étape 1: créez le fichier app / etc / modules / FirstScribe_CatalogOptionSortFix.xml

Contenu:

<?xml version="1.0"?>
<config>
    <modules>
        <FirstScribe_CatalogOptionSortFix>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
            </depends>
        </FirstScribe_CatalogOptionSortFix>
    </modules>
</config>

Remarque: Pour les étapes 2 et 3, créez des répertoires pour ces fichiers si nécessaire. Par exemple, vous pouvez déjà avoir le répertoire app / code / local , ou pas, selon les extensions que vous avez déjà installées sur votre site.

Étape 2: Créez le fichier app / code / local / FirstScribe / CatalogOptionSortFix / etc / config.xml

Contenu:

<?xml version="1.0"?>
<!--
/**
 * Magento 1.9.1.0 has a bug in that the configurable options are sorted by
 * ID rather than position for the Configurable Product's front end view script.
 * This extension addresses this problem.
 *
 * @category    FirstScribe
 * @package     FirstScribe_CatalogOptionSortFix
 * @version     2014.12.15
 */
-->
<config>
    <modules>
        <FirstScribe_CatalogOptionSortFix>
            <version>1.0.0</version>
        </FirstScribe_CatalogOptionSortFix>
    </modules>
    <global>
        <blocks>
            <catalog>
                <rewrite>
                    <product_view_type_configurable>FirstScribe_CatalogOptionSortFix_Block_Product_View_Type_Configurable</product_view_type_configurable>
                </rewrite>
            </catalog>
        </blocks>
    </global>
</config>

Étape 3: créer le fichier app / code / local / FirstScribe / CatalogOptionSortFix / Block / Product / View / Type / Configurable.php

Contenu:

<?php
/**
 * Magento 1.9.1.0 has a bug in that the configurable options are sorted by
 * ID rather than position for the Configurable Product's front end view script.
 * This extension addresses this problem.
 *
 * @category    FirstScribe
 * @package     FirstScribe_CatalogOptionSortFix
 * @version     2014.12.15
 */
class FirstScribe_CatalogOptionSortFix_Block_Product_View_Type_Configurable extends Mage_Catalog_Block_Product_View_Type_Configurable
{
    /**
     * @var Magento_Db_Adapter_Pdo_Mysql
     */
    protected $_read;

    /**
     * @var string
     */
    protected $_tbl_eav_attribute_option;

    /**
     * Composes configuration for js
     *
     * @version 2014.12.15 - Addition of this line:
     *    $info['options'] = $this->_sortOptions($info['options']);
     *
     * @return string
     */
    public function getJsonConfig()
    {
        $attributes = array();
        $options    = array();
        $store      = $this->getCurrentStore();
        $taxHelper  = Mage::helper('tax');
        $currentProduct = $this->getProduct();

        $preconfiguredFlag = $currentProduct->hasPreconfiguredValues();
        if ($preconfiguredFlag) {
            $preconfiguredValues = $currentProduct->getPreconfiguredValues();
            $defaultValues       = array();
        }

        foreach ($this->getAllowProducts() as $product) {
            $productId  = $product->getId();

            foreach ($this->getAllowAttributes() as $attribute) {
                $productAttribute   = $attribute->getProductAttribute();
                $productAttributeId = $productAttribute->getId();
                $attributeValue     = $product->getData($productAttribute->getAttributeCode());
                if (!isset($options[$productAttributeId])) {
                    $options[$productAttributeId] = array();
                }

                if (!isset($options[$productAttributeId][$attributeValue])) {
                    $options[$productAttributeId][$attributeValue] = array();
                }
                $options[$productAttributeId][$attributeValue][] = $productId;
            }
        }

        $this->_resPrices = array(
            $this->_preparePrice($currentProduct->getFinalPrice())
        );

        foreach ($this->getAllowAttributes() as $attribute) {
            $productAttribute = $attribute->getProductAttribute();
            $attributeId = $productAttribute->getId();
            $info = array(
                    'id'        => $productAttribute->getId(),
                    'code'      => $productAttribute->getAttributeCode(),
                    'label'     => $attribute->getLabel(),
                    'options'   => array()
            );

            $optionPrices = array();
            $prices = $attribute->getPrices();
            if (is_array($prices)) {
                foreach ($prices as $value) {
                    if(!$this->_validateAttributeValue($attributeId, $value, $options)) {
                        continue;
                    }
                    $currentProduct->setConfigurablePrice(
                            $this->_preparePrice($value['pricing_value'], $value['is_percent'])
                    );
                    $currentProduct->setParentId(true);
                    Mage::dispatchEvent(
                            'catalog_product_type_configurable_price',
                            array('product' => $currentProduct)
                    );
                    $configurablePrice = $currentProduct->getConfigurablePrice();

                    if (isset($options[$attributeId][$value['value_index']])) {
                        $productsIndex = $options[$attributeId][$value['value_index']];
                    } else {
                        $productsIndex = array();
                    }

                    $info['options'][] = array(
                            'id'        => $value['value_index'],
                            'label'     => $value['label'],
                            'price'     => $configurablePrice,
                            'oldPrice'  => $this->_prepareOldPrice($value['pricing_value'], $value['is_percent']),
                            'products'  => $productsIndex,
                    );
                    $optionPrices[] = $configurablePrice;
                }
            }

            // CALL SORT ORDER FIX
            $info['options'] = $this->_sortOptions($info['options']);

            /**
             * Prepare formated values for options choose
             */
            foreach ($optionPrices as $optionPrice) {
                foreach ($optionPrices as $additional) {
                    $this->_preparePrice(abs($additional-$optionPrice));
                }
            }
            if($this->_validateAttributeInfo($info)) {
                $attributes[$attributeId] = $info;
            }

            // Add attribute default value (if set)
            if ($preconfiguredFlag) {
                $configValue = $preconfiguredValues->getData('super_attribute/' . $attributeId);
                if ($configValue) {
                    $defaultValues[$attributeId] = $configValue;
                }
            }
        }

        $taxCalculation = Mage::getSingleton('tax/calculation');
        if (!$taxCalculation->getCustomer() && Mage::registry('current_customer')) {
            $taxCalculation->setCustomer(Mage::registry('current_customer'));
        }

        $_request = $taxCalculation->getDefaultRateRequest();
        $_request->setProductClassId($currentProduct->getTaxClassId());
        $defaultTax = $taxCalculation->getRate($_request);

        $_request = $taxCalculation->getRateRequest();
        $_request->setProductClassId($currentProduct->getTaxClassId());
        $currentTax = $taxCalculation->getRate($_request);

        $taxConfig = array(
                'includeTax'        => $taxHelper->priceIncludesTax(),
                'showIncludeTax'    => $taxHelper->displayPriceIncludingTax(),
                'showBothPrices'    => $taxHelper->displayBothPrices(),
                'defaultTax'        => $defaultTax,
                'currentTax'        => $currentTax,
                'inclTaxTitle'      => Mage::helper('catalog')->__('Incl. Tax')
        );

        $config = array(
                'attributes'        => $attributes,
                'template'          => str_replace('%s', '#{price}', $store->getCurrentCurrency()->getOutputFormat()),
                'basePrice'         => $this->_registerJsPrice($this->_convertPrice($currentProduct->getFinalPrice())),
                'oldPrice'          => $this->_registerJsPrice($this->_convertPrice($currentProduct->getPrice())),
                'productId'         => $currentProduct->getId(),
                'chooseText'        => Mage::helper('catalog')->__('Choose an Option...'),
                'taxConfig'         => $taxConfig
        );

        if ($preconfiguredFlag && !empty($defaultValues)) {
            $config['defaultValues'] = $defaultValues;
        }

        $config = array_merge($config, $this->_getAdditionalConfig());    

        return Mage::helper('core')->jsonEncode($config);
    }

    /**
     * Sort the options based off their position.
     *
     * @param array $options
     * @return array
     */
    protected function _sortOptions($options)
    {
        if (count($options)) {
            if (!$this->_read || !$this->_tbl_eav_attribute_option) {
                $resource = Mage::getSingleton('core/resource');

                $this->_read = $resource->getConnection('core_read');
                $this->_tbl_eav_attribute_option = $resource->getTableName('eav_attribute_option');
            }

            // Gather the option_id for all our current options
            $option_ids = array();
            foreach ($options as $option) {
                $option_ids[] = $option['id'];

                $var_name  = 'option_id_'.$option['id'];
                $$var_name = $option;
            }

            $sql    = "SELECT `option_id` FROM `{$this->_tbl_eav_attribute_option}` WHERE `option_id` IN('".implode('\',\'', $option_ids)."') ORDER BY `sort_order`";
            $result = $this->_read->fetchCol($sql);

            $options = array();
            foreach ($result as $option_id) {
                $var_name  = 'option_id_'.$option_id;
                $options[] = $$var_name;
            }
        }

        return $options;
    }
}

Étape 4: Si activé, actualisez le type de cache "Configuration" de Magento sous Système -> Gestion du cache du panneau d'administration.

Présentation de l'extension

  1. Étendez la classe Mage_Catalog_Block_Product_View_Type_Configurable.
  2. Ajoutez une méthode pour trier les options selon leur positionvaleur en extrayant ces informations de la base de données.
  3. Réécrivez la méthode getJsonConfig pour appeler notre nouvelle fonction après avoir rassemblé les options d'un attribut.
Darren Felton
la source
2
fonctionne à merveille et je suis heureux que la solution n'affecte pas les futures mises à niveau - merci beaucoup pour une solution viable.
dawhoo
Hé @Meogi, même si votre correction semble parfaite pour les valeurs d'attribut, sommes-nous sûrs que tout est en ordre pour les boîtes de sélection de produits elles-mêmes? Vous avez remarqué un problème avec leur classement dans la façon dont ils sont définis dans l'ensemble d'attributs. Par exemple, nous avons fait glisser "Couleur" au-dessus de "Taille" dans l'ensemble d'attributs, mais 1.9.1 a commuté les deux (ignoré l'ordre). La seule façon de résoudre ce problème était de modifier le produit lui-même et de faire glisser la commande dans le configurable. Peut-être que c'était juste un produit escroc qui avait été accidentellement réorganisé manuellement auparavant?
Joe
1
@Joe Si je ne me trompe pas, faire glisser l'attribut vers le haut / le bas dans l'ensemble d'attributs n'affecte pas l'ordre dans lequel ils sont affichés sur la page de détail du produit frontal. Au lieu de cela, vous devez aller dans Catalogue -> Attributs -> Gérer les attributs, trouver votre attribut et modifier la valeur "Position". Cela affectera à la fois l'ordre d'affichage des attributs configurables sur la page du produit ainsi que la navigation en couches. L'ordre des options configurables peut également être remplacé par produit, en accédant à l'onglet "Produits associés" dans l'administrateur et en faisant glisser les attributs vers le haut / bas.
Darren Felton
1
@Meogi, c'est uniquement pour la position du bloc de navigation en couches, lorsque vous activez "Utiliser dans la navigation en couches".
Joe
@Joe, je vois, eh bien je ne sais pas comment changer les paramètres par défaut (peut-être qu'il a toujours été son placement dans l'ensemble d'attributs, je ne suis pas sûr). Je peux affirmer que sur une installation de Magento 1.9.1.0, je pouvais toujours le régler dans un ordre de mon choix en cliquant / faisant glisser vers le haut / bas dans l'onglet "Produits associés" du produit configurable. Où ils sont répertoriés entre le formulaire de création rapide et la grille de produits en bas.
Darren Felton
11

Juste pour ajouter mes deux cents, les deux autres réponses ont bien fait de me pointer dans la direction de fix, mais je pensais que je l'attaquerais à la source plutôt qu'au point de présentation du bloc.

Vous pouvez obtenir le même résultat en étendant le Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collectionmodèle_loadPrices() méthode , qui malgré le nom est l'endroit où une modification a été effectuée (vraisemblablement pour les performances), ce qui entraîne le classement des attributs par ID plutôt que par pertinence.

La modification semble avoir été apportée pour éviter l'imbrication foreach instructions , mais à son tour perd également l'ordre correct. Cette solution modifie légèrement la logique mise à jour pour suivre les options d'attribut, puis effectue une autre boucle basée sur l'ordre d'origine pour réellement effectuer l'ajout.

Voici une procédure ajustée similaire à la réponse de meogi ci - dessus :


Étape 1: enregistrer un nouveau module

Remarque: si vous en avez déjà un, réutilisez-en un existant.

# File: app/etc/modules/YourCompany_AttributeFix.xml
<?xml version="1.0"?>
<config>
    <modules>
        <YourCompany_AttributeFix>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
            </depends>
        </YourCompany_AttributeFix>
    </modules>
</config>

Étape 2: créer la configuration du module

# File: app/code/local/YourCompany/AttributeFix/etc/config.xml
<?xml version="1.0"?>
<config>
    <modules>
        <YourCompany_AttributeFix>
            <version>0.1.0</version>
        </YourCompany_AttributeFix>
    </modules>    
    <global>
        <models>
            <catalog_resource>
                <rewrite>
                    <product_type_configurable_attribute_collection>YourCompany_AttributeFix_Model_Resource_Product_Type_Configurable_Attribute_Collection</product_type_configurable_attribute_collection>
                </rewrite>
            </catalog_resource>
        </models>
    </global>
</config>

Étape 3: ajouter l'extension de modèle de ressource

# File: app/code/local/YourCompany/AttributeFix/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
/**
 * Catalog Configurable Product Attribute Collection - overridden to re-enable the attribute option
 * sorting by relevance rather than by ID as changed in the Magento core class
 */
class YourCompany_AttributeFix_Model_Resource_Product_Type_Configurable_Attribute_Collection
    extends Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection
{
    /**
     * Load attribute prices information
     *
     * @return Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection
     */
    protected function _loadPrices()
    {
        if ($this->count()) {
            $pricings = array(
                0 => array()
            );

            if ($this->getHelper()->isPriceGlobal()) {
                $websiteId = 0;
            } else {
                $websiteId = (int)Mage::app()->getStore($this->getStoreId())->getWebsiteId();
                $pricing[$websiteId] = array();
            }

            $select = $this->getConnection()->select()
                ->from(array('price' => $this->_priceTable))
                ->where('price.product_super_attribute_id IN (?)', array_keys($this->_items));

            if ($websiteId > 0) {
                $select->where('price.website_id IN(?)', array(0, $websiteId));
            } else {
                $select->where('price.website_id = ?', 0);
            }

            $query = $this->getConnection()->query($select);

            while ($row = $query->fetch()) {
                $pricings[(int)$row['website_id']][] = $row;
            }

            $values = array();

            foreach ($this->_items as $item) {
                $productAttribute = $item->getProductAttribute();
                if (!($productAttribute instanceof Mage_Eav_Model_Entity_Attribute_Abstract)) {
                    continue;
                }
                $options = $productAttribute->getFrontend()->getSelectOptions();

                $optionsByValue = array();
                foreach ($options as $option) {
                    $optionsByValue[$option['value']] = $option['label'];
                }

                /**
                 * Modification to re-enable the sorting by relevance for attribute options
                 * @author Robbie Averill <[email protected]>
                 */
                $toAdd = array();
                foreach ($this->getProduct()->getTypeInstance(true)
                             ->getUsedProducts(array($productAttribute->getAttributeCode()), $this->getProduct())
                         as $associatedProduct) {

                    $optionValue = $associatedProduct->getData($productAttribute->getAttributeCode());

                    if (array_key_exists($optionValue, $optionsByValue)) {
                        $toAdd[] = $optionValue;
                    }
                }

                // Add the attribute options, but in the relevant order rather than by ID
                foreach (array_intersect_key($optionsByValue, array_flip($toAdd)) as $optionValueKey => $optionValue) {
                    // If option available in associated product
                    if (!isset($values[$item->getId() . ':' . $optionValue])) {
                        // If option not added, we will add it.
                        $values[$item->getId() . ':' . $optionValueKey] = array(
                            'product_super_attribute_id' => $item->getId(),
                            'value_index'                => $optionValueKey,
                            'label'                      => $optionsByValue[$optionValueKey],
                            'default_label'              => $optionsByValue[$optionValueKey],
                            'store_label'                => $optionsByValue[$optionValueKey],
                            'is_percent'                 => 0,
                            'pricing_value'              => null,
                            'use_default_value'          => true
                        );
                    }
                }
                /**
                 * End attribute option order modification
                 * @author Robbie Averill <[email protected]>
                 */
            }

            foreach ($pricings[0] as $pricing) {
                // Addding pricing to options
                $valueKey = $pricing['product_super_attribute_id'] . ':' . $pricing['value_index'];
                if (isset($values[$valueKey])) {
                    $values[$valueKey]['pricing_value']     = $pricing['pricing_value'];
                    $values[$valueKey]['is_percent']        = $pricing['is_percent'];
                    $values[$valueKey]['value_id']          = $pricing['value_id'];
                    $values[$valueKey]['use_default_value'] = true;
                }
            }

            if ($websiteId && isset($pricings[$websiteId])) {
                foreach ($pricings[$websiteId] as $pricing) {
                    $valueKey = $pricing['product_super_attribute_id'] . ':' . $pricing['value_index'];
                    if (isset($values[$valueKey])) {
                        $values[$valueKey]['pricing_value']     = $pricing['pricing_value'];
                        $values[$valueKey]['is_percent']        = $pricing['is_percent'];
                        $values[$valueKey]['value_id']          = $pricing['value_id'];
                        $values[$valueKey]['use_default_value'] = false;
                    }
                }
            }

            foreach ($values as $data) {
                $this->getItemById($data['product_super_attribute_id'])->addPrice($data);
            }
        }
        return $this;
    }
}

Étape 4: vider votre cache


Pour référence , la modification réelle de la classe de base dans un git diffserait ci-dessous (ne modifiez pas directement les fichiers de base!):

diff --git a/app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php b/app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
index 135d9d3..4d2a59b 100644
--- a/app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
+++ b/app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
@@ -254,6 +254,11 @@ class Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection
                     $optionsByValue[$option['value']] = $option['label'];
                 }

+                /**
+                 * Modification to re-enable the sorting by relevance for attribute options
+                 * @author Robbie Averill <[email protected]>
+                 */
+                $toAdd = array();
                 foreach ($this->getProduct()->getTypeInstance(true)
                              ->getUsedProducts(array($productAttribute->getAttributeCode()), $this->getProduct())
                          as $associatedProduct) {
@@ -261,22 +266,31 @@ class Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection
                     $optionValue = $associatedProduct->getData($productAttribute->getAttributeCode());

                     if (array_key_exists($optionValue, $optionsByValue)) {
-                        // If option available in associated product
-                        if (!isset($values[$item->getId() . ':' . $optionValue])) {
-                            // If option not added, we will add it.
-                            $values[$item->getId() . ':' . $optionValue] = array(
-                                'product_super_attribute_id' => $item->getId(),
-                                'value_index'                => $optionValue,
-                                'label'                      => $optionsByValue[$optionValue],
-                                'default_label'              => $optionsByValue[$optionValue],
-                                'store_label'                => $optionsByValue[$optionValue],
-                                'is_percent'                 => 0,
-                                'pricing_value'              => null,
-                                'use_default_value'          => true
-                            );
-                        }
+                        $toAdd[] = $optionValue;
                     }
                 }
+
+                // Add the attribute options, but in the relevant order rather than by ID
+                foreach (array_intersect_key($optionsByValue, array_flip($toAdd)) as $optionValueKey => $optionValue) {
+                    // If option available in associated product
+                    if (!isset($values[$item->getId() . ':' . $optionValue])) {
+                        // If option not added, we will add it.
+                        $values[$item->getId() . ':' . $optionValueKey] = array(
+                            'product_super_attribute_id' => $item->getId(),
+                            'value_index'                => $optionValueKey,
+                            'label'                      => $optionsByValue[$optionValueKey],
+                            'default_label'              => $optionsByValue[$optionValueKey],
+                            'store_label'                => $optionsByValue[$optionValueKey],
+                            'is_percent'                 => 0,
+                            'pricing_value'              => null,
+                            'use_default_value'          => true
+                        );
+                    }
+                }
+                /**
+                 * End attribute option order modification
+                 * @author Robbie Averill <[email protected]>
+                 */
             }

             foreach ($pricings[0] as $pricing) {

C'est également sur GitHub si quelqu'un le veut pour référence.

Edit: J'ai également enregistré cela comme un bug avec Magento .

Robbie Averill
la source
1
Super contribution mon ami. +1 (ouais, je ne suis pas censé utiliser ces commentaires pour dire merci mais vous l'avez tué donc je dois haha)
Darren Felton
Je l'ai essayé avec magento 1.9.2 - ne semble malheureusement pas fonctionner. Et je ne comprends pas pourquoi ce bogue n'est toujours pas corrigé par Magento.
Reinsch
Vous êtes-vous assuré que votre module est correctement configuré? Je suis sûr qu'ils en sont conscients, mais c'est probablement quelque chose qui prendrait du temps à vérifier avant de publier un correctif, car c'est une partie très importante du système. Edit: Vous pouvez également tester le correctif directement (et temporairement) mais en copiant le patch directement dans la classe principale (temporairement)
Robbie Averill
1
@Reinsch Je viens de recevoir un e-mail de quelqu'un concernant l'incompatibilité avec CE 1.9.2 - j'ai poussé une mise à jour de mon référentiel Github et l' ai testée sur CE 1.9.2 avec des exemples de données Magento et cela fonctionne correctement maintenant
Robbie Averill
1
Excellent travail @RobbieAverill - merci beaucoup. Testé et confirmé sur un site Web Magento 1.9.2.1.
zigojacko
3

Ce n'est pas vraiment un correctif correct, mais c'est ce que j'ai fait temporairement pour éviter d'avoir à revenir à 1.9.0.1 jusqu'à ce que la prochaine version de Magento corrige, espérons-le, correctement. Il triera les valeurs des options par ordre alphabétique, vous pouvez bien sûr trier par tout ce que vous voulez mais je ne sais pas comment accéder à l'ordre de tri défini dans le backend et par ordre alphabétique est assez bon pour mes besoins.

Changer le fichier

/app/code/core/Mage/Catalog/Block/Product/View/Type/configurable.php

Changer la ligne 215

if($this->_validateAttributeInfo($info)) {
   $attributes[$attributeId] = $info;
}

à

usort($info['options'], function ($a,$b)
    {
        return strcmp($a['label'],$b['label']);
    }
);
if($this->_validateAttributeInfo($info)) {
   $attributes[$attributeId] = $info;
}
Steve
la source
2
Veuillez consulter ma réponse pour une réponse qui étend correctement la bibliothèque principale de Magento plutôt que de la modifier directement. Encore bravo à Steve pour cette réponse car cela m'a beaucoup aidé à savoir par où commencer pour développer la solution que j'ai trouvée.
Darren Felton
Excellent travaillé comme un charme dans Enterprise, même grâce à une tonne que vous sauvez ma journée ..
Bharath