値を持つ製品属性を追加し、1つの値をデフォルトとしてマークする


7

インストーラスクリプトから製品属性を追加する方法を知っていますが、Magentoにデフォルト値としていずれかの値を使用するように指示するにはどうすればよいですか?(複数選択属性の場合は、より多くの値)。
このコードをインストーラースクリプトで使用して、オプション付きの属性を追加します。

$installer->addAttribute('catalog_product', "some_code_here", array(
    'type'       => 'int', //or varchar if it's multiselect
    'input'      => 'select', //or multiselect
    'label'      => 'Attribute label here',
    'sort_order' => 1000,
    'required'   => false,
    'global'     => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
    'backend'    => 'eav/entity_attribute_backend_array',
    'option'     => array (
        'values' => array(
            0 => 'Value 1',
            1 => 'Value 2',
            2 => 'Value 3',
        )
    ),

)); 

だから私Value 2はデフォルト値にする必要があります。またはValue 2Value 3私が複数選択属性を作成する場合


私が知っている唯一の方法は、属性の作成後に値を取得し、IDを取得して属性を更新することです。やってみたdefault => 'value 2’かな?
Fabian Blechschmidt 2014

@FabianBlechschmidt。ありがとう。私はこのアプローチを知っていますが、これは私が避けようとしていることです。可能であれば、追加の選択や更新を行わずに、インストールスクリプトから実行したいと思います。それ以外の場合は汚れています。しかしそれが不可能な場合は、そのように取り組む必要があると思います。
マリウス

@Marius多分私はまだ混乱しています。あなたが設定スクリプトに追加した属性を持っているが、オプションは後で管理者を介して追加されるという問題がありますか?または別のセットアップスクリプトですか?または、まったく異なる何か;)
David Manners 14

@DavidManners。セットアップスクリプトを使用して属性を追加し、属性とともにいくつかのオプションを追加します。同じセットアップスクリプトを使用して、オプションの1つをデフォルトとして設定します。これは管理者とは関係ありません。colorオプション付きの属性を作成し、そのオプションRed, Green, Blueを(管理者の介入なしで)Greenデフォルトのオプションにしたいとします。これがもう少し明確になったといいのですが。
マリウス

1
@FabianBlechschmidt。回答としてコメントを書くこともできます。インストールスクリプトからこれをエレガントに行う方法はないと思います。
マリウス

回答:


7

tl; dr:select属性の場合、最初の呼び出しで直接宣言することはできません。2つの呼び出しが必要です。addAttribute()

デフォルト値を設定するにeav_attribute.defaultは、eav_attribute_optionテーブルの主キー値を設定する必要があります。高レベルでは、addAttribute()およびaddAttributeOption()メソッドのフローと機能を見ると、2つの呼び出しの必要性が明らかです。

  1. 値を準備する
  2. eav_attributeテーブルへの挿入/更新
  3. セット/グループの挿入/更新
  4. addAttributeOption()オプション値を挿入/更新するための呼び出し

その場合の唯一の希望はaddAttributeOption()eav_attributeレコードを更新できることです。ただし、これを行うコードはありません。このメソッドによってアクセスされるテーブルはeav_attribute_optionおよびのみeav_attribute_option_valueです。

したがってgetAttribute()、最初の呼び出しの後にaddAttribute()呼び出し、属性オプションIDを取得してからを呼び出す必要がありますupdateAttribute()

編集:

以前の回答の後、私は既存のコードに対して私の回答を検証せざるを得ませんでした。結局のところ、catalog_productエンティティには、属性CRUD GUIのおかげで、従うべきMVCフローがあります。また、で\Mage_Adminhtml_Catalog_Product_AttributeController::saveAction()、保存される直前に属性モデルに次のデータが設定されているのを確認しました。

PhpStormとXdebugで視覚化されたオプションとオプション構成データ

属性のdefault値にはvalueキーへの参照があることに注意してください。少し掘り下げると\Mage_Eav_Model_Resource_Entity_Attribute::_saveOption()、このリソースの_afterSave()メソッドから呼び出されるに到達します- eav_attribute更新するレコードが必要であると想定した場合とまったく同じです。最終更新の直前に、複数選択と選択のデフォルトが同じ場所でどのように処理されるかを確認することもできます。

$bind  = array('default_value' => implode(',', $attributeDefaultValue));
$where = array('attribute_id =?' => $object->getId());
$adapter->update($this->getMainTable(), $bind, $where);

したがって、別の方法は、リソースモデルを直接操作することです。


ありがとう。私はこれに非常に失望しています。私はupdateAttributeアプローチをとりましたが、これをエレガントに行う方法があるはずです。たぶんMagento 2にあると思います。
マリウス

ありがとう、でも...残念すぎる!その理由を理解しようとしています。
ベンマークス2014

あなたが間違っているとはどういう意味ですか。悪いことにあなたは正しい:)
マリウス

アップデート-私は間違っていると思いましたが、間違っていませんでした。リソースモデルを直接操作することは可能であり、GUIを介して属性を保存する方法には、その前例があります。
ベンマークス2014

1
更新していただきありがとうございます。グレートマインドのもの。同じ場所にインスピレーションを得ました。これがまさに私がこれを処理した方法です:)
マリウス

0

インストーラーの場合これらは、デフォルトを追加するために説明するaddAttributeの後の2行です。

$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
. . . . 
. . . . 
. . . .     
$attr = $setup->getAttribute('catalog_product', 'attribute_code');
$setup->updateAttribute('catalog_product',$attr['attribute_id'],'default_value', 'default_value1,default_value2,default_value3,default_value4');

attribute_code:は属性コードになりますdefault_value1:はで区切られた対応する値になります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.