首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SilverStripe 3:显示过滤后的兄弟孙女页面的解决方案?

SilverStripe 3:显示过滤后的兄弟孙女页面的解决方案?
EN

Stack Overflow用户
提问于 2015-11-26 19:23:28
回答 1查看 928关注 0票数 0

更新:

我意识到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页:

代码语言:javascript
复制
function ProductTypes()
{
$producttypes = ProductTypePage::get();
return $producttypes ? $producttypes : false;
}  

然后将它们循环到我的模板中,并尝试访问经过筛选的孙辈列表:

代码语言:javascript
复制
<% loop $ProductTypes %>
<li class="filter $URLSegment">
    <a id="$URLSegment" href="#">$Title ($GrandChildren.Count)</a>
</li>

此操作并显示计数,但筛选器不工作。这是来自StockistAreaHolder.php的StockistAreaHolder.php函数,其筛选器可以计数,但不排除满足筛选器要求的页面。

代码语言:javascript
复制
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:

代码语言:javascript
复制
$Grandchildren.Count

这是我的if函数中的grandChildren函数。StockistAreaHolderPage.php:

代码语言:javascript
复制
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,到目前为止的答案是:

代码语言:javascript
复制
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;
}

但是我认为这个方法不起作用,因为它不是一个数据对象,而是一个页面。还有一个不同的问题。这只会计算所有的页面。

也许这是一种错误/复杂的方式。任何想法都值得赞赏。

EN

回答 1

Stack Overflow用户

发布于 2015-11-27 22:55:46

好的,在您的例子中,调用<% $ProductTypes %>将Controller传递给active ProductTypePage对象,因此在每次迭代时,您只需要使用$Title来返回标题,例如。

因此,在ProductTypePage.php文件中,在ProductTypePage_Controller类中创建一个名为getGrandChildren的方法。里面有这个..。

代码语言:javascript
复制
public function getGrandChildren() {

    return Page::get()->filter(array(
        "ParentID" => $this->ID,
        "DealerOnly" => 0
    ));

}

这是在使用来自DataObject中当前行的数据在每个循环上调用DataObject()。所以$this->ID将等于父项的ID。然后,按照当前的做法,在模板中调用$GrandChildren.Count。

这是实现你想要的目标的最好方法,并且应该解决你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33945753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档