Schreibgeschütztes Produkt-Backend-Attribut

13

Ich möchte ein Attribut erstellen, das nur lesbar ist. Es sieht jedoch so aus, als wäre dies nicht möglich.

Ich habe versucht, addAttribute () 'disabled' =>trueoder 'readonly' => true ohne Erfolg zu übergeben. Ich habe einen Vorschlag über die Verwendung gefunden, setLockedAttributes()aber aus irgendeinem Grund funktioniert es nicht

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

Fra
quelle
2
Die Frage wurde auf stackoverflow beantwortet: stackoverflow.com/questions/6384120/…
Fabian Blechschmidt
Diese Lösung funktioniert nicht. (setLockedAttributes)
Fra
2
es ist nicht setLockedAttribute, es ist lockAttribute:-)
user487772
1
Tim! Du hast gelächelt! :-D
benmarks
Danke Jungs ... werde ich es aus einem Update überprüft den Faden
Ab

Antworten:

11

Aus dem SO-Artikel, auf den verwiesen wird - ich habe es versucht und dies funktioniert tatsächlich auf 1.6CE und 1.7CE / 1.12EE. Ich habe 1.8 / 1.13 noch nicht ausprobiert.

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

OK, es sieht so aus, als ob es doch noch geht. Nach dem Hinzufügen eines Beobachters für das catalog_product_load_afterEreignis kann die lockAttributeMethode der Mage_Catalog_Model_AbstractKlasse verwendet werden, um ein Produktattribut schreibgeschützt zu machen. Hier ist der Code für die Observer-Methode:

public function lockAttributes($observer) {
    $event = $observer->getEvent();
    $product = $event->getProduct();
    $product->lockAttribute('attribute_code');
}
Philwinkle
quelle
1
Ich würde stattdessen mit dem catalog_product_edit_actionEreignis gehen ( stackoverflow.com/a/7874345/394589 ), wenn das Sperren nur beim Bearbeiten von c erfolgen muss.
Nevvermind
8

Wenn es ausreicht, dass Sie es in der Produktverwaltung nicht bearbeitbar machen, verwenden Sie den Eingabetyp des Frontends label, der die Formulareingabe durch einfachen Text ersetzt:

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

Beachten Sie, dass dies das Speichern des Attributs über eine API oder eine manipulierte POST-Anforderung nicht verhindert. Verwenden Sie es zusätzlich lockAttribute() wie oben empfohlen, um die Sicherheit zu erhöhen .

Auch sieht es nur für Texttypattribute gut aus, für andere Typen wiederum greifen Sie auf lockAttributesden Typ "label" zurück oder erweitern ihn.

Fabian Schmengler
quelle
Dies funktioniert nur, wenn das Attribut vom Typ text ist. Für Boolean benötigen Sie lockattribute ()
Fra
1
Guter Punkt, @Fra, danke! Ich werde es der Antwort hinzufügen
Fabian Schmengler
Scheint in 1.9.4.1 nicht zu funktionieren, auch nicht für Textattribute
OZZIE
3

Um dies zu beheben, können Sie alternativ einen Eingabe-Renderer verwenden. Der Nachteil ist, dass Sie dies für jeden Eingabetyp tun und dies über das Setup für jedes Attribut einstellen müssen.

Verwenden Sie dazu den Schlüssel input_renderer, wenn Sie ein Attribut addAttribute verwenden , oder frontend_input_renderer, wenn Sie updateAttribute verwenden . 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',
// ...
));

Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledTextErweitern Sie dann mit Ihrer Klasse die Eingabeklasse, die Sie tatsächlich verwenden würden. Für ein Textfeld wäre es Varien_Data_Form_Element_Text. Für Auserwählte wäre es Varien_Data_Form_Element_Selectund so weiter.

Fügen Sie nun Ihren Code wie folgt hinzu, um das Attribut zu deaktivieren, die getHtmlMethode zu überschreiben , das Attribut festzulegen und den tatsächlichen HTML-Code für das Eingabefeld zurückzugeben:

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

Die Methode befindet sich in der Datei lib / Varien / Data / Form / Abstract.php, die von allen Feldern der Formulareingabeelemente übernommen wird und daher 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 deaktivierte Klasse wie oben gezeigt in das Attribut-Setup aufzunehmen, um die Möglichkeit der verweigerten Eingabe zu veranschaulichen. Sie können wahrscheinlich auch $this->addClass('disabled')in der Methode verwenden, ich habe dies noch nicht ausprobiert.

Nico Siebler
quelle