如何根据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 来获得相同的结果。
我正在将博客模块与 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 来获得相同的结果。