我有一个Extbase模型文章和一个1对多的关系产品。在文章TCA中,我配置了一个内联字段。在我的文章模板中,我想显示所有相关产品。这些产品是按uid排序的。如何更改子对象的排序顺序以使它们能够手动排序到排序字段上。( 在后端表单中,排序是可能的,只是不能按字段排序显示它们)
谢谢, Lukas
谢谢, Lukas
在对象存储中,对子元素进行排序的最简单方法是操作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',,您可以轻松指定子项应按哪个字段排序。
使用点号表示法,您可以按子对象的属性进行排序:
$query->setOrderings(array(
'sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
'subobject.sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
));
编辑:抱歉,我误解了你的问题。是的,这是按子对象排序,但当然是应用于父对象。如果您想对子对象本身进行排序,则必须在子对象的存储库中设置该排序,如@Urs所解释的那样。
这是我在代码库类中的处理方法:
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));
能够以有序的方式返回它们。
警告:根据检索对象的大小和数量,这种方式可能会引起严重的性能问题。
''foreign_sortby' => 'myField'
时,虽然我仍然可以直接编辑子对象时看到它,但是当我编辑父对象时,就不再能看到'myField'了。有什么想法吗? - nHaskins