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='"')

War es hilfreich?

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, die lockAttribute Methode der Mage_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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top