【问题标题】:TYPO3 Extbase sorting child object by another field as "sorting" (f.e. datetime)TYPO3 Extbase 按另一个字段将子对象排序为“排序”(例如日期时间)
【发布时间】:2020-05-20 16:57:22
【问题描述】:

有一种通过'foreign_sortby' => 'sorting' 对孩子进行排序的方法,效果很好。但在我的情况下不可能使用它:

我不想通过 'sorting' 对其进行排序 - 我需要通过 'datetime' 对其进行排序,如果我将其设置为 'foreign_sortby' 会导致问题,因为当我保存父级时它会覆盖该字段。我用排序整数填充它,这完全有意义,但会破坏我的条目。

还有一个'foreign_default_sortby' 对我来说似乎是完美的,但这只是对后端进行排序,而不是对前端进行排序。 :/ 有什么想法吗?

在按日期排序后,我需要模型中的第一个和最后一个孩子 - 有时它们没有按正确的顺序创建,这就是为什么首先排序很重要。

TCA:

    'events' => [
        'exclude' => false,
        'label' => 'LLL:EXT:database/Resources/Private/Language/locallang_db.xlf:tx_database_domain_model_production.events',
        'config' => [
            'type' => 'inline',
            'foreign_table' => 'tx_database_domain_model_event',
            'foreign_field' => 'production',
            'foreign_default_sortby' => 'date ASC',
            'maxitems' => 9999,
            'default' => 0,
            'appearance' => [
                'collapseAll' => 1,
                'levelLinksPosition' => 'bottom',
                'showSynchronizationLink' => 1,
                'showPossibleLocalizationRecords' => 1,
                'showAllLocalizationLink' => 1,
                'enabledControls' => [
                    'info' => true,
                    'new' => true,
                    'dragdrop' => true,
                    'sort' => true,
                    'hide' => true,
                    'delete' => true,
                    'localize' => false,
                ],

            ]
        ]
    ],

【问题讨论】:

  • 能否请您也添加您所在领域的完整 TCA?
  • 刚刚添加了 tca ;) 希望对您有所帮助。 ;)

标签: sorting typo3 parent-child extbase


【解决方案1】:

正如您所注意到的,Extbase 不支持foreign_default_sortby。 (有一个feature request for this in the TYPO3 Forge。)不幸的是,foreign_table_where 也被忽略了,即使它实际上是添加到由DataMapFactory 构建的ColumnMap 中。

因此,您唯一的选择是在您自己的代码中执行排序,例如在您的 ObjectStorage 属性的吸气剂中。然后,您可以很容易地获取模板中的第一个和最后一个对象或一些自定义 getter,例如 getFirstEvent()getLastEvent() / getMostRecentEvent()。请注意,这需要加载所有相关对象,这可能会根据您的用例对您的内存使用造成影响。

除此之外,您还可以向 EventRepository 添加自定义方法,例如 findFirstByProduction()findLastByProduction(),因为 Production 是具有 events 关系的本地域模型。这对于处理单个 Production 实例的详细视图很有意义。

【讨论】:

  • 是的,我考虑过这一点,但正如你所说,这在单一视图中是有道理的。它更多的是关于列表视图的解决方案。但是谢谢你的信息。
【解决方案2】:

这可能是一个丑陋的解决方案,但有效的解决方案..

让我们考虑以下场景

$multiObjects = $blog->getPosts(); 

//first debug output in the screenshot
TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($multiObjects); 

//Convert that into array (inner objects will remain the same)
$multiArray = [];
foreach ($multiObjects as $multiObject) {
    $multiArray[] = $multiObject;
}

//Second debug output in the screenshot
TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($multiArray); 

//Now we can apply usort over it
usort($multiArray, function($first,$second){
    return strcmp($second->getUid(), $first->getUid());
});

//Here child objects within array will be sorted in descending order of their UIDs
TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($multiArray);

注意:如果使用存储库的 createQuery 方法获取记录,则需要这样做

最终输出

【讨论】:

  • 是的。我总是可以手动做事。但这是资源问题,因为我添加了额外的排序,尽管您之前已经获得了排序查询。就我而言,我们谈论的是数千个条目。它可以工作,但是对于大量数据来说速度要慢得多。如果核心团队能够为孩子实现有效的排序,那就太好了——脱离总是想要进行自动排序的排序模式。
  • 现在您可以使子项可排序并手动对其进行排序。您可以根据需要在后端工具中对子项进行排序,但您无法告诉系统前端的排序是什么,因此您必须再次对所有内容进行排序。如果你想要第一个或最后一个对象,但是在想要的排序中变得非常棘手。
  • 对于我的项目,我现在添加了其他字段,这些字段已经具有正确的对象作为单一关系。这使系统更快。所以我使用一个动作来通过点击更新所有重要的关系。这会将第一个和最后一个子项设置为固定字段条目,并添加一些其他字段。我只是很困惑,typo3 没有一个好的方法。我想我并不孤单拥有这种所需的功能。你有一个 getObject()->first() 和 getObject()->last() [或 end()]。但是,如果我不能告诉系统如何对孩子进行分类,那是没有意义的。 ? 至少有时。
猜你喜欢
  • 2014-11-06
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
相关资源
最近更新 更多