如何基于ID或ClassName调用模板中的小部件


How to call a widget in the template based on ID or ClassName

我正在使用SilverStripe的博客模块,我正在尝试从博客条目页面上的父(博客持有人)页面调用所有小部件。我已经创建了一个在BlogEntry.php文件中运行的函数。这个函数获取父页面,获取与之关联的小部件,现在我可以访问小部件信息了。

function getParentWidgets() {
        $Holder = DataObject::get_by_id('Page', $this->ParentID);
        if (isset($Holder->MyWidgetAreaID)) {
            $WidgetArea = $Holder->MyWidgetAreaID;
        }
        $Widgets = DataObject::get('Widget');
        $parentWidgets = new ArrayList();
        foreach ($Widgets as $Widget) {
            if ($Widget->ParentID == $WidgetArea) {
                $parentWidgets->push($Widget);
            }
        }
        foreach ($parentWidgets as $widget) {
            error_log($widget->ID);
        }
        return $parentWidgets;
    }

其中的错误日志返回以下

[Tue Jul 07 13:51:01 2015] [error] [client 10.0.2.2] 4

[Tue Jul 07 13:51:01 2015] [error] [client 10.0.2.2] 5

[Tue Jul 07 13:51:01 2015] [error] [client 10.0.2.2] 6

[Tue Jul 07 13:51:01 2015] [error] [client 10.0.2.2] 7

我可以访问这些信息,但是我如何在模板中循环并显示完整的小部件?目前,如果i循环并在循环中输入一个随机的文本字符串,如'foo',它将显示四次。

<% with $getParentWidgets %>
    foo
<% end_with %>

我只需要显示整个小部件本身…有办法做到吗?

谢谢,如果您还需要什么,请告诉我。

与$this等价的SS模板是$Me。它将显示当前作用域中的对象,前提是它能够被渲染。

另一个选择是用关联数组来形成你的ArrayList;然后可以使用该键从循环中检索值。

在这种情况下,我可能会推荐$Me。你还需要循环遍历结果,而不仅仅是用'with'改变上下文。'get'前缀是可选的,因为你的函数不需要参数。

<% loop $ParentWidgets %>
    $Me
<% end_loop %>

如果这是SS3,您应该更新您的ORM检索。

$Holder = DataObject::get_by_id('Page', $this->ParentID);

Is now:

$Holder = Page::get()->byID($this->ParentID);

$Widgets = DataObject::get('Widget');

现在是

$Widgets = Widget::get();

我设法使这个工作。

function getParentWidgets() {
        $Holder = DataObject::get_by_id('Page', $this->ParentID);
        if (isset($Holder->MyWidgetAreaID)) {
            $WidgetArea = $Holder->MyWidgetAreaID;
        }
        error_log($Holder);
        $Widgets = Widget::get();
        $parentWidgets = new ArrayList();
        foreach ($Widgets as $Widget) {
            if ($Widget->ParentID == $WidgetArea) {
                $renderedWidget = $Widget->renderWith('WidgetHolder');
                $parentWidgets->push($renderedWidget);
            }
        }
        return $parentWidgets;
}
如您所见,我检索了父Blog Holder页面。在一个if中,我检查了小部件区域id是否为该页面设置了。然后将小部件区域ID保存在一个名为WidgetArea的变量中。

我检索了DB中的每个小部件,并创建了一个准备填充的arrayList。我循环遍历所有小部件并检查它们的parentID,如果parentID与BlogHolder小部件区域匹配,我将把它们推入数组中。这意味着数组中的所有小部件都是BlogHolder页面的小部件。

请注意,我存储了每个小部件的呈现版本不能循环渲染。然后返回parentWidgets数组列表

在模板中,我循环遍历返回的内容,这样我就可以读取所有小部件。
<% loop $getParentWidgets %>
        $value
<% end_loop %>

在循环中我调用了$value。您也可以调用$Me来实现相同的结果。