Magento loadByAttribute用于自定义类别属性

时间:2010-05-21 22:58:02

标签: magento custom-attributes categories

我已经在模块的安装脚本中为类别创建了自定义属性,如下所示:

$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();

我可以在Magneto管理界面中看到值'abcd'。但是当我调用下面的代码时:

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

我没有结果。但是如果我使用'name'字段设置为'Test Category'来loadByAttribute,我会得到一个结果。

因此,在数据库中,我查看了catalog_category_entity_varchar表并注意到'name'属性有store_id = 0和store_id = 1的条目,而'custom_field'属性只有一个条目store_id = 1.

当我在catalog_category_entity_varchar表中为'custom_field'添加了一个设置为'abcd'的store_id = 0条目时,loadByAttribute得到了预期的结果。

我的问题是,为什么'name'字段在catalog_category_entity_varchar中获得store_id = 0条目且我的自定义字段不是?
如何按自定义属性加载类别?

4 个答案:

答案 0 :(得分:2)

如果您将以下密钥更改为全局,则应将其添加到两个商店

 'global'        => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,

答案 1 :(得分:1)

这里有更多的猜测而不是知道任何事情,因为你有很多事情发生,我不确定我是否关注你对store_id的关注(不是说这是一个有效的关注,我只是不确定它在哪里进入图片)

设置属性时,使用了

'filterable'    => false,

尝试使用此设置为true设置新属性。如果您查看loadByAttribute源代码,它会使用属性过滤来工作,因此如果您想使用此方法,则需要可过滤的属性。

答案 2 :(得分:0)

我正在运行1.4.1.1并注意到自定义产品属性存在类似问题。如果您通过属性过滤集合,该属性必须具有默认商店的值以及您感兴趣的商店。您可以看到为什么如果您执行以下操作

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

当您查看日志文件中的查询时,您将看到magneto在store_id 0的属性表上进行内部连接,因此如果您尚未为存储零创建值,则无法为您提供结果。对我来说似乎是一个错误,我认为Magento应该进行LEFT JOIN。

答案 3 :(得分:0)

在使用自定义属性加载模型之前清除缓存,loadByAttribute工作正常。