Создал свой атрибут для продукта и добавил его в группу. Группу добавил в свой сет. Продукту назначил свой сет.
В карточке товара атрибут нормально отображается.
В корзине (checkout/cart) невозможно получить значение атрибута.
var_dump($product->getData('si_qty')); // => NULL var_dump($product->getResource()->getAttribute('si_qty')->getFrontend()->getValue($product)); // => NULL var_dump($product->getCustomAttribute('si_qty')); // => NULL
Хотелось бы раз и навсегда понять почему так *** устроена система атрибутов.
Я просто хочу сделать $product->getData('my-attr'); и все, но в разных частях системы он может отдаваться, а может и нет.
Как гарантированно получить значение атрибута?
UPD:
Только что попробовал сделать повторную загрузку продукта:
$productNew = $product->load($product->getId());
Теперь возможно получить значение атрибута:
echo $productNew->getData('si_qty');
Я не понимаю смысла загрузки загрузки кусочков данных продукта. Возможно, разработчики хотели сэкономить ресурсы и сделать быструю систему (у них это получилось. </sarcasm>), в итоге теперь нужно загружать продукт повторно.
@mykhailo7, информация присутствующая в продукте зависит от того каким образом он был загружен. EAV атрибуты не будут доступны если, например, продукт берется из коллекции перед загрузкой которой они не были добавлены вызовом "addAttributeToSelect('*')". Добавление к запросу загрузки коллекции только твоего аттрибута -"addAttributeToSelect('si_qty')".
Поскольку я не знаю в каком точно месте ты пытаешся получить атрибут то советую универсальное но ресурсоемкое решение:
$product->getSiQty(); // null $product->load($product->getId()); $product->getSiQty(); // value
Для оптимальной производительности постарайся добавить свой атрибут перед загрузкой коллекции.
В корзине (checkout/cart) невозможно получить значение атрибута.
Конкретно в списке товаров, добавленных в корзину. На отдельной странице, не в mini-cart.
Я уже как-то задавал вопрос на SO, самое интересное, мне удалось пофиксить проблему. Но после переустановки мадженты с теми же модулями и настройками, опять атрибут не удается получить.
В товаре ваш атрибут доступен, потому что на этой странице грузится весь объект товара.
На других страницах грузится коллекция товаров. В коллекцию попадают не все атрибуты товаров, а часть. Это сделано для оптимизации использования памяти и скорости.
Чтобы атрибут товара был доступен в коллекции товаров нужно в редактировании атрибута указать, что он там должен быть доступен. Атрибут "Used in Product Listing (Использовать в списке товаров)".
Я уже понял это, спасибо.
В админке все стоит в Yes, и Used in Product Listing тоже, но этого видимо было мало.
После этого ещё реиндекс надо сделать, особенно, если флат товары включены и кэш сбросить.
Реиндекс запускал и кэш сбрасывал. Может я делал что-то не так, может очередной баг.