Это старый вопрос, но сейчас я нашел решение с той же проблемой.
Если вы все еще заинтересованы в изменении порядка настраиваемого атрибута, возможно, вы захотите взглянуть на этот метод:
Mage_Catalog_Model_Product_Type_Configurable::getConfigurableAttributes()
getConfigurableAttributes()
загрузить коллекцию атрибутов.
При первой загрузке коллекции перед сохранением настраиваемого значения значение position
отсутствует, поэтому я думаю, что правила идентификатора атрибута в порядке отображения.
Если вы хотите изменить этот порядок, вы можете добавить сортировку только для attribute_id
после ->orderByPosition()
и отменить порядок (это сохранит функциональность position
)
Например, здесь я добавил ->setOrder('attribute_id','DESC')
public function getConfigurableAttributes($product = null)
{
Varien_Profiler::start('CONFIGURABLE:'.__METHOD__);
if (!$this->getProduct($product)->hasData($this->_configurableAttributes)) {
$configurableAttributes = $this->getConfigurableAttributeCollection($product)
->orderByPosition()
->setOrder('attribute_id','DESC')
->load();
$this->getProduct($product)->setData($this->_configurableAttributes, $configurableAttributes);
}
Varien_Profiler::stop('CONFIGURABLE:'.__METHOD__);
return $this->getProduct($product)->getData($this->_configurableAttributes);
}
ИЛИ
Если вы хотите изменить порядок более радикальным образом, вы также можете использовать этот метод:
Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Config::getAttributesJson()
Это в основном называется getConfigurableAttributes()
.
Чтобы понять, является ли это первой настраиваемой загрузкой, вы можете проверить все атрибуты в массиве $attributes
, чтобы увидеть, имеют ли они все позицию ==0
, а затем перейти к ручному переупорядочению)
Пример
Я опускаю все создание модуля и переписать часть.
Вот пример изменения getAttributesJson()
, чтобы атрибут цвета всегда был вверху.
public function getAttributesJson()
{
$attributes = $this->_getProduct()->getTypeInstance(true)
->getConfigurableAttributesAsArray($this->_getProduct());
if (!$attributes) {
return '[]';
} else {
// == START ==
// checking if I can re-order
if ($this->isNoSavedPosition($attributes)) {
$attributes = $this->attributeReorder($attributes);
}
// == END ==
// Hide price if needed
foreach ($attributes as &$attribute) {
if (isset($attribute['values']) && is_array($attribute['values'])) {
foreach ($attribute['values'] as &$attributeValue) {
if (!$this->getCanReadPrice()) {
$attributeValue['pricing_value'] = '';
$attributeValue['is_percent'] = 0;
}
$attributeValue['can_edit_price'] = $this->getCanEditPrice();
$attributeValue['can_read_price'] = $this->getCanReadPrice();
}
}
}
}
return Mage::helper('core')->jsonEncode($attributes);
}
public function isNoSavedPosition($attributes)
{
foreach ($attributes as $attribute) {
if (isset($attribute['position']) && $attribute['position'] != 0) {
return false;
}
}
// there is no position saved
// - this is the first time the configurable is loaded
// - (the position is saved on second save action)
return true;
}
public function attributeReorder($attributes)
{
// we want the Color attribute to be always on the top
$newAttributesOrderArray = array();
foreach ($attributes as $key => $attribute) {
if (isset($attribute['label']) && $attribute['label'] == 'Color') {
$newAttributesOrderArray[] = $attribute;
unset($attributes[$key]);
}
}
$newAttributesOrderArray = array_merge($newAttributesOrderArray,$attributes);
return $newAttributesOrderArray;
}