คุณลักษณะแบ็กเอนด์ผลิตภัณฑ์อ่านอย่างเดียว


13

ฉันต้องการสร้างแอททริบิวอ่านอย่างเดียว แต่มันดูเป็นไปไม่ได้

ฉันได้ลองส่งต่อไปยัง addAttribute () 'disabled' =>trueหรือ'readonly' => true ประสบความสำเร็จไม่ได้ ฉันพบคำแนะนำเกี่ยวกับการใช้setLockedAttributes()แต่ด้วยเหตุผลบางอย่างมันไม่ทำงาน

อ้างอิง:
Varien_Data_Form_Element_Abstract::serialize($attributes = array(), $valueSeparator='=', $fieldSeparator=' ', $quote='"')


2
คำถามได้รับคำตอบใน stackoverflow: stackoverflow.com/questions/6384120/…
Fabian Blechschmidt

วิธีนี้ไม่ทำงาน (setLockedAttributes)
รา

2
ไม่ใช่setLockedAttribute, มันคือlockAttribute:-)
user487772

1
ทิม! คุณยิ้ม! :-D
benmarks

ขอบคุณครับ ... ผมจะตรวจสอบการอัปเดตด้าย
Fra

คำตอบ:


11

จากบทความ SO ที่อ้างอิง - ฉันพยายามและสิ่งนี้ใช้ได้กับ 1.6CE และ 1.7CE / 1.12EE ฉันยังไม่ได้ลองในวันที่ 1.8 / 1.13

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

ตกลงดูเหมือนว่าสามารถทำได้หลังจากทั้งหมด หลังจากเพิ่มผู้สังเกตการณ์สำหรับcatalog_product_load_afterเหตุการณ์lockAttributeเมธอดของMage_Catalog_Model_Abstractคลาสอาจถูกใช้เพื่อทำให้แอ็ตทริบิวต์ผลิตภัณฑ์เป็นแบบอ่านอย่างเดียว นี่คือรหัสสำหรับวิธีการสังเกตการณ์:

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

1
ฉันจะไปกับcatalog_product_edit_actionกิจกรรมแทน ( stackoverflow.com/a/7874345/394589 ) หากจำเป็นต้องทำการล็อคเมื่อแก้ไข ofc เท่านั้น
nevvermind

8

หากคุณไม่สามารถแก้ไขได้ในการจัดการผลิตภัณฑ์ให้ใช้ประเภทอินพุตส่วนหน้าlabelซึ่งจะแทนที่แบบฟอร์มอินพุตด้วยข้อความธรรมดา:

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

โปรดทราบว่านี่จะไม่ป้องกันการบันทึกแอตทริบิวต์ผ่าน API หรือคำขอ POST ที่จัดการ เพื่อให้การรักษาความปลอดภัยนอกจากนี้ใช้เป็นข้อเสนอแนะดังกล่าวข้างต้นlockAttribute()

นอกจากนี้ยังดูดีสำหรับแอตทริบิวต์ประเภทข้อความสำหรับประเภทอื่น ๆ อีกครั้งถอยกลับlockAttributesหรือขยายประเภท "ป้ายกำกับ"


นี้ทำงานได้เฉพาะในกรณีที่แอตทริบิวต์เป็นประเภทข้อความสำหรับบูลที่คุณต้อง lockattribute ()
รา

1
จุดดี @Fra ขอบคุณ! ฉันจะเพิ่มไปยังคำตอบ
Fabian Schmengler

ดูเหมือนจะใช้งานไม่ได้ใน 1.9.4.1 แม้กระทั่งกับแอตทริบิวต์ข้อความ
OZZIE

3

ในการแก้ไขปัญหานี้คุณสามารถใช้ตัวแสดงผลอินพุตสำหรับสิ่งนี้ได้ ข้อเสียคือคุณจะต้องทำสิ่งนี้สำหรับอินพุตแต่ละประเภทและตั้งค่านี้ผ่านการตั้งค่าสำหรับแต่ละแอตทริบิวต์

ต้องการทำเช่นนั้นใช้input_rendererที่สำคัญเมื่อใช้addAttributeแอตทริบิวต์หรือfrontend_input_rendererเมื่อใช้updateAttribute ตัวอย่าง:

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

จากนั้นด้วยคลาสของคุณ Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledTextขยายคลาสอินพุตที่คุณจะใช้จริง Varien_Data_Form_Element_Textสำหรับฟิลด์ข้อความมันจะเป็น สำหรับการเลือกมันจะเป็นVarien_Data_Form_Element_Selectและอื่น ๆ

ตอนนี้เพิ่มรหัสของคุณเช่นนี้เพื่อปิดการใช้งานคุณลักษณะเขียนทับgetHtmlวิธีการตั้งค่าคุณลักษณะและส่งกลับรหัส HTML ที่แท้จริงสำหรับช่องใส่:

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

วิธีการสามารถพบได้ในlib / Varien / Data / Form / Abstract.phpซึ่งจะได้รับการสืบทอดจากทุกช่องใส่องค์ประกอบองค์ประกอบดังนั้นมันควรจะใช้ได้

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

เป็นเรื่องที่สมเหตุสมผลที่จะรวมคลาสที่ปิดใช้งานไว้ในการตั้งค่าแอตทริบิวต์ดังที่แสดงไว้ด้านบนเพื่อให้เห็นภาพความเป็นไปได้ของข้อมูลที่ถูกปฏิเสธ คุณอาจใช้$this->addClass('disabled')วิธีนี้ได้ฉันยังไม่ได้ลอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.