Magento loadByAttribute для пользовательских атрибутов категории - PullRequest
2 голосов
/ 22 мая 2010

Я создал пользовательские атрибуты для категории в скрипте установки моего модуля следующим образом:

$attrib = array(
        'type'          => 'varchar',
        'group'         => 'My Data',
        'backend'       => '',
        'frontend'      => '',
        'label'         => 'My Custom Field',
        'input'         => 'text',
        'class'         => '',
        'source'        => '',
        'global'        => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
        'visible'       => true,
        'required'      => false,
        'user_defined'  => false,
        'default'       => '',
        'searchable'    => false,
        'filterable'    => false,
        'comparable'    => false,
        'visible_on_front' => false,
        'unique'        => true,
    );
$installer->addAttribute(3, 'custom_field', $attrib);

Поле хорошо отображается в админке, и когда я создаю категорию в моем скрипте, вот так:

$p_category = Mage::getModel('catalog/category')
            ->setStoreId(0)
            ->load(2);
$category = Mage::getModel('catalog/category');
$category->setStoreId(0)
    ->setName('Test Category')
    ->setCustomField('abcd')
    ->setDisplayMode('PRODUCTS')
    ->setAttributeSetId($category->getDefaultAttributeSetId())
    ->setIsActive(1)
    ->setIsAnchor(1)
    ->setPath(implode('/',$p_category->getPathIds()))
    ->setInitialSetupFlag(true)
    ->save();

Я вижу значение abcd в интерфейсе администратора Magneto. Но когда я вызываю код ниже:

<?php
$category = Mage::getModel('catalog/category')->loadByAttribute('custom_field', 'abcd');
print_r($category);
?>

Я не получил результата. Но если я загружаюByAttribute, используя поле 'name', установленное в 'Test Category', я действительно получаю результат.

Итак, в базе данных я просмотрел таблицу catalog_category_entity_varchar и заметил, что в атрибуте «name» есть запись для обоих store_id = 0 И store_id = 1, тогда как в атрибуте «custom_field» есть только запись для store_id = 1.

Когда я добавил запись store_id = 0 для 'custom_field' со значением, установленным в 'abcd' в таблице catalog_category_entity_varchar, loadByAttribute получил ожидаемый результат.

Мой вопрос: почему поле 'name' получает запись store_id = 0 в catalog_category_entity_varchar, а мое настраиваемое поле - нет?
Как загрузить категории по пользовательским атрибутам?

Ответы [ 4 ]

2 голосов
/ 08 июля 2011

Если вы измените следующий ключ на глобальный, он должен добавить его для обоих магазинов

 'global'        => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
1 голос
/ 22 мая 2010

Больше догадок, чем знание чего-либо для sute, так как у вас много чего происходит, и я не уверен, что слежу за вашим беспокойством по поводу store_id (не то, чтобы это действительное беспокойство, я просто не уверен, где оно входит в картинку)

Когда вы настраивали свой атрибут, вы использовали

'filterable'    => false,

попробуйте установить новый атрибут с этим значением true. Если вы посмотрите на исходный код loadByAttribute, он использует фильтрацию атрибутов для работы, поэтому вам понадобятся фильтруемые атрибуты, если вы хотите использовать этот метод.

0 голосов
/ 13 июля 2016

Очистите кэш перед загрузкой модели с пользовательским атрибутом, loadByAttribute работает нормально.

0 голосов
/ 01 сентября 2010

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

Mage::Log($collection->getSelect()->__toString());

Когда вы посмотрите на запрос в файле журнала, вы увидите, что magneto выполняет внутреннее соединение с таблицей атрибутов для store_id 0, поэтому, если вы не создали значение для нулевого хранилища, оно не может дать вам результат. Мне кажется, это ошибка, я думаю, что Magento должен сделать LEFT JOIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...