Настраиваемый порядок сортировки атрибутов товара в Dropdown 2.12


9

Порядок раскрывающегося списка не соответствует порядку самого атрибута. В пределах размера атрибута я его заказал новорожденному 0-3 мес

и в раскрывающемся списке он отображается как 0-3 новорожденного

Размер Newborn был добавлен через несколько дней после других размеров, а новорожденные простые продукты были импортированы через 0-3 мес. Любые предложения о том, как получить порядок раскрывающегося списка, чтобы следовать порядку списка в атрибуте? Я очистил кеш и переиндексировал. Я читал, что @Khoa TruongDinh имел ту же проблему, но не видел решения этой проблемы, поэтому я делаю репост.


Кроме того, атрибуты продуктов с размером 0-3 уже существуют, и я добавляю все атрибуты продуктов с размером Newborn.
Babywit

Ответы:


14

Я столкнулся с той же проблемой сортировки опций атрибутов во внешнем интерфейсе, поскольку я проверил эту проблему и обнаружил, что при извлечении опций атрибута в запросе по умолчанию в Magento 2.1.2 не добавлен фильтр сортировки, поэтому для решения этой проблемы необходимо добавить приведенный ниже код для добавления ORDER By в функцию getAttributeOptions в строке № 282 в файле: vendor / magento / module-configurable-product / Model / ResourceModel / Product / Type / Configurable.php Теперь у меня все работает нормально.

->joinInner(
        ['attribute_opt' => $this->getTable('eav_attribute_option')],
        'attribute_opt.option_id = entity_value.value',
        []
    )->order(
        'attribute_opt.sort_order ASC'
    );

Если вам не удалось отредактировать код, замените эту функцию getAttributeOptions на код, как показано ниже:

public function getAttributeOptions($superAttribute, $productId)
{
    $scope  = $this->getScopeResolver()->getScope();
    $select = $this->getConnection()->select()->from(
        ['super_attribute' => $this->getTable('catalog_product_super_attribute')],
        [
            'sku' => 'entity.sku',
            'product_id' => 'product_entity.entity_id',
            'attribute_code' => 'attribute.attribute_code',
            'value_index' => 'entity_value.value',
            'option_title' => $this->getConnection()->getIfNullSql(
                'option_value.value',
                'default_option_value.value'
            ),
            'default_title' => 'default_option_value.value',
        ]
    )->joinInner(
        ['product_entity' => $this->getTable('catalog_product_entity')],
        "product_entity.{$this->getProductEntityLinkField()} = super_attribute.product_id",
        []
    )->joinInner(
        ['product_link' => $this->getTable('catalog_product_super_link')],
        'product_link.parent_id = super_attribute.product_id',
        []
    )->joinInner(
        ['attribute' => $this->getTable('eav_attribute')],
        'attribute.attribute_id = super_attribute.attribute_id',
        []
    )->joinInner(
        ['entity' => $this->getTable('catalog_product_entity')],
        'entity.entity_id = product_link.product_id',
        []
    )->joinInner(
        ['entity_value' => $superAttribute->getBackendTable()],
        implode(
            ' AND ',
            [
                'entity_value.attribute_id = super_attribute.attribute_id',
                'entity_value.store_id = 0',
                "entity_value.{$this->getProductEntityLinkField()} = "
                . "entity.{$this->getProductEntityLinkField()}",
            ]
        ),
        []
    )->joinLeft(
        ['option_value' => $this->getTable('eav_attribute_option_value')],
        implode(
            ' AND ',
            [
                'option_value.option_id = entity_value.value',
                'option_value.store_id = ' . $scope->getId(),
            ]
        ),
        []
    )->joinLeft(
        ['default_option_value' => $this->getTable('eav_attribute_option_value')],
        implode(
            ' AND ',
            [
                'default_option_value.option_id = entity_value.value',
                'default_option_value.store_id = ' . \Magento\Store\Model\Store::DEFAULT_STORE_ID,
            ]
        ),
        []
    )->where(
        'super_attribute.product_id = ?',
        $productId
    )->where(
        'attribute.attribute_id = ?',
        $superAttribute->getAttributeId()
    )->joinInner(
        ['attribute_opt' => $this->getTable('eav_attribute_option')],
        'attribute_opt.option_id = entity_value.value',
        []
    )->order(
        'attribute_opt.sort_order ASC'
    );

    return $this->getConnection()->fetchAll($select);
}

