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
- Étendez la classe Mage_Catalog_Block_Product_View_Type_Configurable.
- Ajoutez une méthode pour trier les options selon leur
position
valeur en extrayant ces informations de la base de données.
- Réécrivez la méthode getJsonConfig pour appeler notre nouvelle fonction après avoir rassemblé les options d'un attribut.
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_Collection
modè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.
Étape 2: créer la configuration du module
Étape 3: ajouter l'extension de modèle de ressource
Étape 4: vider votre cache
Pour référence , la modification réelle de la classe de base dans un
git diff
serait ci-dessous (ne modifiez pas directement les fichiers de base!):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 .
la source
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
Changer la ligne 215
à
la source