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

結果が出ません。しかし、'Test Category' に設定された 'name' フィールドを使用して loadByAttribute を実行すると、結果が得られます。

そのため、データベースでテーブルを調べcatalog_category_entity_varcharたところ、'name' 属性には store_id = 0 と store_id = 1 の両方のエントリがあるのに対し、'custom_field' 属性には store_id = 1 のエントリしかないことがわかりました。

テーブルで値が「abcd」に設定された「custom_field」の store_id = 0 エントリを追加するとcatalog_category_entity_varchar、loadByAttribute は期待どおりの結果を取得しました。

私の質問は、'name' フィールドが 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

あなたは多くのことを行っており、store_idに関するあなたの懸念に従うかどうかはわかりません(それが有効な懸念であるというわけではありません。それがどこにあるのかわかりません。 )

属性を設定するときに、使用した

'filterable'    => false,

これを true に設定して新しい属性を設定してみてください。ソース コードを見ると、loadByAttribute属性フィルタリングを使用して動作しているため、この方法を使用する場合は、フィルター可能な属性が必要になります。

于 2010-05-21T23:13:39.913 に答える
0

1.4.1.1を実行していますが、カスタム製品属性で同様の問題が発生していることに気付きました。属性でコレクションをフィルタリングする場合、その属性には、デフォルトのストアと目的のストアの値が必要です。次のようにすると、その理由がわかります。

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

ログファイルのクエリを見ると、Magnetoがstore_id 0の属性テーブルに内部結合を行っていることがわかります。したがって、ストア0の値を作成していない場合、結果を得ることができません。私にはバグのように思えますが、MagentoはLEFTJOINを実行する必要があると思います。

于 2010-09-01T11:19:46.803 に答える