Atributo Back-end do Produto Somente Leitura

13

Gostaria de criar um atributo somente leitura, no entanto, parece que não é possível.

Eu tentei passar para addAttribute () 'disabled' =>trueou 'readonly' => true sem qualquer sucesso. Descobri alguma sugestão sobre o uso, setLockedAttributes()mas por algum motivo não está funcionando

Referência:
Varien_Data_Form_Element_Abstract::serialize($attributes = array(), $valueSeparator='=', $fieldSeparator=' ', $quote='"')

Fra
fonte
2
A pergunta foi respondida no stackoverflow: stackoverflow.com/questions/6384120/… #
Fabian Blechschmidt 15/02/2013
Esta solução não está funcionando. (setLockedAttributes)
A partir de
2
não é setLockedAttribute, é lockAttribute:-)
user487772 15/02
1
Tim! Você sorriu! :-D
benmarks 16/02
obrigado pessoal ... Vou verificar uma atualização do tópico
Fra

Respostas:

11

No artigo do SO mencionado - eu tentei e isso realmente funciona em 1.6CE e 1.7CE / 1.12EE. Ainda não testei o 1.8 / 1.13.

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

OK, parece que isso pode ser feito, afinal. Após adicionar um observador para o catalog_product_load_afterevento, o lockAttributemétodo da Mage_Catalog_Model_Abstractclasse pode ser usado para tornar um atributo do produto somente leitura. Aqui está o código para o método observador:

public function lockAttributes($observer) {
    $event = $observer->getEvent();
    $product = $event->getProduct();
    $product->lockAttribute('attribute_code');
}
philwinkle
fonte
1
Eu iria com o catalog_product_edit_actionevento ( stackoverflow.com/a/7874345/394589 ), se o bloqueio precisar ser feito apenas ao editar ofc.
precisa saber é o seguinte
8

Se for o suficiente para torná-lo não editável no gerenciamento de produtos, use o tipo de entrada frontend label, que substitui a entrada do formulário por texto sem formatação:

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

Observe que isso não impedirá o salvamento do atributo por meio da API ou da solicitação POST manipulada. Para torná-lo seguro, use adicionalmente lockAttribute() como sugerido acima .

Além disso, parece bom apenas para os atributos de tipo de texto, para outros tipos, novamente, recuem lockAttributesou estendam o tipo "label".

Fabian Schmengler
fonte
isso funciona somente se o atributo é o tipo de texto, por boolean Você precisa lockattribute ()
Fra
1
Bom ponto, @Fra, obrigado! Eu vou adicioná-lo à resposta
Fabian Schmengler
Não parece trabalho em 1.9.4.1 mesmo para atributos de texto
OZZIE
3

Para corrigir isso, você pode usar um renderizador de entrada como alternativa. A desvantagem é que você teria que fazer isso para cada tipo de entrada e configurá-lo via configuração para cada atributo.

Para fazer isso, use a chave input_renderer ao usar addAttribute um atributo ou frontend_input_renderer ao usar updateAttribute . Exemplo:

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

Então, com sua classe, Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledTextestenda a classe de entrada que você realmente usaria. Para um campo de texto seria Varien_Data_Form_Element_Text. Para seleciona seria Varien_Data_Form_Element_Selecte assim por diante.

Agora adicione seu código assim para desativar o atributo, substituindo o getHtmlmétodo, configurando o atributo e retornando o código HTML real para o campo de entrada:

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

O método pode ser encontrado em lib / Varien / Data / Form / Abstract.php, que será herdado por todos os campos do elemento de entrada do formulário, portanto, deve estar sempre disponível.

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

Provavelmente, é sensato incluir a classe desativada na configuração do atributo, como mostrado acima, para visualizar a possibilidade de entrada negada. Você provavelmente também pode usar $this->addClass('disabled')no método, eu ainda não tentei isso.

Nico Siebler
fonte