Magento AddAttributeToSelect () для пользовательского добавленного атрибута (наблюдатель) - PullRequest
3 голосов
/ 19 декабря 2011

Я настроил наблюдателя на catalog_product_collection_load_after и вызывается следующий код:

<?php
class Drench_Admindetails_Model_Observer {
    public function loadAfter($observer){
        $collection = $observer->getEvent()->getCollection();
        $collection->addAttributeToFilter('admin_id', Mage::getSingleton('admin/session')->getUser()->getUserId());
        foreach($collection as $item) {
            fb($item->getAdminId()); //fb() is a firebug call
        }
        return $this;
    }
}

Как видите, я фильтрую коллекцию на admin_id, которую я создал с помощью следующего сценария установки (пространство имен / module / Resource / Eav / Mysql4 / Setup.php).

<?php

class Drench_Admindetails_Resource_Eav_Mysql4_Setup extends Mage_Eav_Model_Entity_Setup
{
    public function getDefaultEntities()
    {
        return array(
            'catalog_product'                        => array (
                'entity_model'                       => 'catalog/product',
                'attribute_model'                    => 'catalog/resource_eav_attribute',
                'table'                              => 'catalog/product',
                'additional_attribute_table'         => 'catalog/eav_attribute',
                'entity_attribute_collection'        => 'catalog/product_attribute_collection',
                'attributes'                         => array (
                    'admin_id'                       => array (
                        'group'                      => '',
                        'label'                      => '',
                        'type'                       => 'int',
                        'input'                      => '',
                        'default'                    => '0',
                        'class'                      => '',
                        'backend'                    => '',
                        'frontend'                   => '',
                        'source'                     => '',
                        'global'                     => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
                        'visible'                    => false,
                        'required'                   => false,
                        'user_defined'               => false,
                        'searchable'                 => false,
                        'filterable'                 => false,
                        'comparable'                 => false,
                        'visible_on_front'           => false,
                        'visible_in_advanced_search' => false,
                        'unique'                     => false
                    )
               )
           )
        );
    }
}

Этот атрибут хранит администратора, который добавил продукт. Однако коллекция не фильтруется по admin_id, и в цикле foreach() в методе наблюдателя она возвращает NULL, а не фактический admin_id, который она должна вернуть.

Есть идеи, почему это не работает?

1 Ответ

5 голосов
/ 19 декабря 2011

Вы не можете отфильтровать коллекцию после ее загрузки.Вместо этого используйте событие catalog_product_collection_load_before.Если вы попытаетесь повторить коллекцию в этот момент, она может вызвать то же событие и запустить бесконечную рекурсию, что было бы плохо.

Атрибут admin_id, вероятно, не будет добавлен в выбранные столбцы для продуктасписки, если для атрибута used_in_product_listing не установлено true.Вы также можете успешно использовать $collection->addAttributeToSelect('admin_id') в том же самом событии перед загрузкой.

...