Magento:以编程方式更改小部件的配置

Sub*_*urf 5 config widget magento

我想在窗口小部件的代码中更改并保存窗口小部件的配置.我正在寻找这样的东西:

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();
        }
        // ...
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

由于小部件不是模型,因此它们没有save()方法.那么如何保存我的小部件的已更改数据?

Ala*_*orm 10

这将是棘手的,并且可能更多涉及单个Stack Overflow问题.这里有一些背景可以帮助您入门.您在上面处理的类/对象是一个块类.块用于呈现HTML.正如你所指出的那样,他们是无国籍的.

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

Mage::getModel('widget/widget_instance');
Mage_Widget_Model_Widget_Instance
Run Code Online (Sandbox Code Playgroud)

这些对象的状态(您尝试更改的数据)位于表中 widget_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>
Run Code Online (Sandbox Code Playgroud)

没有对widget实例id的引用,这意味着您无法加载实例对象.

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

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

祝好运!