Attribut Backend de produit en lecture seule


13

Je voudrais créer un attribut en lecture seule mais il semble que ce ne soit pas possible.

J'ai essayé de passer à addAttribute () 'disabled' =>trueou 'readonly' => true sans succès. J'ai découvert une suggestion d'utilisation, setLockedAttributes()mais pour une raison quelconque, cela ne fonctionne pas

Référence:
Varien_Data_Form_Element_Abstract::serialize($attributes = array(), $valueSeparator='=', $fieldSeparator=' ', $quote='"')


2
La question a été répondue sur stackoverflow: stackoverflow.com/questions/6384120/…
Fabian Blechschmidt

Cette solution ne fonctionne pas. (setLockedAttributes)
partir de

2
ce n'est pas le cas setLockedAttribute, c'est lockAttribute:-)
user487772

1
Tim! Tu as souri! :-D
benmarks

merci les gars ... je vais vérifier une mise à jour du fil
Fra

Réponses:


11

De l'article référencé SO - j'ai essayé et cela fonctionne en effet sur 1.6CE et 1.7CE / 1.12EE. Je n'ai pas encore essayé sur 1.8 / 1.13.

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

OK, il semble que cela puisse être fait après tout. Après avoir ajouté un observateur pour l' catalog_product_load_afterévénement, la lockAttributeméthode de la Mage_Catalog_Model_Abstractclasse peut être utilisée pour rendre un attribut de produit en lecture seule. Voici le code de la méthode d'observation:

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

1
J'irais catalog_product_edit_actionplutôt avec l' événement ( stackoverflow.com/a/7874345/394589 ), si le verrouillage doit être effectué uniquement lors de la modification de ofc.
Nevvermind

8

S'il vous suffit de le rendre non modifiable dans la gestion des produits, utilisez le type d'entrée frontend label, qui remplace l'entrée du formulaire par du texte brut:

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

Notez que cela n'empêchera pas l'enregistrement de l'attribut via l'API ou la requête POST manipulée. Pour le sécuriser, utilisez également lockAttribute() comme suggéré ci-dessus .

De plus, cela ne semble bon que pour les attributs de type texte, pour les autres types, encore une fois, retenez lockAttributesou étendez le type "label".


cela ne fonctionne que si l'attribut est de type texte, pour booléen vous avez besoin de lockattribute ()
Fra

1
Bon point, @Fra, merci! Je vais l'ajouter à la réponse
Fabian Schmengler

Ne semble pas fonctionner dans la version 1.9.4.1 même pour les attributs de texte
OZZIE

3

Pour résoudre ce problème, vous pouvez également utiliser un rendu d'entrée pour cela. L'inconvénient est que vous devez le faire pour chaque type d'entrée et le définir via la configuration pour chaque attribut.

Pour ce faire, utilisez la clé input_renderer lorsque vous utilisez addAttribute un attribut ou frontend_input_renderer lorsque vous utilisez updateAttribute . Exemple:

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

Ensuite, avec votre classe, Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledTextétendez la classe d'entrée que vous utiliseriez réellement. Pour un champ de texte, ce serait Varien_Data_Form_Element_Text. Pour les sélections, ce serait Varien_Data_Form_Element_Selectet ainsi de suite.

Ajoutez maintenant votre code comme celui-ci pour désactiver l'attribut, en écrasant la getHtmlméthode, en définissant l'attribut et en renvoyant le code HTML réel pour le champ de saisie:

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

La méthode peut être trouvée dans lib / Varien / Data / Form / Abstract.php qui sera héritée par tous les champs des éléments d'entrée du formulaire, elle devrait donc toujours être disponible.

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

Il est probablement judicieux d'inclure la classe désactivée dans la configuration d'attribut comme indiqué ci-dessus pour visualiser la possibilité d'entrée refusée. Vous pouvez probablement aussi l'utiliser $this->addClass('disabled')dans la méthode, je n'ai pas encore essayé cela.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.