我想从小部件的代码中更改并保存小部件的配置。我正在寻找这样的东西:
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()方法。那么如何保存我的小部件的更改数据呢?
答案 0 :(得分:10)
这将是棘手的,并且可能更多涉及单个Stack Overflow问题。这里有一些背景可以帮助您入门。您在上面处理的类/对象是一个块类。块用于呈现HTML。正如你所指出的,它们是无国籍的。
该块从小部件实例模型对象获取其数据。
Mage::getModel('widget/widget_instance');
Mage_Widget_Model_Widget_Instance
这些对象的状态(您尝试更改的数据)位于表widget_instance
问题是,块对象对窗口小部件实例对象一无所知。窗口小部件被插入到页面布局中,并且存储在数据库中的特殊布局句柄(这是一种过度简化,因为您可以在布局系统上编写a book)。您的实例窗口小部件显示在页面上的原因是因为页面布局已使用类似
的信息进行更新<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>
没有对widget实例id的引用,这意味着你无法加载实例对象。
理论上,您可以尝试根据参数值加载窗口小部件实例,因为 存储在数据库中。但是,它们存储在widget_paramater
列中,带有序列化字符串。这意味着您无法使用SQL或模型文件管理器来查询它。您必须加载特定实例类型/主题/存储的所有窗口小部件实例,然后手动foreach
直到找到正确的对象。这对于少量小部件可能是高性能的,但对于大量小部件很快就会变得不具有性能。此外,这也不能保证工作,因为可能(尽管不太可能)您的窗口小部件参数的值可能已被其他布局更新代码更改。
更好(并且更耗时)的方法是重写窗口小部件插入代码,使其在布局更新XML中包含页面ID。这会将实例id传递给窗口小部件块代码,允许您实例化窗口小部件实例对象并保存它。您还可以向一个小部件添加一个字段,该小部件的自定义类将始终保存实例ID。
祝你好运!