Atributo de fondo del producto de solo lectura

13

Me gustaría crear un atributo de solo lectura, sin embargo, parece que no es posible.

He intentado pasar a addAttribute () 'disabled' =>trueo 'readonly' => true sin ningún éxito. He descubierto algunas sugerencias sobre el uso, setLockedAttributes()pero por alguna razón no funciona.

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

Fra
fuente
2
La pregunta fue respondida en stackoverflow: stackoverflow.com/questions/6384120/…
Fabian Blechschmidt
Esta solución no está funcionando. (setLockedAttributes)
Fra
2
no lo es setLockedAttribute, es lockAttribute:-)
user487772
1
Tim! ¡Tu sonreíste! :-D
puntos de referencia
gracias chicos ... Lo comprobaré y actualizaré el hilo
Fra

Respuestas:

11

Del artículo SO referido: lo intenté y esto de hecho funciona en 1.6CE y 1.7CE / 1.12EE. Todavía no lo he probado en 1.8 / 1.13.

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

OK, parece que se puede hacer después de todo. Después de agregar un observador para el catalog_product_load_afterevento, el lockAttributemétodo de la Mage_Catalog_Model_Abstractclase se puede usar para hacer que un atributo del producto sea de solo lectura. Aquí está el código para el método del observador:

public function lockAttributes($observer) {
    $event = $observer->getEvent();
    $product = $event->getProduct();
    $product->lockAttribute('attribute_code');
}
philwinkle
fuente
1
En su lugar, iría con el catalog_product_edit_actionevento ( stackoverflow.com/a/7874345/394589 ), si el bloqueo solo debe realizarse al editar ofc.
nevvermind
8

Si es suficiente para que no sea editable en la gestión del producto, utilice el tipo de entrada de la interfaz label, que reemplaza la entrada del formulario con texto sin formato:

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

Tenga en cuenta que esto no impedirá guardar el atributo a través de API o solicitud POST manipulada. Para hacerlo seguro, utilice adicionalmente lockAttribute() como se sugiere anteriormente .

Además, solo se ve bien para los atributos de tipo de texto, para otros tipos, nuevamente, recurra lockAttributeso extienda el tipo de "etiqueta".

Fabian Schmengler
fuente
esto funciona solo si el atributo es de tipo texto, para booleano necesita lockattribute ()
Fra
1
Buen punto, @Fra, gracias! Lo
agregaré
No parece funcionar en 1.9.4.1 incluso para atributos de texto
OZZIE
3

Para arreglar esto, también puede utilizar un procesador de entrada para esto. La desventaja es que tendría que hacer esto para cada tipo de entrada y configurarlo mediante la configuración de cada atributo.

Para hacerlo, use la tecla input_renderer cuando use addAttribute un atributo o frontend_input_renderer cuando use updateAttribute . Ejemplo:

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

Luego, con su clase, Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledTextextienda la clase de entrada que realmente usaría. Para un campo de texto sería Varien_Data_Form_Element_Text. Para selecciones sería Varien_Data_Form_Element_Selecty así sucesivamente.

Ahora agregue su código como este para deshabilitar el atributo, sobrescribiendo el getHtmlmétodo, configurando el atributo y devolviendo el código HTML real para el campo de entrada:

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

El método se puede encontrar en lib / Varien / Data / Form / Abstract.php, que será heredado por todos los campos de elementos de entrada de formulario, por lo que siempre debe estar 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;
}

Probablemente tenga sentido incluir la clase deshabilitada en la configuración de atributos como se muestra arriba para visualizar la posibilidad de entrada denegada. Probablemente también puedas usarlo $this->addClass('disabled')en el método, todavía no lo intenté.

Nico Siebler
fuente