Большое вам спасибо за это, но я не очень хорошо разбираюсь в php. Я не уверен, где добавить в ваше исправление. Это то, что я имею в 280-282 и пытался добавить его в до; на 282 но это не сработало. 280 'attribute.attribute_id =?', 281 $ superAttribute-> getAttributeId () 282);
Babywit

если вы не можете редактировать код, замените его
Jagdish Ram

Кто-нибудь написал расширение, которое применяет этот патч?
TheNorthern_Light

Кроме того, это не работает в 2.1.9.
TheNorthern_Light

В 2.1.14 функциональность перешла на Magento\ConfigurableProduct\Model\AttributeOptionProvider. Выглядит решенным на первый взгляд, но не уверен в возможных ошибках.
Симонтессор

3
  1. Перейдите на страницу Конфигурируемый продукт -> Изменить конфигурацию -> Нажмите «Далее» - «Далее» и ничего не меняйте
  2. Затем сохраните товар и они должны быть в порядке.

Обновить или сохранить товар?
Ласантха

Как это сделать с более чем 300 продуктами?
Мохаммед Джорайд

На самом деле, только открывая настраиваемую страницу редактирования продукта, а затем просто сохраняя напрямую, исправляется порядок сортировки. Итак, 1- Откройте продукт. 2- Нажмите Сохранить. Но как заставить это работать, не переходя на все товары вручную и сохраняя их. Я попытался массово добавить весь продукт на сайт, надеясь, что он вызовет событие сохранения, но сортировка не была исправлена. используя MAG2.2.2
Мохаммед Джорайд

1

Если вы имеете в виду, что Newborn является значением атрибута, вам нужно перейти в Магазины -> Атрибуты (Продукт) , найти нужный атрибут, а также использовать перетаскивание мышью с изменением позиции мыши. введите описание изображения здесь

Положение самих выпадающих меню (размер, цвет, форма) можно задать при создании связанных продуктов. Откройте форму редактирования -> Расширенные настройки -> Изменить настройки - Шаг значений атрибутов и с помощью атрибутов перемещения с помощью перетаскивания введите описание изображения здесь


Да, точно. «В пределах размера атрибута, который я заказал, Новорожденный 0-3 мес.» Так что внутри самого атрибута Новорожденный находится над 0-3 мес., И в раскрывающемся списке продукта он появляется с 0-3 мес. Над Новорожденным.
Babywit

Так что, насколько я могу судить, порядок в самом атрибуте не работает должным образом в magento 2.1.2
babywit

Кто-нибудь имеет какие-либо идеи, что вызывает эту проблему с порядком атрибутов не отображаются в порядке, указанном в атрибуте или обходной путь, чтобы атрибуты отображались в правильном порядке? Я хочу открыть свой магазин, но это сводит меня с ума.
Babywit

1

В настоящее время это известная проблема в Magento 2. Начиная с версии 2.1.4, она все еще остается проблемой.

Вот проблема GitHub: https://github.com/magento/magento2/issues/7441


Вопрос был задан 3 месяца назад. Magento 2.1.4 был выпущен вчера ...
7очг

1

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

Перейдите на страницу конфигурируемого продукта-> Конфигурации-> удалить все простые продукты

После этого добавьте их снова в нужном порядке:

Добавить продукты вручную-> Фильтровать продукты по имени-> Добавить простые продукты в нужном порядке.


1

В v2.3.x вы можете сортировать порядок атрибутов по меткам опций в настраиваемом выпадающем меню продукта, расширяя

Magento\ConfigurableProduct\Model\AttributeOptionProvider

и используя

usort($data, function($a, $b) {
    return $a['option_title'] <=> $b['option_title'];
});

Сортировать возвращенный параметр data array $ data в getAttributeOptions ()


Вы можете уточнить это подробнее?
Коусиган Атсаям
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.