我正在使用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来实现相同的结果。