gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:25:37 25 4
gpt4 key购买 nike

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

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() 方法。那么如何保存我的小部件的更改数据呢?

最佳答案

这会很棘手,而且可能比单个 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>

没有对小部件实例 ID 的引用,这意味着您无法加载实例对象。

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

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

祝你好运!

关于Magento:以编程方式更改小部件的配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10705917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com