Magento:以编程方式更改小部件';s配置

Magento:以编程方式更改小部件';s配置,magento,widget,config,Magento,Widget,Config,我想在小部件的代码中更改并保存小部件的配置。我在找这样的东西: class My_Module_Block_Widget extends Mage_Catalog_Block_Product_List implements Mage_Widget_Block_Interface { // ... protected function _beforeToHtml() { // ... if(/* data needs to b

我想在小部件的代码中更改并保存小部件的配置。我在找这样的东西:

class My_Module_Block_Widget
    extends Mage_Catalog_Block_Product_List
    implements Mage_Widget_Block_Interface
{
    // ...
    protected function _beforeToHtml()
    {
        // ...
        if(/* data needs to be changed */)
        {
            // assuming "widget_config_data" to be one of the widget's
            // parameters configured in the etc/widget.xml file of my module
            $this->setData("widget_config_data", "New Data");
            $this->save();
        }
        // ...
    }
    // ...
}

因为小部件不是模型,所以它们没有save()方法。那么,如何保存我的小部件的更改数据呢?

这将是一个棘手的问题,可能比单堆栈溢出问题更复杂。以下是一些背景知识,让您开始学习。上面处理的类/对象是块类。块用于呈现HTML。正如你所指出的,他们是无国籍的

块从小部件实例模型对象获取其数据

Mage::getModel('widget/widget_instance');
Mage_Widget_Model_Widget_Instance
这些对象(您试图更改的数据)的状态位于表
widget\u instance

问题是,块对象对小部件实例对象一无所知。小部件被插入到页面布局中,并带有存储在数据库中的特殊布局句柄(这过于简化了,因为您可以在布局系统上编写)。您的实例小部件出现在页面上的原因是页面布局已经用类似这样的信息进行了更新

<reference name="content">
    <block type="cms/widget_page_link" name="48fc761f38fa9838fcc3a3b498c47f72" template="cms/widget/link/link_block.phtml">
        <action method="setData">
            <name>anchor_text</name>
            <value>asdfasdfsad</value>
        </action>
        <action method="setData">
            <name>title</name>
            <value>asdfasdfasdfasd</value>
        </action>
        <action method="setData">
            <name>page_id</name>
            <value>2</value>
        </action>
    </block>
</reference>

锚定文本
asdfasdfsad
标题
asdfasdfasdfasd
页码号
2.
没有对小部件实例id的引用,这意味着您无法加载实例对象

理论上,您可以尝试根据paramater值加载小部件实例,因为那些存储在数据库中。但是,它们存储在
widget\u paramater
列中,其中包含一个序列化字符串。这意味着您不能使用SQL或模型文件管理器来查询它。您必须加载特定实例类型/主题/存储的所有小部件实例,然后手动
foreach
直到找到正确的对象。对于少量小部件来说,这可能是有性能的,但对于大量小部件来说,这很快就会变成无性能的。此外,这也不能保证工作正常,因为您的小部件参数的值可能(尽管不太可能)已被其他布局更新代码更改

更好(也更耗时)的方法是重写小部件插入代码,以便在布局更新XML中包含页面id。这将把实例id传递给小部件块代码,允许您实例化一个小部件实例对象并保存它。您还可以向其自定义类始终保存实例id的小部件添加字段


祝你好运

这其实很有帮助!这让我重新考虑了我对这个小部件的计划,在权衡了所需的工作和它的好处之后,我决定它不值得,我将以不同的方式实现这个小部件。我认为,如果Magento开发人员在将来的版本中包含了从小部件中更改小部件配置的功能,那将是一件好事。