Ordinamento degli attributi del prodotto configurabile Magento 1.9.1


24

Come ho già detto, sembra che ci sia un problema con Magento 1.9.1 e l'ordinamento degli attributi dei prodotti configurabili. Le opzioni di un prodotto configurabile ora dipendono SEMPRE dall'ID del prodotto semplice. L'ordine delle opzioni dell'attributo viene ignorato.

Sono tornato a Magento 1.9.0.1. Forse qualcuno può determinare come viene fatto l'ordinamento in 1.9.1. Sarebbe fantastico per tutti coloro che utilizzano prodotti configurabili per risolvere il problema.

Se qualcuno vuole vederlo, puoi farlo qui nel negozio demo di Magento. Non sono stato in grado di ordinare correttamente le dimensioni.

Risposte:


25

Nota: è stato portato alla mia attenzione che questa soluzione non funziona per Magento 1.9.2. Al fine di risparmiare tempo sprecato da altri, vorrei segnalarlo all'inizio di questo post. Se sviluppo la mia soluzione o trovo la soluzione di qualcun altro che funziona per 1.9.2, aggiornerò questo post in quel momento.

Avviso: la soluzione qui presentata estende un file di classe a blocchi nella libreria principale di Magento. Ho esaminato il codice sorgente di Magento prima di questo approccio e ho stabilito che non c'era un buon evento da osservare per evitare questo approccio. Se in una versione futura di Magento questo problema di ordinamento è stato risolto, puoi annullare queste modifiche semplicemente disabilitando l'estensione nel suo file XML app / etc / modules.

Passaggio 1: creare l' app file / etc / modules / FirstScribe_CatalogOptionSortFix.xml

Contenuto:

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

Nota: per i passaggi 2 e 3, creare le directory per questi file, se necessario. Ad esempio, potresti già avere la directory app / code / local , oppure potresti non farlo, a seconda delle estensioni che hai già installato sul tuo sito.

Passaggio 2: creare l' app file / codice / local / FirstScribe / CatalogOptionSortFix / etc / config.xml

Contenuto:

<?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>

Passaggio 3: creare l' app file / codice / local / FirstScribe / CatalogOptionSortFix / Block / Product / View / Type / Configurable.php

Contenuto:

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

Passaggio 4: se abilitato, aggiorna il tipo di cache "Configurazione" di Magento in Sistema -> Gestione cache del pannello di amministrazione.

Panoramica delle estensioni

  1. Estendi la classe Mage_Catalog_Block_Product_View_Type_Configurable.
  2. Aggiungi un metodo per ordinare le opzioni in base al loro positionvalore estraendo queste informazioni dal database.
  3. Riscrivi il metodo getJsonConfig per chiamare la nostra nuova funzione dopo aver raccolto le opzioni per un attributo.

2
funziona in modo fantastico e sono contento che la soluzione non influisca sugli aggiornamenti futuri, grazie mille per la soluzione praticabile.
dawhoo,

