我有一個Extbase模型文章和1:n關係產品。在文章TCA中我有一個內聯字段configuered。在我的文章模板中,我想顯示所有相關產品。這些都是由uid提供的。如何將子對象的排序更改爲字段排序以便能夠手動排序它們。 (在後端形成的排序是可能的,只有diplaying他們通過字段排序排序是不可能的)TYPO3 Extbase:如何排序子對象
感謝, 盧卡斯
我有一個Extbase模型文章和1:n關係產品。在文章TCA中我有一個內聯字段configuered。在我的文章模板中,我想顯示所有相關產品。這些都是由uid提供的。如何將子對象的排序更改爲字段排序以便能夠手動排序它們。 (在後端形成的排序是可能的,只有diplaying他們通過字段排序排序是不可能的)TYPO3 Extbase:如何排序子對象
感謝, 盧卡斯
這裏是我如何做到這一點,在倉庫類:
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;
}
}
我不太喜歡在視圖(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));
能夠給他們早在一個有序的方式。
警告:根據所有檢索到的對象的大小和數量,這種方式可能會導致巨大的性能問題。
在對象存儲中排序子元素的最簡單方法是操作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'=> '排序',可以很容易地說在其字段中的兒童的應訂購。
當我添加''' foreign_sortby'=>'myField',在後端編輯父對象時,我再也看不到'myField',儘管直接編輯子對象時仍然可以看到它。有任何想法嗎? – nHaskins 2017-06-22 23:02:51
使用點符號,你可以通過子對象的屬性進行排序:
$query->setOrderings(array(
'sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
'subobject.sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
));
編輯:了我個措手不及,我覺得我讀你的問題是錯誤的。是的,這是按照兒童objet排序的,但它當然適用於父對象。如果你想排序子對象本身,你必須在子對象的存儲庫中設置排序,就像@Urs解釋的那樣。
項目模型是一個子對象嗎?當然,如果我直接從ItemRepository的findAll方法獲取項目,但是如果從父對象獲取子對象,那麼這將起作用。還是我錯了? – LuJaks 2014-09-15 08:12:56
我完全重讀那部分,對不起。谷歌搜索「extbase排序子對象」揭示了不少結果。此外,似乎有一個聯邦查看幫助http://fluidtypo3.org/viewhelpers/fed/Data/SortViewHelper.html可能會在視圖 – Urs 2014-09-15 12:30:19
這是正確的URL http://fluidtypo3.org/viewhelpers/vhs/ 1.8.3 /迭代器/ SortViewHelper。html – Urs 2014-09-15 12:35:52