Symfony CMF phpcr_nodes sort_order

Symfony CMF phpcr_nodes sort_order

我目前正在使用 symfony 和 symfony cmf 开发一个内容管理系统。我正在尝试为属于某个用户的一些节点实现排序功能。

到目前为止我发现节点必须放置在相同的深度才能正确排序,并且 documentManager 找到的元素从最低的开始排序 sort_order 到最高。

我目前想不通的是,我到底该如何设置 sort_order? AbstractBlock class 有两个方法 setPosition 和 getPosition,但根本没有实现 setPosition。它只是带有 TODO 和 return $this 语句的注释。

这里有没有人已经成功地使用 Symfony CMF 实现了排序功能?如果是这样,请告诉我该怎么做。

Sharpy35

您显然使用的CMF的默认存储是Doctrine PHPCR-ODM。它依次建立在 PHPCR 之上,PHPCR 是一个树结构的数据库。特定节点的子节点是自定义排序的。默认情况下,节点附加在子列表的末尾。

使用 PHPCR / PHPCR-ODM 时,您不需要直接与数据库交互,jackalope-doctrine-dbal 会为您完成。如果您想知道发生了什么,最好阅读 documentation on the PHPCR API 而不是尝试从数据库中读取信息 ;-)

您可以做 3 件事

  • 在 PHPCR-ODM 中:如果您有一个子集合映射到一个字段,您可以重新排序该集合中的元素。例如:

    $collection = $myDocument->getChildren();
    $collection->clear();
    foreach ($mySortedItems as $key => $item) {
        $collection[$key] = $item;
    }
    
  • 在 PHPCR 中:使用 Node::orderBefore 方法对子项重新排序。您可以使用 DocumentManager::getNodeForDocument 方法获取您需要的 PHPCR 节点。

  • 使用查询时:查询中有一个sort by子句。但是,在可以避免的情况下不使用查询是正确的,因为使用节点层次结构比查询更高效、更方便。