TYPO3 Extbase:如何对子对象进行排序

6
我有一个Extbase模型文章和一个1对多的关系产品。在文章TCA中,我配置了一个内联字段。在我的文章模板中,我想显示所有相关产品。这些产品是按uid排序的。如何更改子对象的排序顺序以使它们能够手动排序到排序字段上。( 在后端表单中,排序是可能的,只是不能按字段排序显示它们)
谢谢, Lukas
4个回答

14

在对象存储中,对子元素进行排序的最简单方法是操作TCA。

示例:

$TCA['tx_myext_domain_model_ordering'] = array(
...
'columns' => array(
    'services' => array(
        'exclude' => 0,
        'label' => 'LLL:EXT:myext/Resources/Private/Language/locallang_db.xml:tx_myext_domain_model_ordering.services',
        'config' => array(
            'type' => 'inline',
            'foreign_table' => 'tx_myext_domain_model_service',
            'foreign_field' => 'ordering',
            'foreign_sortby' => 'sorting',
            'maxitems'      => 9999,
            'appearance' => array(
                'collapseAll' => 0,
                'levelLinksPosition' => 'top',
                'showSynchronizationLink' => 1,
                'showPossibleLocalizationRecords' => 1,
                'showAllLocalizationLink' => 1
            ),
        ),
    ),
),
...
);

通过字段'foreign_sortby' => 'sorting',,您可以轻松指定子项应按哪个字段排序。


1
当我在后端添加 ''foreign_sortby' => 'myField'时,虽然我仍然可以直接编辑子对象时看到它,但是当我编辑父对象时,就不再能看到'myField'了。有什么想法吗? - nHaskins
这应该是我个人认为的最佳答案。如果您在聚合根(Model A)中使用ObjectStorage来存储子记录(Model B),并且希望让编辑器对Model B的记录进行排序,但是您通过Model A的Repository获取这些记录,则排序将被忽略。'foreign_sortby'是解决方案,使用它可以考虑到子对象的排序。 - caevv

2

使用点号表示法,您可以按子对象的属性进行排序:

$query->setOrderings(array(
    'sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
    'subobject.sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
));

编辑:抱歉,我误解了你的问题。是的,这是按子对象排序,但当然是应用于父对象。如果您想对子对象本身进行排序,则必须在子对象的存储库中设置该排序,如@Urs所解释的那样。


0

这是我在代码库类中的处理方法:

class ItemRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {

    /**
     * http://www.typo3.net/forum/thematik/zeige/thema/114160/?show=1
     * Returns items of this repository, sorted by sorting
     *
     * @return array An array of objects, empty if no objects found
     * @api
     */

    public function findAll() {
        $orderings = array(
            'sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
        );

        $query = $this->createQuery();
        $query->setOrderings($orderings);

        $query->getQuerySettings()->setRespectSysLanguage(FALSE);
        $query->getQuerySettings()->setSysLanguageUid(0);

        $result = $query->execute();
        return $result;
    }

}

1
“Item Model”是一个子对象吗?如果我直接从“ItemRepository”的“findAll”方法中获取项目,那当然可以运行,但是如果我从父对象获取子对象,就不行了。或者我错了吗? - LuJaks
1
啊,我完全忽略了那部分,抱歉。谷歌搜索“extbase sort child objects”会显示很多结果。此外,似乎有一个fedext viewhelper http://fluidtypo3.org/viewhelpers/fed/Data/SortViewHelper.html 可以在视图中完成它。 - Urs
1
这是正确的URL:http://fluidtypo3.org/viewhelpers/vhs/1.8.3/Iterator/SortViewHelper.html - Urs
1
<v:iterator.sort subject="{article.articleProduct}" as="products" sortBy="sorting" order="ASC"> 完成了任务。对于(在我的情况下)articleProduct模型,拥有字段sorting的getter和setter方法非常重要。 - LuJaks
1
为什么这个答案被标记为“答案”?问题是“如何对子对象进行排序”,但这种方式不可能。$article->getProducts()将无法按照所需的方式进行排序。 - JKB
显示剩余2条评论

-1

我不太喜欢在视图(MVC)内部进行基本排序的想法。

大多数数据库抽象层的缺点是,你往往只能混合MVC或有(有时略微)较低的性能限制。

我现在也处于同样的地步。我正在考虑获取父项(并附加它们的子项)。然后进入每个单独的父项,并以排序方式获取这个父项的子项。

public function findAllSorted() {
    $query = $this->createQuery();
    /* sort parents */
    $query->setOrderings(array('name' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING));
    $parents = $query->execute();
    foreach($parents as $parent){
        /* get children for every parent */
        $children = $this->getChildrenSorted($parent);
        // add children to parent TBD

    }
    /* Debug output */
    \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($parents);
}

public function getChildrenSorted(\mynamespace\ $parent) {
    /* Generate an object manager and use dependency injection to retrieve children repository */
    $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('\TYPO3\CMS\Extbase\Object\ObjectManager');
    $childrenRepository= $objectManager->get('MYNAME\Extname\Domain\Repository\Repository');
    $children = $versionRepository->findSortedByName($parent);
    return $children;
}

子存储库中的函数findSortedByName正在使用。

$query->matching($query->equals('parent', $parent));

仅检索此父级的子项

$query->setOrderings(array('name' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING));

能够以有序的方式返回它们。

警告:根据检索对象的大小和数量,这种方式可能会引起严重的性能问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接