Могу ли я добавить другие атрибуты в таблицу каталога товаров magento? - PullRequest
19 голосов
/ 08 июня 2011

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

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

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

Ответы [ 4 ]

45 голосов
/ 08 июня 2011

1.4.xx, просто перейдите к атрибутам, которые вы хотите использовать в "Каталоге плоских изделий" и убедитесь, что для свойства "Использовано в списке товаров" установлено значение Да . После внесения изменений переиндексируйте «Плоские данные продукта»

Следующие свойства приводят к включению атрибута в «Каталог плоских изделий»:

"Use in Layered Navigation" = Yes
"Used in Product Listing" = Yes
"Used for Sorting in Product Listing" = Yes
10 голосов
/ 10 июня 2013

Я также работал над этой проблемой, которую я бы описал как «невозможно получить доступ к атрибуту коллекции продукта в плоском режиме» или «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)

5 голосов
/ 25 февраля 2015

Другие предоставили обычно достаточный ответ (для параметра «Использовано в списке продуктов» установлено значение «Да»), но я обнаружил крайний случай, который было бы полезно узнать, когда я искал эту же вещь.

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

2 голосов
/ 25 июня 2016

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