Hinweis: Ich wurde darauf aufmerksam gemacht, dass diese Lösung für Magento 1.9.2 nicht funktioniert. Um anderen Zeit zu sparen, möchte ich am Anfang dieses Beitrags darauf hinweisen. Wenn ich meine eigene Lösung entwickle oder eine andere Lösung finde, die für 1.9.2 geeignet ist, werde ich diesen Beitrag zu diesem Zeitpunkt aktualisieren.
Hinweis: Die hier beschriebene Lösung erweitert eine Blockklassendatei in der Kernbibliothek von Magento. Ich habe Magentos Quellcode vor diesem Ansatz überprüft und festgestellt, dass es kein gutes Ereignis gibt, das beobachtet werden kann, um diesen Ansatz zu vermeiden. Wenn in einer zukünftigen Version von Magento dieses Problem behoben ist, können Sie diese Änderungen im Folgenden rückgängig machen, indem Sie die Erweiterung in der XML-Datei app / etc / modules deaktivieren.
Schritt 1: Erstellen Sie die Datei app / etc / modules / FirstScribe_CatalogOptionSortFix.xml
Inhalt:
<?xml version="1.0"?>
<config>
<modules>
<FirstScribe_CatalogOptionSortFix>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Catalog />
</depends>
</FirstScribe_CatalogOptionSortFix>
</modules>
</config>
Hinweis: Erstellen Sie für Schritt 2 und 3 nach Bedarf Verzeichnisse für diese Dateien. Beispielsweise haben Sie möglicherweise bereits das Verzeichnis app / code / local oder nicht, je nachdem, welche Erweiterungen Sie bereits auf Ihrer Site installiert haben.
Schritt 2: Erstellen Sie die Datei app / code / local / FirstScribe / CatalogOptionSortFix / etc / config.xml
Inhalt:
<?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>
Schritt 3: Erstellen Sie die Datei app / code / local / FirstScribe / CatalogOptionSortFix / Block / Product / View / Type / Configurable.php
Inhalt:
<?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;
}
}
Schritt 4: Wenn aktiviert, aktualisieren Sie Magentos Cache-Typ "Konfiguration" unter System -> Cache-Verwaltung des Admin-Panels.
Erweiterungsübersicht
- Erweitern Sie die Klasse Mage_Catalog_Block_Product_View_Type_Configurable.
- Fügen Sie eine Methode hinzu, um Optionen nach ihrem
position
Wert zu sortieren, indem Sie diese Informationen aus der Datenbank abrufen.
- Schreiben Sie die Methode getJsonConfig neu, um unsere neue Funktion aufzurufen, nachdem Sie die Optionen für ein Attribut gesammelt haben.
Nur um meine zwei Cent zu addieren, die anderen beiden Antworten haben mich gut in die richtige Richtung gelenkt, aber ich dachte, ich würde es eher an der Quelle als am Blockpräsentationspunkt angreifen.
Sie können das gleiche Ergebnis erzielen, indem Sie die Methode des
Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection
Modells erweitern._loadPrices()
Trotz des Namens wurde eine Änderung vorgenommen (vermutlich aus Gründen der Leistung), die dazu führte, dass die Attribute nach ID und nicht nach Relevanz sortiert wurden.Die Änderung wurde anscheinend vorgenommen, um verschachtelte
foreach
Anweisungen zu vermeiden , verliert jedoch auch die richtige Reihenfolge. Diese Lösung ändert die aktualisierte Logik geringfügig, um die Attributoptionen zu verfolgen, und führt dann basierend auf der ursprünglichen Reihenfolge eine weitere Schleife durch, um das Hinzufügen tatsächlich durchzuführen.Hier ist eine angepasste exemplarische Vorgehensweise, die der obigen Antwort von meogi ähnelt :
Schritt 1: Registrieren Sie ein neues Modul
Hinweis: Wenn Sie bereits eine haben, verwenden Sie eine vorhandene erneut.
Schritt 2: Erstellen Sie die Konfiguration des Moduls
Schritt 3: Fügen Sie die Ressourcenmodellerweiterung hinzu
Schritt 4: Leeren Sie Ihren Cache
Als Referenz wäre die tatsächliche Änderung der Core-Klasse in a
git diff
wie folgt (Core-Dateien nicht direkt bearbeiten!):Dies ist auch auf GitHub, wenn jemand es als Referenz haben möchte.
Bearbeiten: Ich habe dies auch als Fehler in Magento protokolliert .
quelle
Dies ist keine richtige Lösung, aber ich habe es vorübergehend getan, um zu vermeiden, dass ich auf 1.9.0.1 zurückgreifen muss, bis die nächste Magento-Version das Problem hoffentlich richtig behebt. Die Optionswerte werden alphabetisch sortiert. Sie können natürlich nach Belieben sortieren, aber ich weiß nicht, wie ich auf die im Backend festgelegte Sortierreihenfolge zugreifen soll. Die alphabetische Sortierung ist für meine Zwecke ausreichend.
Ändern Sie die Datei
Ändern Sie die Zeile 215
zu
quelle