Атрибут Backend продукту лише для читання


13

Я хотів би створити атрибут лише для читання, проте виглядати це неможливо.

Я намагався перейти на addAttribute () 'disabled' =>trueабо 'readonly' => true з будь-яким успіхом. Я знайшов кілька пропозицій щодо використання, setLockedAttributes()але чомусь це не працює

Довідка:
Varien_Data_Form_Element_Abstract::serialize($attributes = array(), $valueSeparator='=', $fieldSeparator=' ', $quote='"')


2
Питання було дано відповіді на StackOverflow: stackoverflow.com/questions/6384120 / ...
Фабіан Blechschmidt

Це рішення не працює. (SetLockedAttributes)
Від

2
це не так setLockedAttribute, це lockAttribute:-)
user487772

1
Тім! Ти посміхнувся! :-D
орієнтири

спасибі , хлопці ... Я буду перевіряти його оновлення нитки
Від

Відповіді:


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, дякую! Я додам його до відповіді
Фабіан Шменглер

Здається, не працює в 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')в методі, я цього ще не пробував.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.