Могу ли я добавить другие атрибуты в таблицу каталогов плоских продуктов magento?

Я занимаюсь оптимизацией магазина 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 не работает в плоском режиме».

Я нашел «чистое» решение, которое:

  • не требует, чтобы атрибут имел определенные настройки в admin (он может быть добавлен пользователем или скрыт на лицевой стороне)
  • работает как в плоском, так и в не плоском режиме

Обратите внимание: в приведенном ниже коде я использовал связанную коллекцию продуктов, но это относится к любой коллекции продуктов (в частности, что-либо, наследующее от 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 )); } 

Источник : http://www.dconstructing.com/2012/03/14/custom-product-attributes-and-flat-database-tables-in-magento

Если вы хотите использовать атрибут в модуле, используя таблицу плоских продуктов (например, фильтруйте коллекцию продуктов), вы можете добавить ее в модуль 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>