Attributo Backend prodotto di sola lettura


13

Vorrei creare un attributo di sola lettura ma sembra che non sia possibile.

Ho provato a passare ad addAttribute () 'disabled' =>trueo 'readonly' => true senza successo. Ho scoperto alcuni suggerimenti sull'utilizzo, setLockedAttributes()ma per qualche motivo non funziona

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


2
La domanda ha avuto risposta su
stackoverflow

Questa soluzione non funziona. (setLockedAttributes)
Fra

2
non lo è setLockedAttribute, è lockAttribute:-)
user487772,

1
Tim! Hai sorriso! :-D
benmarks

grazie ragazzi ... controllerò un aggiornamento del thread
Fra

Risposte:


11

Dall'articolo SO di riferimento - ho provato e questo funziona davvero su 1.6CE e 1.7CE / 1.12EE. Non ho ancora provato 1.8 / 1.13.

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

OK, sembra che dopo tutto si possa fare. Dopo aver aggiunto un osservatore per l' catalog_product_load_afterevento, il lockAttributemetodo della Mage_Catalog_Model_Abstractclasse può essere utilizzato per rendere un attributo del prodotto di sola lettura. Ecco il codice per il metodo osservatore:

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

1
Andrei catalog_product_edit_actioninvece con l' evento ( stackoverflow.com/a/7874345/394589 ), se il blocco deve essere eseguito solo durante la modifica di ofc.
nevvermind

8

Se è sufficiente per renderlo non modificabile nella gestione del prodotto, utilizzare il tipo di input front-end label, che sostituisce l'input del modulo con testo semplice:

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

Si noti che ciò non impedisce il salvataggio dell'attributo tramite API o richiesta POST manipolata. Per renderlo sicuro, utilizzare inoltre lockAttribute() come suggerito sopra .

Inoltre sembra buono solo per gli attributi del tipo di testo, per altri tipi, ancora una volta, ricadere lockAttributeso estendere il tipo "etichetta".


funziona solo se l'attributo è di tipo testo, per booleano è necessario lockattribute ()
Fra

1
Ottimo punto, @Fra, grazie! Lo aggiungerò alla risposta
Fabian Schmengler,

Non sembra funzionare in 1.9.4.1 anche per gli attributi di testo
OZZIE,

3

Per risolvere il problema, puoi utilizzare in alternativa un renderer di input per questo. Il rovescio della medaglia è che dovresti farlo per ogni tipo di input e impostarlo tramite setup per ogni attributo.

Per fare ciò, utilizzare la chiave input_renderer quando si utilizza addAttribute un attributo o frontend_input_renderer quando si utilizza updateAttribute . Esempio:

$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',
// ...
));

Quindi con la tua classe Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledTextestendi la classe di input che useresti effettivamente. Per un campo di testo sarebbe Varien_Data_Form_Element_Text. Per alcuni sarebbe Varien_Data_Form_Element_Selecte così via.

Ora aggiungi il tuo codice in questo modo per disabilitare l'attributo, sovrascrivendo il getHtmlmetodo, impostando l'attributo e restituendo il codice HTML effettivo per il campo di input:

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

Il metodo può essere trovato in lib / Varien / Data / Form / Abstract.php che sarà ereditato da tutti i campi degli elementi di input del modulo, quindi dovrebbe essere sempre disponibile.

/**
 * 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;
}

È probabilmente sensato includere la classe disabilitata nella configurazione degli attributi come mostrato sopra per visualizzare la possibilità di input negata. Probabilmente puoi anche usare $this->addClass('disabled')il metodo, non l'ho ancora provato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.