Magento只读和隐藏产品属性

15
我希望在Magento产品属性中设置一些不可从管理界面编辑的属性,以及一些在该界面中根本不可见的属性(作为存储有关产品的某些持久信息的方式,这些信息不应由人类用户查看...这是我能想到的唯一方法,欢迎提出其他建议)。
因此,我的问题是:所有Magento属性都必须可见且可从管理界面编辑吗?如果不是,如何使其只读或隐藏?
我注意到在管理界面中有一些只读字段,因此必定有一种方法可以做到这一点。在搜索stackoverflow后,我发现了一种可能涉及JavaScript的解决方案,但如果可能的话,我不想走这条路。
7个回答

16

好的,看起来它终究还是可以实现的。在添加了catalog_product_load_after事件的观察器后,可以使用Mage_Catalog_Model_Abstract类的lockAttribute方法使产品属性变为只读。以下是观察器方法的代码:

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

13
自从catalog_product_load_after事件被发送到每个产品加载时,lock_attributes方法中提供的属性将在每次产品加载后锁定。这可能会产生意想不到的结果:无法在未显式解锁属性的情况下更改lock_attributes方法中属性的值。

取而代之的是,可以为catalog_product_edit_action事件添加一个观察者:仅在管理界面编辑产品时才会触发此事件。


2
我认为Aad Mathijssen和Epicurus结合起来给出了最好的答案,并进行了一些澄清。正如Aad所指出的那样,catalog_product_load_after在每次产品加载后被调用,这意味着它也会在前端被调用!如果我们只想保护管理面板中的属性字段,那么catalog_product_edit_action是更合适的选择。您的etc/config.xml将如下所示:
<catalog_product_edit_action>
  <observers>
    <lock_attributes>
      <class>yourmodule/observers</class>
      <method>lockAttributes</method>
    </lock_attributes>
  </observers>
</catalog_product_edit_action>

1

1

我猜从属性管理器中不可能实现。 一个简单、快速而不太正规的解决方案是使用CSS来隐藏输入和标签。


0

通过使用这个线程和更多的挖掘,lockAttribute方法来自一个抽象类,这意味着它也可以用于类别属性。我捕获了“catalog_category_load_after”观察器,并使用它来锁定我想要的类别属性:

public function lockCategoryAttributes($observer) {
    $event = $observer->getEvent();
    $c = $event->getCategory();
    $c->lockAttribute('attribute_code');
}

我不确定是否使用了正确的观察者,但它可以工作。

所以,是的,可以锁定类别属性或使其只读。


0

etc\adminhtml\events.xml

    <?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="catalog_product_load_after">
      <observer name="product_lock_attributes" instance="Vendor\Module\Observer\Lock"/>
    </event>
</config>

Observer\Lock.php

namespace Vendor\Module\Observer;
 
class Lock implements \Magento\Framework\Event\ObserverInterface
{
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $event = $observer->getEvent();
        $product = $event->getProduct();
        $product->lockAttribute('attribute_code');
     }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接