如何根据ID或ClassName调用模板中的窗口小部件

时间:2015-07-07 13:50:42

标签: php silverstripe

我正在使用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] [错误] [client 10.0.2.2] 4

     

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

     

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

     

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

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

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

我只需要显示整个小部件本身..有没有办法做到这一点?

谢谢,如果您需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:2)

相当于$ 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();

答案 1 :(得分:0)

我设法让这个工作。

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

如您所见,我检索了父博客持有人页面。如果我检查了为该页面设置了小部件区域ID。然后我将该小部件区域ID保存在名为WidgetArea的变量中。

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

  

请注意,我将每个小部件的渲染版本存储为I   无法循环渲染。然后我返回了parentWidgets ArrayList   到模板。

在模板中,我然后循环返回的内容,以便我可以阅读所有小部件。

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

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