Я занимаюсь оптимизацией магазина magento, и я столкнулся с несколькими сообщениями, которые рекомендуют использовать Flat Product Catalog для магазинов с большим количеством SKU.
Поскольку у меня есть более 10 тыс. Продуктов, я думал, что попробую. Однако при использовании Каталога плоских продуктов в объект продукта загружаются только несколько атрибутов (например, SKU, имя, краткое описание). И мой шаблон отображает несколько других атрибутов в режиме поиска / просмотра, таких как Производитель и Цвет.
Есть ли способ добавить эти атрибуты в плоскую таблицу каталогов продуктов, чтобы к ним также можно было получить доступ?
1.4.xx, просто перейдите в атрибуты, которые вы хотите использовать в «Плоском каталоге продуктов», и убедитесь, что для свойства «Используется в листинге продукта» установлено значение « Да» . При внесении изменений, reindex "Плоские данные продукта"
Следующие свойства заставляют атрибут быть включенным в «Каталог плоских продуктов»:
"Use in Layered Navigation" = Yes "Used in Product Listing" = Yes "Used for Sorting in Product Listing" = Yes
Я тоже работаю над этой проблемой, которую я бы назвал «не могу получить доступ к атрибуту коллекции продукта в плоском режиме» или «addAttributeToSelect не работает в плоском режиме».
Я нашел «чистое» решение, которое:
Обратите внимание: в приведенном ниже коде я использовал связанную коллекцию продуктов, но это относится к любой коллекции продуктов (в частности, что-либо, наследующее от Mage_Eav_Model_Entity_Collection_Abstract
)
Неудачный код:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' ); $coll = $_product->getTypeInstance()->getAssociatedProductCollection() ->addAttributeToSelect( 'my_custom_attribute' ) ;
В плоском режиме вышеприведенный код молча не может добавить атрибут, если он не находится в плоской таблице.
Рабочий код:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' ); $coll = $_product->getTypeInstance()->getAssociatedProductCollection() ->joinAttribute( 'my_custom_attribute', 'catalog_product/my_custom_attribute', 'entity_id', null, 'left' ) ->addAttributeToSelect( 'my_custom_attribute' ) ;
Метод joinAttribute
добавляет соединение к запросу. Он работает, даже если это дублирует атрибут, который уже находится в плоской таблице.
Обратите внимание, что я использовал left
соединение там, чтобы убедиться, что он извлекает продукты, если my_custom_attribute
не установлен для этих продуктов. Вы можете изменить это для inner
если вас интересуют только строки, в которых установлен my_custom_attribute
.
(проверено в CE 1.6.2.0)
Другие предоставили обычно достаточный ответ (настройка «Использовать в листинге продукта» на «Да»), но я нашел краевой пример, который был бы полезен, когда я искал эту же вещь.
Если вы используете настраиваемую исходную модель для настраиваемого атрибута, который хотите включить в таблицу плоских продуктов, вам придется переопределить getFlatColums()
в классе исходной модели. Да, я знаю, что это написано неправильно, но для вас это родной Magento.
Образец :
public function getFlatColums() { return array($this->getAttribute()->getAttributeCode() => array( 'type' => 'tinyint', 'unsigned' => true, 'is_null' => true, 'default' => null, 'extra' => null )); }
Если вы хотите использовать атрибут в модуле, используя таблицу плоских продуктов (например, фильтруйте коллекцию продуктов), вы можете добавить ее в модуль Module_File.xml
<?xml version="1.0"?> <config> <modules> <Your_Module> <active>true</active> <codePool>local</codePool> </Your_Module> </modules> <frontend> <product> <collection> <attributes> <your_custom_attribute /> <!-- This is the attribute name --> </attributes> </collection> </product> </frontend> </config>