Schreibgeschütztes Produkt-Backend-Attribut
-
16-10-2019 - |
Frage
Ich möchte ein Attribut erstellen, das nur gelesen wird, aber es sieht nicht möglich aus.
Ich habe versucht, an AddatTribute zu gelangen () 'disabled' =>true
oder 'readonly' => true
ohne Erfolg. Ich habe einen Vorschlag zur Verwendung herausgefunden setLockedAttributes()
Aber aus irgendeinem Grund funktioniert es nicht
Bezug:
Varien_Data_Form_Element_Abstract::serialize($attributes = array(), $valueSeparator='=', $fieldSeparator=' ', $quote='"')
Lösung
Aus dem Referenz -SO -Artikel - ich habe es versucht und dies funktioniert tatsächlich auf 1.6CE und 1.7CE / 1.12ee. Ich habe noch nicht mit 1.8/1.13 ausprobiert.
https://stackoverflow.com/questions/6384120/magento-read-only-and-hidden-product-attributes
Ok, es sieht so aus, als ob es doch gemacht werden kann. Nach dem Hinzufügen eines Beobachters für die
catalog_product_load_after
Ereignis, dielockAttribute
Methode derMage_Catalog_Model_Abstract
Die Klasse kann verwendet werden, um ein Produktattribut schreibgeschützt zu machen. Hier ist der Code für die Beobachtermethode:
public function lockAttributes($observer) {
$event = $observer->getEvent();
$product = $event->getProduct();
$product->lockAttribute('attribute_code');
}
Andere Tipps
Wenn es für Sie ausreicht, um es in der Produktverwaltung nicht bearbeitbar zu machen, verwenden Sie den Frontend -Eingangstyp label
, was die Formeingabe durch einen einfachen Text ersetzt:
addAttribute($entity, $code, array(
...
'input' => 'label',
...
));
Beachten Sie, dass dies nicht verhindert, dass das Attribut durch API oder manipulierte Postanfrage speichert. Um es sicher zu machen, verwenden Sie zusätzlich lockAttribute()
wie oben vorgeschlagen.
Außerdem sieht es nur für Texttyp -Attribute gut aus, für andere Typen wieder auf lockAttributes
oder erweitern Sie den "Etikett" -Typ.
Um dies zu beheben, können Sie dafür alternativ einen Eingabegrenderer verwenden. Der Nachteil ist, dass Sie dies für jeden Eingangstyp tun und diese über ein Setup für jedes Attribut festlegen müssen.
Verwenden Sie dazu die input_renderer Schlüssel bei Verwendung Attribute hinzufügen ein Attribut oder frontend_input_renderer beim Benutzen UpdateAttribute. Beispiel:
$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',
// ...
));
Dann mit deiner Klasse Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledText
Erweitern Sie die Eingangsklasse, die Sie tatsächlich verwenden würden. Für ein Textfeld wäre es Varien_Data_Form_Element_Text
. Für ausgewählte es wäre Varien_Data_Form_Element_Select
usw.
Fügen Sie nun Ihren Code wie diesen hinzu, um das Attribut zu deaktivieren, und überschreiben Sie das getHtml
Methode, Festlegen des Attributs und Rückgabe des tatsächlichen HTML -Code für das Eingabefeld:
public function getHtml()
{
// Set disabled
$this->setReadonly(true, true);
return parent::getHtml();
}
Die Methode kann in gefunden werden lib/varien/data/form/communcess.php Dies wird von allen Feldern für das Eingangselement in Form von Formularen vererbt, sodass es immer verfügbar sein sollte.
/**
* 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;
}
Es ist wahrscheinlich sinnvoll, die aufzunehmen deaktiviert Klasse im Attribut -Setup wie oben gezeigt, um die verweigerte Eingabemöglichkeit zu visualisieren. Sie können wahrscheinlich auch verwenden $this->addClass('disabled')
In der Methode habe ich das noch nicht versucht.