Php 如何基于ID或类名调用模板中的小部件
我正在将blog模块与SilverStripe一起使用,并尝试从blog条目页面的父(blog holder)页面调用所有小部件。我创建了一个在BlogEntry.php文件中运行的函数。这个函数获取父页面,获取与之关联的小部件,我现在可以访问小部件信息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
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 %>