エンティティをMagentoの別のエンティティの属性として使用する


7

このチュートリアルに従いますが、私の質問です。EAVエンティティを新しいEAVエンティティの属性として使用できますか?

ありがとう。

編集:私が最初に投稿したチュートリアルはかなりめちゃくちゃで、代わりにこの他のチュートリアルに従っしまいました。

回答:


13

はい、可能です。
カスタムソースモデルを持つメインエンティティの属性を追加する必要があります。

エンティティが呼び出され、エンティティに属性を持たせたいArticleAuthorします。そのため、記事を追加/編集するときに、ドロップダウンからすべての著者の1人を選択できます。 ArticleAuthor

これをTC_Skeleton_Model_Resource_Setup、他の属性の中で(リンクした例から)セットアップクラスに追加する必要があります。

               'author_id' => array(
                    'type' => 'int',
                    'label' => 'Author',
                    'input' => 'select',
                    'required' => true, //or false
                    'sort_order' => 10, //what ever
                    'position' => 10,//what ever
                    'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL, //or SCOPE_WEBSITE or SCOPE_STORE,
                    'source' => '[module_alias]/source_author', //this needs to be added
                ),   

次に[Namespace]_[Module]_Model_Source_Author、このコンテンツでクラスを作成します

<?php
class [Namespace]_[Module]_Model_Source_Author extends Mage_Eav_Model_Entity_Attribute_Source_Abstract{
    protected $_options = null;
    public function getAllOptions($withEmpty = false){
        if (is_null($this->_options)){
            $this->_options = array();
            $authors = Mage::getModel('[module_alias]/author')->getCollection()->addAttributeToSelect('name')->addAttributeToSelect('country');
            foreach ($authors as $author) {
                $this->_options[] = array(
                    'value' => $author->getId(),
                    'label' => $author->getName(). ' - '.$author->getCountry()
                );
            }
        }
        $options = $this->_options;
        if ($withEmpty) {
            array_unshift($options, array('value'=>'', 'label'=>''));
        }
        return $options;
    }
    public function getOptionText($value)
    {
        $options = $this->getAllOptions(false);

        foreach ($options as $item) {
            if ($item['value'] == $value) {
                return $item['label'];
            }
        }
        return false;
    }
}

さらに、カスタムソースモデルを使用して属性を製品に追加する方法の例とここ見つけることができます。エンティティがEAVの場合、同じように機能します。最も重要な部分は、getAllOptions上記のクラスのメソッドです。値の配列を返す限り、そこで何でもできます。

また、この拡張機能が役立つ場合があります。エンティティ(EAVまたはフラット)に必要なファイルをオンザフライで構築でき、エンティティ間の関係(1対多または多対多)を確立することもできます。あなたのケースでは、1対多の関係が必要です。


私は拡張機能の開発に関わっていますが、誰でも自由に使用または変更できます。


4
何?!恥知らずなセルフプロモーション!jk /クールな回答:)
Sander Mangel

@サンダー私は恥ずかしいことは何もありません:)
マリウス

ひとこと。あなたの例では、「著者」が「国」と呼ばれる属性を持っていると想像してください。記事エンティティのドロップダウンオプションとして「著者-国」を表示することはできますか?
VDD

1
@VDD必要に応じてコードを変更しました。
マリウス

@Marius他の拡張機能からソースモデルにアクセスするにはどうすればよいですか?新しいEAVエンティティのこれらすべての属性の選択フィールドセットでadminhtml拡張を実行しています。$ fieldset-> addField( 'author'、 'select'、array( 'label' => $ this-> __( 'Author')、 'class' => 'required-entry'、 'required'を試しました=> true、 'name' => 'author'、 'value' => '1'、 'values' => Mage :: getResourceModel( 'namespace_module / source_author)-> getAllOptions()、)); しかし、エラーInvalid method Namespace_Module_Model_Author :: addFieldToSelect(Array([0] => name))
VDD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.