Thuộc tính cuối sản phẩm chỉ đọc


13

Tôi muốn tạo một thuộc tính chỉ đọc tuy nhiên có vẻ như không thể.

Tôi đã cố gắng vượt qua để addAttribution () 'disabled' =>truehoặc 'readonly' => true không thành công. Tôi đã tìm thấy một số gợi ý về việc sử dụng setLockedAttributes()nhưng vì một số lý do nó không hoạt động

Tài liệu tham khảo:
Varien_Data_Form_Element_Abstract::serialize($attributes = array(), $valueSeparator='=', $fieldSeparator=' ', $quote='"')


2
Câu hỏi đã được trả lời trên stackoverflow: stackoverflow.com/questions/6384120/
Fabian Blechschmidt

Giải pháp này không hoạt động. (setLockedAttribut)
Fra

2
không phải setLockedAttribute, đó là lockAttribute:-)
user487772

1
Tim! Bạn đã cười! :-D
đánh dấu

cảm ơn mọi người ... tôi sẽ kiểm tra xem bản cập nhật của chủ đề
Fra

Câu trả lời:


11

Từ bài viết SO được tham chiếu - Tôi đã thử và điều này thực sự hoạt động trên 1.6CE và 1.7CE / 1.12EE. Tôi chưa thử ngày 1.8 / 1.13.

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

OK, có vẻ như nó có thể được thực hiện sau tất cả. Sau khi thêm một người quan sát cho catalog_product_load_aftersự kiện, lockAttributephương thức của Mage_Catalog_Model_Abstractlớp có thể được sử dụng để làm cho thuộc tính sản phẩm chỉ đọc. Đây là mã cho phương thức quan sát viên:

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

1
Tôi sẽ đi với catalog_product_edit_actionsự kiện thay thế ( stackoverflow.com/a/7874345/394589 ), nếu việc khóa chỉ cần được thực hiện khi chỉnh sửa ofc.
nevvermind

8

Nếu nó đủ để bạn không thể chỉnh sửa trong quản lý sản phẩm, hãy sử dụng loại đầu vào lối vào label, thay thế đầu vào biểu mẫu bằng văn bản thuần túy:

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

Lưu ý rằng điều này sẽ không ngăn lưu thuộc tính thông qua API hoặc yêu cầu POST bị thao túng. Để làm cho nó an toàn, sử dụng bổ sung lockAttribute() như đề xuất ở trên .

Ngoài ra, nó chỉ có vẻ tốt cho các thuộc tính loại văn bản, đối với các loại khác, một lần nữa, quay lại lockAttributeshoặc mở rộng loại "nhãn".


điều này chỉ hoạt động nếu thuộc tính là loại văn bản, đối với boolean bạn cần lockattribution ()
Fra

1
Điểm tốt, @Fra, cảm ơn! Tôi sẽ thêm nó vào câu trả lời
Fabian Schmengler

Dường như không hoạt động trong 1.9.4.1 ngay cả đối với các thuộc tính văn bản
OZZIE

3

Để sửa lỗi này, bạn có thể sử dụng một trình kết xuất đầu vào cho việc này. Nhược điểm là, bạn sẽ phải làm điều này cho từng loại đầu vào và thiết lập điều này thông qua thiết lập cho từng thuộc tính.

Để làm như vậy, hãy sử dụng khóa input_Vnderer khi sử dụng addAttribution một thuộc tính hoặc frontend_input_Vnderer khi sử dụng updateAttribution . Thí dụ:

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

Sau đó, với lớp của bạn Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledTextmở rộng lớp đầu vào mà bạn thực sự sẽ sử dụng. Đối với một trường văn bản, nó sẽ được Varien_Data_Form_Element_Text. Đối với lựa chọn nó sẽ được Varien_Data_Form_Element_Selectvà như vậy.

Bây giờ hãy thêm mã của bạn như thế này để vô hiệu hóa thuộc tính, ghi đè getHtmlphương thức, đặt thuộc tính và trả về mã HTML thực tế cho trường đầu vào:

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

Phương thức có thể được tìm thấy trong lib / Varien / Data / Form / Abstract.php sẽ được kế thừa bởi tất cả các trường phần tử đầu vào của biểu mẫu, vì vậy nó sẽ có sẵn.

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

Có lẽ hợp lý khi bao gồm lớp bị vô hiệu hóa trong thiết lập thuộc tính như được hiển thị ở trên để trực quan hóa khả năng nhập bị từ chối. Bạn có thể cũng có thể sử dụng $this->addClass('disabled')trong phương pháp, tôi chưa thử điều này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.