Ehi @Meogi anche se sembra che la tua correzione sia perfetta per i valori degli attributi, siamo sicuri che tutto sia in ordine per le caselle di selezione del prodotto? Si è verificato un problema con l'ordine di questi nel modo in cui sono impostati nel set di attributi. Ad esempio, "Colore" è stato trascinato sopra "Dimensione" all'interno del set di attributi, tuttavia 1.9.1 ha cambiato i due (ignorato l'ordinamento). L'unico modo per risolvere il problema era la modifica del prodotto stesso e il trascinamento dell'ordine all'interno del configurabile. Forse questo era solo un prodotto canaglia che è stato accidentalmente riordinato manualmente in precedenza?
Joe,

1
@Joe Se non sbaglio, trascinare l'attributo in alto / in basso nel set di attributi non influisce sull'ordine in cui vengono visualizzati nella pagina dei dettagli del prodotto front-end. Invece, devi andare in Catalogo -> Attributi -> Gestisci attributi, trova il tuo attributo e modifica il valore "Posizione". Ciò influirà sia sull'ordine in cui gli attributi configurabili vengono visualizzati nella pagina del prodotto, sia sulla navigazione a più livelli. L'ordine delle opzioni configurabili può essere ignorato anche in base al prodotto, navigando nella scheda "Prodotti associati" nell'amministratore e trascinando gli attributi su / giù.
Darren Felton,

1
@Meogi questo è solo per la posizione del blocco di navigazione a strati, per quando si abilita "Usa nella navigazione a strati".
Joe,

@Joe vedo, beh, allora non so come modificare le impostazioni predefinite (forse è sempre stato il posizionamento nel set di attributi, non ne sono sicuro). Posso affermare che su un'installazione Magento 1.9.1.0 ero ancora in grado di impostarlo su un ordine di mia scelta facendo clic / trascinando su / giù nella scheda "Prodotti associati" del prodotto configurabile. Dove sono elencati tra il modulo di creazione rapida e la griglia del prodotto in basso.
Darren Felton,

11

Solo per aggiungere i miei due centesimi, le altre due risposte hanno fatto bene a indicarmi la direzione della correzione, ma ho pensato di attaccarlo alla fonte piuttosto che al punto di presentazione del blocco.

È possibile ottenere lo stesso risultato estendendo il metodo Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collectiondel modello _loadPrices(), che nonostante il nome è il punto in cui è stata apportata una modifica (presumibilmente per prestazioni) con conseguente ordinamento degli attributi per ID anziché per pertinenza.

La modifica sembra essere stata apportata per evitare foreachdichiarazioni nidificate , ma a sua volta perde anche l'ordine corretto. Questa soluzione modifica leggermente la logica aggiornata per tenere traccia delle opzioni degli attributi, quindi esegue un altro ciclo basato sull'ordine originale per eseguire effettivamente l'aggiunta.

Ecco una procedura dettagliata modificata simile alla risposta di Meogi sopra :


Passaggio 1: registra un nuovo modulo

Nota: se ne hai già uno, riutilizzane uno esistente.

# 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>

Passaggio 2: creare la configurazione del modulo

# 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>

Passaggio 3: aggiungere l'estensione del modello di risorsa

# 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 <robbie.averill@kathmandu.co.nz>
                 */
                $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 <robbie.averill@kathmandu.co.nz>
                 */
            }

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

Passaggio 4: svuota la cache


Per riferimento , la modifica effettiva alla classe principale in a git diffsarebbe sotto (non modificare direttamente i file core!):

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 <robbie.averill@kathmandu.co.nz>
+                 */
+                $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 <robbie.averill@kathmandu.co.nz>
+                 */
             }

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

Questo è anche su GitHub se qualcuno lo desidera come riferimento.

Modifica: ho anche registrato questo come bug con Magento .


1
Fantastico contributo amico mio. +1 (sì, non dovrei usare questi commenti per dire grazie ma l'hai ucciso, quindi devo ahah)
Darren Felton,

L'ho provato con Magento 1.9.2 - sembra che non funzioni sfortunatamente. E non capisco perché questo bug non sia stato ancora corretto da Magento.
Reinsch,

Ti sei assicurato che il tuo modulo sia configurato correttamente? Sono sicuro che ne sono consapevoli, ma è probabilmente qualcosa che richiederebbe tempo per essere verificato prima di rilasciare una patch poiché è una parte molto importante del sistema. Modifica: puoi anche testare la correzione direttamente (e temporaneamente) ma copiando la patch direttamente nella classe principale (temporaneamente)
Robbie Averill

1
@Reinsch Ho appena ricevuto un'email da qualcuno riguardante l'incompatibilità con CE 1.9.2 - ho inviato un aggiornamento al mio repository Github e l'ho testato su CE 1.9.2 con i dati di esempio Magento e ora funziona correttamente
Robbie Averill

1
Ottimo lavoro @RobbieAverill - grazie mille. Testato e confermato lavorando su un sito Web Magento 1.9.2.1.
Zigojacko,

3

Questa non è davvero una soluzione corretta, ma è quello che ho fatto temporaneamente per evitare di dover tornare alla 1.9.0.1 fino a quando la prossima versione di Magento spera di risolvere il problema correttamente. Ordinerà i valori delle opzioni in ordine alfabetico, puoi ovviamente ordinare secondo tutto quello che vuoi ma non so come accedere all'ordinamento impostato nel backend e in ordine alfabetico è abbastanza buono per i miei scopi.

Cambia il file

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

Cambia riga 215

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

a

usort($info['options'], function ($a,$b)
    {
        return strcmp($a['label'],$b['label']);
    }
);
if($this->_validateAttributeInfo($info)) {
   $attributes[$attributeId] = $info;
}

2
Si prega di vedere la mia risposta per una risposta che estende in modo appropriato la libreria principale di Magento anziché modificarla direttamente. Comunque, complimenti a Steve per questa risposta, poiché mi ha aiutato moltissimo a sapere da dove iniziare a sviluppare la soluzione che mi è venuta in mente.
Darren Felton,

L'eccellenza ha funzionato come un incanto nell'Enterprise anche grazie a tonnellate che mi hai salvato la giornata ..
Bharath,
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.