Attributo di sola lettura backend del prodotto
-
16-10-2019 - |
Domanda
vorrei creare un attributo solo lettura tuttavia osservare che non è possibile.
ho cercato di passare a AddAttribute () 'disabled' =>true
o 'readonly' => true
con qualsiasi successo.
Ho scoperto qualche suggerimento su come utilizzare setLockedAttributes()
ma per qualche ragione non funziona
Riferimento:
Varien_Data_Form_Element_Abstract::serialize($attributes = array(), $valueSeparator='=', $fieldSeparator=' ', $quote='"')
Soluzione
Dall'articolo SO riferimento - ho provato e funziona davvero su 1.6CE e 1.7CE / 1.12EE. Non ho provato a 1,8 / 1,13 a partire da ancora.
https://stackoverflow.com/questions/6384120/magento-read -Solo-e-nascosto-prodotto-attributi
OK, sembra che si può fare, dopo tutto. Dopo aver aggiunto un osservatore per l'evento
catalog_product_load_after
, il metodo dilockAttribute
la classeMage_Catalog_Model_Abstract
può essere usato per fare un prodotto attributo di sola lettura. Ecco il codice per il metodo di osservazione:
public function lockAttributes($observer) {
$event = $observer->getEvent();
$product = $event->getProduct();
$product->lockAttribute('attribute_code');
}
Altri suggerimenti
Se è abbastanza per voi per rendere non modificabile nella gestione del prodotto, utilizzare il tipo di input label
frontend, che sostituisce l'ingresso modulo con testo semplice:
addAttribute($entity, $code, array(
...
'input' => 'label',
...
));
Si noti che questo non impedirà salvare l'attributo attraverso API o richiesta POST manipolato. Per renderlo sicuro, utilizzare in aggiunta lockAttribute()
come suggerito sopra .
Inoltre sembra solo un bene per gli attributi di tipo testo, per gli altri tipi, ancora una volta, ricadere lockAttributes
o estendere il tipo di "etichetta".
Per fare questo riparato, in alternativa è possibile utilizzare un renderer di ingresso per questo. Il rovescio della medaglia è, si dovrebbe fare questo per ogni tipo di ingresso e impostare questa via di installazione per ciascun attributo.
Per fare ciò, utilizzare il input_renderer chiave quando si usa AddAttribute un attributo o frontend_input_renderer quando si usa 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',
// ...
));
Poi, con la tua classe Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledText
estendere la classe di ingresso che si sarebbe effettivamente utilizzare. Per un campo di testo che sarebbe stato Varien_Data_Form_Element_Text
.
Per seleziona sarebbe Varien_Data_Form_Element_Select
e così via.
Ora aggiungere il codice come questo per disabilitare l'attributo, sovrascrivendo il metodo getHtml
, impostando l'attributo e restituire il codice HTML 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 / dati / Form / Abstract.php che verrà ereditato da tutti i campi elemento di input forma, quindi dovrebbe essere disponibile alaways.
/**
* 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;
}
E 'probabilmente senseful per includere il disabilitata ??em> di classe nel setup attributo come mostrato sopra per visualizzare la possibilità di ingresso negato.
Probabilmente si può anche utilizzare $this->addClass('disabled')
nel metodo, non ho provato questo ancora.