更新:
我意识到GrandChildren函数在Page.php上也被复制了,所以即使从StockistAreaHolderPage.php中删除这个函数,也意味着$GrandChildren.Count仍然可以工作,但当然不需要过滤。如果我将筛选器部分添加到Page.php函数中,它会破坏站点,我假设是因为其他页面的数据库中缺少了交易商。因此,我需要为StockistAreaHolderPage.php和/或ProductTypePage.php重命名函数,以表示GrandchildrenStock,但是在给出的答案之后,更改函数名,然后在模板中使用$GrandchildrenStock.Count不会显示任何内容。
,我现在有点迷路了!我只想从我当前的页面中循环另一个页面类型,然后计算它的孙辈。
最新问题(原文如下):
我刚刚意识到我漏掉了大部分代码。这可能会改变很多。我实际上是在写X页(StockistAreaHolder.ss)。然后,我将访问一个兄弟姐妹子女Y (ProductTypePage.ss)。然后列出/循环这些Y孩子。然后我试着数每一个Y的孙子,然后过滤。
我在页面StockistAreaHolder.php中使用这个函数访问Y页:
function ProductTypes()
{
$producttypes = ProductTypePage::get();
return $producttypes ? $producttypes : false;
} 然后将它们循环到我的模板中,并尝试访问经过筛选的孙辈列表:
<% loop $ProductTypes %>
<li class="filter $URLSegment">
<a id="$URLSegment" href="#">$Title ($GrandChildren.Count)</a>
</li>此操作并显示计数,但筛选器不工作。这是来自StockistAreaHolder.php的StockistAreaHolder.php函数,其筛选器可以计数,但不排除满足筛选器要求的页面。
public function getGrandChildren() {
$ids = Page::get()->filter(array('ParentID' => $this->ID))->getIDList();
$grandChildren = Page::get()
->filter(array('DealerOnly' => false));
return $grandChildren;
}你访问这些页面并在祖父母头衔旁边显示过滤计数的最佳方式是什么?
原始问题
我有一页(A)和孩子(B),每个孩子都有孩子(C)。在A页上,我想显示一个B的列表,每一个旁边都有一个计数,计算属于B的C。
我可以通过一个函数来获得所有孩子的孩子,然后是$Count:
$Grandchildren.Count这是我的if函数中的grandChildren函数。StockistAreaHolderPage.php:
public function getGrandChildren() {
$ids = Page::get()->filter(array('ParentID' => $this->ID))->getIDList();
$grandChildren = Page::get()->filter(array(
'ParentID' => $ids
));
return $grandChildren;
}但我希望计数能够过滤/排除某些C页面,具体取决于页面上的选项/布尔值是否为真。
我在这里开始了这个问题:SilverStripe 3 Filtering / Filtering Out DataObjects in a Function,到目前为止的答案是:
public function getGrandChildren() {
$ids = Page::get()->filter(array('ParentID' => $this->ID))->getIDList();
$grandChildren = Page::get()
->filter(array(
'ParentID' => $ids
))
->exclude(array('DealerOnly' => true));
return $grandChildren;
}但是我认为这个方法不起作用,因为它不是一个数据对象,而是一个页面。还有一个不同的问题。这只会计算所有的页面。
也许这是一种错误/复杂的方式。任何想法都值得赞赏。
发布于 2015-11-27 22:55:46
好的,在您的例子中,调用<% $ProductTypes %>将Controller传递给active ProductTypePage对象,因此在每次迭代时,您只需要使用$Title来返回标题,例如。
因此,在ProductTypePage.php文件中,在ProductTypePage_Controller类中创建一个名为getGrandChildren的方法。里面有这个..。
public function getGrandChildren() {
return Page::get()->filter(array(
"ParentID" => $this->ID,
"DealerOnly" => 0
));
}这是在使用来自DataObject中当前行的数据在每个循环上调用DataObject()。所以$this->ID将等于父项的ID。然后,按照当前的做法,在模板中调用$GrandChildren.Count。
这是实现你想要的目标的最好方法,并且应该解决你的问题。
https://stackoverflow.com/questions/33945753
复制相似问题