Magento-конфигурируемые опции продуктов, чтобы соответствовать порядку, в котором они находятся в наборе атрибутов - PullRequest
1 голос
/ 15 марта 2012

У меня есть сайт magento, который я создаю (1.6). На моем сайте есть куча настраиваемых опций с 6 или около того атрибутами, установленными в качестве выпадающих меню для выбора покупателем.После сохранения настраиваемого продукта порядок атрибутов меняется.Я смог найти то, что, по моему мнению, происходит, он переупорядочивает их в соответствии с идентификатором атрибута, а не в порядке, в котором я их установил в наборе атрибутов.Мне нужно найти способ заставить magento сохранять порядок атрибутов таким же, как они есть в наборе атрибутов.Любая помощь очень ценится.

Ответы [ 3 ]

7 голосов
/ 15 марта 2012

Трюк довольно прост. Просто перетащите их в продукт-> изменить-> вкладка связанный продукт;) Порядок атрибутов с этой страницы сохраняется в таблице catalog_product_super_attribute.

1 голос
/ 01 февраля 2014

Это старый вопрос, но сейчас я нашел решение с той же проблемой.

Если вы все еще заинтересованы в изменении порядка настраиваемого атрибута, возможно, вы захотите взглянуть на этот метод:

  • 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;
}
1 голос
/ 15 января 2014

Я тоже искал то же самое и, наконец, нашел это, и оно работает для меня, надеюсь, оно будет работать и для других.

Из Панель администратора > Каталог > Атрибуты > Управление атрибутами выберите тот, который вам нравится, если вы хотите сделать его похожим на емкость 4GB > 8GB > 16GB и так далее, затем внесите эти небольшие изменения.

Выберите Управление меткой / Параметры > Управление параметрами (значения вашего атрибута) и, если вы уже создали переменные, просто добавьте позицию вручную, например:

4 ГБ - 1
8 ГБ - 2
16 ГБ - 3

Сохраните и очистите кэш.
Вот и все, теперь он должен показывать атрибуты согласно позиции, которую вы назначаете.* * 1027

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...