簡體   English   中英

TYPO3 Extbase:如何對子對象進行排序

[英]TYPO3 Extbase: How to sort child objects

我有一個Extbase模型文章和1:n關系產品。 在文章TCA中,我有一個內聯字段配置。 在我的文章模板中,我想顯示所有相關產品。 這些都是由uid提供的。 如何將子對象的順序更改為字段排序以便能夠手動對它們進行排序。 (在后端形式中可以進行排序,只能通過字段排序對它們進行雙層排序)

謝謝,盧卡斯

在對象存儲中對子元素進行排序的最簡單方法是操作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'=>'排序',您可以輕松地說明應該在哪個字段中訂購子項。

以下是我在存儲庫類中的操作方法:

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

}

使用點表示法,您可以按子對象的屬性進行排序:

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

編輯:讓我措手不及,我想我讀錯了你的問題。 是的,這可以通過子對象進行排序,但它當然適用於父對象。 如果要對子對象本身進行排序,則必須在子對象的存儲庫中設置該排序,如@Urs所述。

我不喜歡在視圖(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));

能夠以有序的方式回饋他們。

警告:根據所有檢索到的對象的大小和數量,這種方式可能會出現巨大的性能問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM