预配置的 Magento 小部件

4

是否有一个用户界面或编程系统,可以利用Magento CMS页面呈现中的“预配置小部件”功能?

当向CMS页面添加小部件时,呈现该小部件的代码位于模板指令处理类中。这段代码

File: app/code/core/Mage/Widget/Model/Template/Filter.php
class Mage_Adminhtml_Cms_PageController extends Mage_Adminhtml_Controller_Action
{
    ...
}

加载小部件参数时,有以下代码段。
// validate required parameter type or id
if (!empty($params['type'])) {
    $type = $params['type'];
} elseif (!empty($params['id'])) {
    $preconfigured = Mage::getResourceSingleton('widget/widget')
        ->loadPreconfiguredWidget($params['id']);

    $type = $preconfigured['type'];
    $params = $preconfigured['parameters'];

} else {
    return '';
}

这段代码似乎解析了一个小部件指令标签的id值。
{{widget name="foobazbar" id=""}}

然后从小部件模型中加载配置

public function loadPreconfiguredWidget($widgetId)
{
    $read = $this->_getReadAdapter();
    $select = $read->select();
    $select->from($this->getMainTable())
        ->where($this->getIdFieldName() . ' = ?', $widgetId);
    var_dump((string)$select);
    $widget = $read->fetchRow($select);
    if (is_array($widget)) {
        if ($widget['parameters']) {
            $widget['parameters'] = unserialize($widget['parameters']);
        }
        return $widget;
    }
    return false;
}

当我第一次遇到这段代码时,我认为它是在加载一个Widget Instance模型。然而,实际上不是这样的。相反,它是从一个widget/widget类中加载数据,该类对应于widget表。

mysql> describe widget;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| widget_id  | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| code       | varchar(255)     | NO   | MUL | NULL    |                |
| type       | varchar(255)     | NO   |     | NULL    |                |
| parameters | text             | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

是否有UI或系统可添加数据到此表中?是否有人(无论是来自Magento Inc.还是其他公司)知道这是否是一项被支持的功能,还是一些已被放弃但因向后兼容而保留的东西的开端?


菜单中有“CMS > 小部件”,但我没有使用过它们,似乎在使用你建议的语法的 CMS 页面中它们也无法工作。我尝试了 {{widget id="$num"}}。从你提供的代码示例中并不明显你甚至需要 name 参数。 - Nick
@Nick,上面有一些代码,清楚地说明了需要一个名称参数。{{widget id="1"}}将从CMS页面中剥离,但{{widget name="foo" id="1"}}将显示,并尝试从表“widget”加载一个小部件,而不是从小部件实例加载。 - Alana Storm
1
似乎这是一个针对开发人员的功能...适用于想要执行一次以上查询以检索小部件参数而不是在CMS页面内容中指定它们的开发人员 :) - Ivan Chepurnyi
2个回答

2

这个答案有一点跑题,但我不确定它是否能满足您的需求。我发现您可以在管理CMS>Widgets部分创建小部件实例,然后通过以下代码呈现它们:

$oWidget = Mage::getModel('widget/widget_instance')->load('HomepageTwitter','title');
$oWidgetBlock = Mage::app()->getLayout()->createBlock($oWidget->getType(), $oWidget->getTitle(), $oWidget->getWidgetParameters());
echo $oWidgetBlock->toHtml();

请注意,该块通过标题加载(而不是任意ID),并且小部件参数被传递以供块呈现。

0
根据一些评论和私人电子邮件,看来这是Magento核心团队的一个私密功能,并与Instance Widgets无关。

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