如何根据ID或ClassName调用模板中的widget

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;
    }

错误日志里面有returns以下

[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

我可以访问此信息,但我如何在模板中遍历此信息并完整显示小部件?目前,如果我循环并在循环内输入一个随机的文本字符串,例如 '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);

现在是:

$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 的变量中。

我检索了数据库中的每个小部件并创建了一个 arrayList 以供填充。我遍历所有小部件并检查它们的 parentID,如果 parentID 与 BlogHolder 小部件区域匹配,我会将它们推送到数组中。这意味着数组中的所有小部件都是 BlogHolder 页面的小部件。

Note that I stored the rendered version of each of the widgets as I couldn't render in a loop. I then returned the parentWidgets ArrayList to the template.

然后我在模板中遍历返回的内容,以便我可以读取所有小部件。

<% loop $getParentWidgets %>
        $value
<% end_loop %>

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