Как упорядочить коллекцию по атрибуту типа dropdown

[16 июля 2019 г.]    Российская сборка Magento 2.52.2
Magento 2: модули и услуги
magereport.com: составление перечня необходимых для установки заплаток SUPEE
#1 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

18.03.2011 11:50

Добавил атрибут тип Yes/No.
Пытаюсь отсортировать по нему используя $collection->addAttributeToSort('my_cust', 'desc');
Не пашет, а вот по др. атрибутам сортирует. Может проблема в типе?

Спасибо.

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8995
  • Регистрация: 20.02.2010

18.03.2011 12:22

Для отладки работы коллекций рекомендую смотреть запросы SQL, которые она выполняет для получения своих элементов.

#3 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

18.03.2011 12:30

Спасибо, посмотрел запрос, там нет даже намека на атрибут, странно... добавляю др. атрибут запрос становится больше и уже связь на атрибут идет. Атрибуты отличаются только типом и опцией "Use In Layered Navigation" но ее я отключал и все равно сортировка шла.

Может все дело в типе?

#4 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

18.03.2011 12:38

Попробовал добавить следующий код
 $collection->addStoreFilter()
            ->addAttributeToFilter('my_cust');

Запрос изменился но продукты с нужным атрибутов вообще исчезли из коллекции, может что то не правильно в addAttributeToFilter('my_cust')?

#5 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

18.03.2011 13:06

Проверил, все дело в типе. Создал еще один атрибут но с типом Drobdown и добавил в него Yes/No мортировка заработала, решил сделать еще третий атрибут с типом Yes/No мало ли что, добавил его, сортировка не пашет. Вот так вот.

#6 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

18.03.2011 16:15

А как можно связать через джойны итемы с нужным мне атрибутом?

#7 Aladdin
  • Группа: Пользователь
  • Сообщений: 4
  • Регистрация: 27.02.2012

22.03.2012 13:29

Theme up.

Такая же фигня.
Создал атрибут, добавил фильтр в коллекцию продуктов:

$_productCollection = $product
->getCollection()
->addCategoryFilter($cur_subcategory)
->addAttributeToFilter('isflashsale', array('neq' => 1))
->addAttributeToSelect(array('name', 'price', 'small_image', 'special_price'), 'inner')
;

Исчезли не только те продукты, которые не соответствуют фильтру, но и те которые удовлетворяют.

Стал копать дальше:

echo ($_productCollection->getSelect());

запрос выдаёт интересную вещь:

SELECT
...
FROM `dev_catalog_product_entity` AS `e`
...
INNER JOIN `dev_catalog_product_entity_int` AS `at_isflashsale_default`
ON (`at_isflashsale_default`.`entity_id` = `e`.`entity_id`)
AND (`at_isflashsale_default`.`attribute_id` = '240')
AND `at_isflashsale_default`.`store_id` = 0
LEFT JOIN `dev_catalog_product_entity_int` AS `at_isflashsale`
ON (`at_isflashsale`.`entity_id` = `e`.`entity_id`)
AND (`at_isflashsale`.`attribute_id` = '240')
AND (`at_isflashsale`.`store_id` = 1)
WHERE
(IF(at_isflashsale.value_id > 0, at_isflashsale.value, at_isflashsale_default.value) != 1)

Из запроса стало видно, что через INNER JOIN не цепляется таблица dev_catalog_product_entity_int по причине того, что в этой таблице нет записи по данному атрибуту у данного товара.
Т.е. Я создал атрибут, он в фильтре не вылазит.
Как только я переключил значение атрибута товара в любое значение, он стал участвовать в фильтрации. Потому что появилась запись в таблице catalog_product_entity_int.
Теперь задача сводится к тому, чтобы проинициализировать все товары, чтобы их вновь созданные атрибуты появились в этой таблице.
Am I on right way?
И как это сделать? Или есть другой путь зацепить атрибут?
Реиндексирование и очистка кэша не помогают.

#8 Aladdin
  • Группа: Пользователь
  • Сообщений: 4
  • Регистрация: 27.02.2012

22.03.2012 14:13

Короче незнаю, прально/непрально, сделал так:

$products = Mage::getModel('catalog/product')->getCollection();

foreach ($products as $product):
if (!$product->getIsflashsale())
$product->setIsflashsale(0)->save();
endforeach;

пробежался по всем продуктам, принудительно придал значение атрибута.

Залепуха, конечно, но кагбэ фильтрация заработала...

Поделиться темой: