Php 如何基于ID或类名调用模板中的小部件

Php 如何基于ID或类名调用模板中的小部件,php,silverstripe,Php,Silverstripe,我正在将blog模块与SilverStripe一起使用,并尝试从blog条目页面的父(blog holder)页面调用所有小部件。我创建了一个在BlogEntry.php文件中运行的函数。这个函数获取父页面,获取与之关联的小部件,我现在可以访问小部件信息 function getParentWidgets() { $Holder = DataObject::get_by_id('Page', $this->ParentID); if (isset($Hold

我正在将blog模块与SilverStripe一起使用,并尝试从blog条目页面的父(blog holder)页面调用所有小部件。我创建了一个在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;
    }
其中的错误日志返回以下内容

[2015年7月7日星期二13:51:01][error][client 10.0.2.2]4

[2015年7月7日星期二13:51:01][error][client 10.0.2.2]5

[2015年7月7日星期二13:51:01][error][client 10.0.2.2]6

[2015年7月7日星期二13:51:01][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 %>
现在是:

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

现在是

$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;
}
如你所见,我检索了父博客持有者页面。在一个if中,我检查了小部件区域id是否为该页面设置。然后,我将小部件区域ID保存在一个名为WidgetArea的变量中

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

请注意,我将每个小部件的呈现版本存储为 无法在循环中渲染。然后我返回了parentWidgets数组列表 添加到模板

然后,在模板中,我循环返回的内容,以便能够读取所有小部件

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

美元价值
在循环中,我调用$value。你也可以打电话给我,以获得同样的结果

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;
}
<% loop $getParentWidgets %>
        $value
<% end_loop %>