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

时间:2014-09-12 11:35:35

标签: typo3 extbase

我有一个Extbase模型文章和1:n关系产品。在文章TCA中,我有一个内联字段配置。在我的文章模板中,我想显示所有相关产品。这些都是由uid提供的。如何将子对象的顺序更改为字段排序以便能够手动对它们进行排序。 (在后端形式中,可以进行排序,只能通过字段排序对它们进行双层排序)

感谢, 卢卡斯

4 个答案:

答案 0 :(得分:6)

对对象存储中的子元素进行排序的最简单方法是操作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'=> “排序”,您可以轻松地说明应该在哪个字段上订购儿童。

答案 1 :(得分:3)

以下是我在存储库类中的工作方式:

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;
    }

}

答案 2 :(得分:1)

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

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

编辑:让我措手不及,我想我错了你的问题。是的,这可以通过子对象进行排序,但它当然适用于父对象。如果要对子对象本身进行排序,则必须在子对象的存储库中设置该排序,如@Urs所述。

答案 3 :(得分:-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));

能够以有序的方式回馈他们。

警告:根据所有检索到的对象的大小和数量,这种方式可能会出现巨大的性能问题。