只读产品后端属性


13

我想创建一个只读属性,但看起来这是不可能的。

我试图传递给addAttribute()'disabled' =>true'readonly' => true 没有任何成功。我发现了一些有关使用的建议,setLockedAttributes()但由于某种原因,它不起作用

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


2
:此问题已回答了有关计算器stackoverflow.com/questions/6384120/...
费边布莱赫施密特

此解决方案不起作用。(setLockedAttributes)
法兰克福机场

2
它不是setLockedAttribute,它是lockAttribute:-)
user487772 2013年

1
蒂姆!你笑了!:-D
benmarks

谢谢大家...我将检查更新线程
Fra

Answers:


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
如果锁定仅在编辑ofc时需要完成,则我将选择catalog_product_edit_action事件(stackoverflow.com/a/7874345/394589)。
nevvermind 2014年

8

如果足以使其在产品管理中不可编辑,请使用前端输入类型label,它用纯文本替换表单输入:

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

请注意,这不会阻止通过API或操作的POST请求保存属性。为了使其安全,请额外使用lockAttribute() 上述建议

同样,它仅对于文本类型属性看起来不错,对于其他类型,同样,回退lockAttributes或扩展为“标签”类型。


这只有当属性是文本类型,布尔你需要lockattribute()
弗拉

1
好点,@ Fra,谢谢!我将其添加到答案中
Fabian Schmengler,2017年

即使对于文本属性,在1.9.4.1中似乎也不起作用
OZZIE

3

要解决此问题,您可以选择为此使用输入渲染器。不利的一面是,您必须为每种输入类型执行此操作,然后通过设置每个属性来进行设置。

为此,在使用addAttribute属性时使用input_renderer键,在使用updateAttribute时使用frontend_input_renderer。例:

$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')在该方法中使用,我还没有尝试过。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.