Атрибут 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/…
Фабиан Блехшмидт
Это решение не работает. (setLockedAttributes)
Fra
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');
}
philwinkle
источник
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 ()
Fra
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')в методе, я еще не пробовал.

Нико Зиблер
источник