Показаны сообщения с ярлыком атрибут. Показать все сообщения
Показаны сообщения с ярлыком атрибут. Показать все сообщения

воскресенье, 15 июня 2014 г.

Magento: Как добавить во flat таблицу аттрибут с собственной source моделью

Для добавления атрибута продукта во flat таблицу достаточно выполнить следующие действия:
1. Включить для атрибута настройку "Used in Product Listing"
2. Выполнить полный реиндекс catalog_product_flat

Но это не работает если вы создаете атрибут с собственной source моделью. Чтобы сделать это нужно выполнить несколько дополнительных действий:
1. Добавить в source модель функцию getFlatColums() с описанием вашего атрибута. Да да, именно getFlatColums, а не getFlatColumns (привет core разработчикам Magento).
/**
 * {@inheritdoc}
 */
public function getFlatColums()
{
    return array($this->getAttribute()->getAttributeCode() => array(
        'type'      => 'tinyint',
        'unsigned'  => true,
        'is_null'   => true,
        'default'   => null,
        'extra'     => null
    ));
}

2. Добавить функцию getFlatUpdateSelect()
/**
 * {@inheritdoc}
 */
public function getFlatUpdateSelect($store)
{
    /** @var $attr Mage_Eav_Model_Resource_Entity_Attribute */
    $attr = Mage::getResourceSingleton('eav/entity_attribute');
    return $attr->getFlatUpdateSelect($this->getAttribute(), $store);
}

После этих действий не забываем выполнить полный реиндекс catalog_product_flat.
Читать далее

суббота, 10 ноября 2012 г.

Magento: обновление отдельного атрибута продукта

При работе с Magento часто возникают ситуации, когда нужно обновить значение какого-то одного атрибута + его значение во flat-таблице. Такая ситуация может возникнуть в cron-скриптах, которые обрабатывают данные от третьего ресурса. Например, мы используем комментарии от Disqus и хотим раз в день забирать от них кол-во комментариев для каждого продукта. Сохранять модель в цикле это самоубийство, потому на помощь приходит Mage_Eav_Model_Entity_Abstract::saveAttribute().

Предположим, у нас есть атрибут продукта 'disqus_comment_count' и мы как-то (например, с помощью API) получаем от Disqus новые значения комментариев.
/** @var $productFlatIndexer Mage_Catalog_Model_Product_Flat_Indexer */
$productFlatIndexer = Mage::getModel('catalog/product_flat_indexer'); // модель для обновления значения атрибута во flat-таблице
$storeId = 1; // необходимый store id

/** @var $productCollection Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection */
$productCollection = Mage::getResourceModel('appstore_extension/product_collection');

/** @var $product AppStore_Extension_Model_Product */
foreach ($productCollection as $product) {
    $product->setDiscusCommentCount($newCommentValue);
    $product->getResource()
        ->saveAttribute($product, 'disqus_comment_count');

    // Обновляем значение атрибута во flat-таблице стора
    $productFlatIndexer->updateAttribute('disqus_comment_count', $storeId, $product->getId());
}
Вот и все. Стоит сказать, что Mage_Catalog_Model_Product_Flat_Indexer::updateAttribute() в цикле это не лучшее решение. Если логика приложения позволяет вынести вызов этого метода из цикла и обновить значение атрибута для пачки продуктов - смело делайте это.
Читать далее

понедельник, 6 августа 2012 г.

Magento: Добавление атрибута во flat-таблицу

Пару месяцев назад я описал один из способов добавления EAV атрибута во flat-таблицу. Честно говоря, тот вариант мне не нравился из-за своей неочевидности. Есть другой, как по мне, более правильный: описать необходимые атрибуты в config.xml:

    
         
              
                   
                      
                      
                      
                   
              
          
    


Читать далее