2014-09-12 112 views
4

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

感谢, 卢卡斯

回答

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

} 
+0

项目模型是一个子对象吗?当然,如果我直接从ItemRepository的findAll方法获取项目,但是如果从父对象获取子对象,那么这将起作用。还是我错了? – LuJaks 2014-09-15 08:12:56

+0

我完全重读那部分,对不起。谷歌搜索“extbase排序子对象”揭示了不少结果。此外,似乎有一个联邦查看帮助http://fluidtypo3.org/viewhelpers/fed/Data/SortViewHelper.html可能会在视图 – Urs 2014-09-15 12:30:19

+0

这是正确的URL http://fluidtypo3.org/viewhelpers/vhs/ 1.8.3 /迭代器/ SortViewHelper。html – Urs 2014-09-15 12:35:52

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

能够给他们早在一个有序的方式。

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

4

在对象存储中排序子元素的最简单方法是操作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'=> '排序',可以很容易地说在其字段中的儿童的应订购。

+0

当我添加''' foreign_sortby'=>'myField',在后端编辑父对象时,我再也看不到'myField',尽管直接编辑子对象时仍然可以看到它。有任何想法吗? – nHaskins 2017-06-22 23:02:51

1

使用点符号,你可以通过子对象的属性进行排序:

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

编辑:了我个措手不及,我觉得我读你的问题是错误的。是的,这是按照儿童objet排序的,但它当然适用于父对象。如果你想排序子对象本身,你必须在子对象的存储库中设置排序,就像@Urs解释的那样。