Atribut Backend Produk Hanya Baca

13

Saya ingin membuat atribut read only tetapi kelihatannya tidak mungkin.

Saya telah mencoba memberikan addAttribute () 'disabled' =>trueatau 'readonly' => true tanpa hasil. Saya telah menemukan beberapa saran tentang penggunaan setLockedAttributes()tetapi untuk beberapa alasan itu tidak berfungsi

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

Fra
sumber
2
Pertanyaan itu dijawab pada stackoverflow: stackoverflow.com/questions/6384120/…
Fabian Blechschmidt
Solusi ini tidak berfungsi. (setLockedAttributes)
Fra
2
bukan setLockedAttribute, itu adalah lockAttribute:-)
user487772
1
Tim! Kau tersenyum! :-D
patokan
Terima kasih teman-teman ... Saya akan memeriksanya di pembaruan utas
Fra

Jawaban:

11

Dari artikel SO yang direferensikan - saya mencoba dan ini memang bekerja pada 1.6CE dan 1.7CE / 1.12EE. Saya belum mencoba pada 1.8 / 1.13.

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

OK, sepertinya itu bisa dilakukan setelah semua. Setelah menambahkan pengamat untuk catalog_product_load_afteracara tersebut, lockAttributemetode Mage_Catalog_Model_Abstractkelas dapat digunakan untuk membuat atribut produk hanya-baca. Berikut adalah kode untuk metode pengamat:

public function lockAttributes($observer) {
    $event = $observer->getEvent();
    $product = $event->getProduct();
    $product->lockAttribute('attribute_code');
}
Philwinkle
sumber
1
Saya akan pergi dengan catalog_product_edit_actionacara sebagai gantinya ( stackoverflow.com/a/7874345/394589 ), jika penguncian hanya perlu dilakukan saat mengedit ofc.
nevvermind
8

Jika cukup bagi Anda untuk membuatnya tidak dapat diedit dalam manajemen produk, gunakan tipe input frontend label, yang menggantikan input form dengan teks biasa:

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

Perhatikan bahwa ini tidak akan mencegah penyimpanan atribut melalui API atau permintaan POST yang dimanipulasi. Untuk membuatnya aman, gunakan juga lockAttribute() seperti yang disarankan di atas .

Juga hanya terlihat bagus untuk atribut tipe teks, untuk tipe lain, sekali lagi, kembali ke lockAttributesatau memperpanjang jenis "label".

Fabian Schmengler
sumber
ini hanya berfungsi jika atributnya adalah tipe teks, untuk boolean Anda memerlukan lockattribute ()
Fra
1
Poin bagus, @Fra, terima kasih! Saya akan menambahkannya ke jawaban
Fabian Schmengler
Tampaknya tidak berfungsi di 1.9.4.1 bahkan untuk atribut teks
OZZIE
3

Untuk memperbaikinya, Anda dapat menggunakan input renderer sebagai alternatif. Kelemahannya adalah, Anda harus melakukan ini untuk setiap jenis input dan mengatur ini melalui pengaturan untuk setiap atribut.

Untuk melakukannya, gunakan kunci input_renderer saat menggunakan addAttribute atribut atau frontend_input_renderer saat menggunakan updateAttribute . Contoh:

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

Kemudian dengan kelas Anda Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledText, tambah kelas input yang akan Anda gunakan. Untuk bidang teks akan menjadi Varien_Data_Form_Element_Text. Untuk memilih itu akan Varien_Data_Form_Element_Selectdan seterusnya.

Sekarang tambahkan kode Anda seperti ini untuk menonaktifkan atribut, menimpa getHtmlmetode, mengatur atribut dan mengembalikan kode HTML yang sebenarnya untuk bidang input:

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

Metode ini dapat ditemukan di lib / Varien / Data / Form / Abstract.php yang akan diwarisi oleh semua kolom isian form input, sehingga harus selalu tersedia.

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

Mungkin masuk akal untuk memasukkan kelas yang dinonaktifkan di pengaturan atribut seperti yang ditunjukkan di atas untuk memvisualisasikan kemungkinan input yang ditolak. Anda mungkin juga dapat menggunakan $this->addClass('disabled')metode ini, saya belum mencoba ini.

Nico Siebler
sumber