2

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

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

我没有结果。但是,如果我使用设置为“测试类别”的“名称”字段加载ByAttribute,我会得到一个结果。

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

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

我的问题是,为什么“名称”字段中有一个 store_id = 0 条目,catalog_category_entity_varchar而我的自定义字段却没有?
如何按自定义属性加载类别?

4

4 回答 4

2

如果您将以下键更改为全局,那么它应该为两个商店添加它

 'global'        => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
于 2011-07-08T15:18:28.930 回答
1

这里的猜测比了解 sute 更多,因为您有很多事情要做,而且我不确定我是否遵循您对 store_id 的关注(不是说这是一个有效的关注,我只是不确定它在哪里进入图片)

设置属性时,您使用了

'filterable'    => false,

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

于 2010-05-21T23:13:39.913 回答
0

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

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

当您查看日志文件中的查询时,您会看到 Magento 对 store_id 0 的属性表进行了内部连接,因此如果您没有为 store 0 创建值,它就无法为您提供结果。对我来说似乎是一个错误,我认为 Magento 应该做一个 LEFT JOIN。

于 2010-09-01T11:19:46.803 回答
0

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

于 2016-07-13T16:55:45.023 回答