Могу ли я добавить другие атрибуты в таблицу каталога плоских продуктов magento?
Я занимаюсь оптимизацией магазина magento, и я столкнулся с несколькими сообщениями, которые рекомендуют использовать Flat Product Catalog для магазинов с большим количеством SKU.
Поскольку у меня более 10 тыс. продуктов, я думал, что попробую. Однако при использовании Каталога плоских продуктов в объект продукта загружаются только несколько атрибутов (например, SKU, имя, краткое описание). И мой шаблон отображает несколько других атрибутов в режиме поиска/просмотра, таких как Производитель и Цвет.
Есть ли способ добавить эти атрибуты в таблицу каталога плоских продуктов, чтобы к ним также можно было обращаться?
Ответы
Ответ 1
1.4.xx, просто зайдите в атрибуты, которые вы хотите использовать в "Плоском каталоге продуктов" , и убедитесь, что свойство , используемое в товарном листинге. установите Да. При внесении изменений reindex "Плоские данные продукта"
Следующие свойства приводят к включению атрибута в "Каталог плоских продуктов":
"Use in Layered Navigation" = Yes
"Used in Product Listing" = Yes
"Used for Sorting in Product Listing" = Yes
Ответ 2
Я тоже работал над этой проблемой, которую я бы назвал "не могу получить доступ к атрибуту коллекции товаров в плоском режиме" или "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
join там, чтобы убедиться, что он извлекает продукты, если my_custom_attribute
не установлен на этих продуктах. Вы можете изменить это для inner
, если вас интересуют только строки, в которых установлен my_custom_attribute
.
(проверено в CE 1.6.2.0)
Ответ 3
Другие предоставили обычно достаточный ответ (настройка "Использовать в листинге продукта" на "Да" ), но я нашел краевой пример, который был бы полезен, когда я искал эту же вещь.
Если вы используете настраиваемую исходную модель для настраиваемого атрибута, который хотите включить в таблицу плоских продуктов, вам придется переопределить 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
Ответ 4
Если вы хотите использовать атрибут в модуле, используя таблицу плоских продуктов (например, фильтруйте коллекцию продуктов), вы можете добавить ее в модуль 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>