我已经在模块的安装脚本中为类别创建了自定义属性,如下所示:
$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条目且我的自定义字段不是?
如何按自定义属性加载类别?
答案 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工作正常。