読み取り専用の製品バックエンド属性


13

読み取り専用の属性を作成したいのですが、不可能に見えます。

私はaddAttribute(に渡そうとしました)している'disabled' =>trueか、'readonly' => true いずれかの成功を収めてと。私は使用に関するいくつかの提案を見つけましたsetLockedAttributes()が、何らかの理由で機能していません

参照:
Varien_Data_Form_Element_Abstract::serialize($attributes = array(), $valueSeparator='=', $fieldSeparator=' ', $quote='"')


2
:質問はstackoverflowの上で答えたstackoverflow.com/questions/6384120/...
ファビアンBlechschmidt

このソリューションは機能していません。(setLockedAttributes)
Fra

2
そうではありませんsetLockedAttributeそれは、lockAttribute:-)
user487772

1
ティム!あなたは笑った!:-D
benmarks

みんなありがとう...スレッドの更新をチェックして
みよう

回答:


11

参照されたSOの記事から-私は試しましたが、これは実際に1.6CEと1.7CE / 1.12EEで動作します。私はまだ1.8 / 1.13で試していません。

/programming/6384120/magento-read-only-and-hidden-product-attributes

結局のところ、できるように見えます。catalog_product_load_afterイベントのオブザーバーを追加した後lockAttributeMage_Catalog_Model_Abstractクラスのメソッドを使用して製品属性を読み取り専用にすることができます。observerメソッドのコードは次のとおりです。

public function lockAttributes($observer) {
    $event = $observer->getEvent();
    $product = $event->getProduct();
    $product->lockAttribute('attribute_code');
}

1
ofcの編集時にのみロックを行う必要がある場合は、catalog_product_edit_action代わりにイベント(stackoverflow.com/a/7874345/394589)を使用します。
nevvermind

8

製品管理で編集できないようにするのに十分な場合は、フロントエンド入力タイプを使用してlabel、フォーム入力をプレーンテキストに置き換えます。

addAttribute($entity, $code, array(
    ...
    'input' => 'label',
    ...
));

これにより、APIまたは操作されたPOST要求による属性の保存が妨げられないことに注意してください。安全にするために、lockAttribute() 上記のように追加で使用します

また、テキストタイプの属性、他のタイプの場合にのみ適切に見えますが、ここでもlockAttributes「ラベル」タイプにフォールバックするか、「ラベル」タイプを拡張します。


これは、属性がテキストタイプの場合にのみ機能します。ブール値にはlockattribute()が必要です
Fra

1
良い点、@ Fra、ありがとう!それを答えに追加します
ファビアンシュメングラー

でも、テキスト属性の1.9.4.1で動作するようには思えない
オジー

3

これを修正するには、代わりに入力レンダラーを使用します。欠点は、入力タイプごとにこれを行い、各属性のセットアップを介してこれを設定する必要があることです。

そのためには、使用input_rendererの使用時にキーをaddAttributeを属性またはfrontend_input_rendererを使用している場合updateAttributeを。例:

$installer->addAttribute(Mage_Catalog_Model_Product::ENTITY, 'yourattribute', array(
// ...
// won't be used actually as you use a custom renderer (constant equals to text), but I'm not sure what omitting this will have as effect..
    'input' => Mage_Catalog_Model_Product_Option::OPTION_GROUP_TEXT,
    'input_renderer' => 'yourns_yourmodule/adminhtml_product_helper_form_disabledText',
    'frontend_class' => 'disabled',
    'note' => 'This field is disabled',
// ...
));

次に、クラスでYourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledText実際に使用する入力クラスを拡張します 。テキストフィールドの場合はになりますVarien_Data_Form_Element_Text。選択の場合などになりますVarien_Data_Form_Element_Select

次のようなコードを追加して、属性を無効にし、getHtmlメソッドを上書きし、属性を設定して、入力フィールドの実際のHTMLコードを返します。

public function getHtml()
{
    // Set disabled
    $this->setReadonly(true, true);
    return parent::getHtml();
}

このメソッドはlib / Varien / Data / Form / Abstract.phpにあり、すべてのフォーム入力要素フィールドに継承されるため、常に利用可能である必要があります。

/**
 * Disable elements
 *
 * @param boolean $readonly
 * @param boolean $useDisabled
 * @return Varien_Data_Form_Abstract
 */
public function setReadonly($readonly, $useDisabled = false)
{
    if ($useDisabled) {
        $this->setDisabled($readonly);
        $this->setData('readonly_disabled', $readonly);
    } else {
        $this->setData('readonly', $readonly);
    }
    foreach ($this->getElements() as $element) {
        $element->setReadonly($readonly, $useDisabled);
    }

    return $this;
}

上記のように、無効なクラスを属性設定に含めて、拒否された入力の可能性を視覚化することはおそらく意味があります。$this->addClass('disabled')メソッドで使用することもできますが、まだ試していません。

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