Подтвердить что ты не робот

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

Я занимаюсь оптимизацией магазина magento, и я столкнулся с несколькими сообщениями, которые рекомендуют использовать Flat Product Catalog для магазинов с большим количеством SKU.

Поскольку у меня более 10 тыс. продуктов, я думал, что попробую. Однако при использовании Каталога плоских продуктов в объект продукта загружаются только несколько атрибутов (например, SKU, имя, краткое описание). И мой шаблон отображает несколько других атрибутов в режиме поиска/просмотра, таких как Производитель и Цвет.

Есть ли способ добавить эти атрибуты в таблицу каталога плоских продуктов, чтобы к ним также можно было обращаться?

4b9b3361

Ответ 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>