TYPO3 Extbase sort иностранная модель (1: n) - PullRequest
0 голосов
/ 07 октября 2019

Я получил модель Seminar и Event. Семинары имеют отношение 1:n к событиям. Теперь, когда я выбираю все Семинары с $this->seminarRepository->findAll(), я хочу, чтобы Семинары были отсортированы по start_date.

. Я попытался изменить TCA foreign_sortby и foreign_default_sortby, я также попытался добавить сортировку непосредственно в заданныйхранилище $query->setOrderings(['events.start_date' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING]);. Ничего из этого не сработало.

Модель семинара

<?php
    namespace Vendor\Myext\Domain\Model;

    use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;

    class Seminar extends AbstractEntity
    {
        /**
         * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Myext\Domain\Model\Event>
         */
        protected $events;

Семинар TCA

'events'           => [
    'exclude' => 1,
    'label'   => 'Veranstaltungen',
    'config'  => [
            'type'                => 'inline',
            'foreign_table'       => 'tx_myext_domain_model_event',
            'foreign_field'       => 'seminar',
            'foreign_default_sortby'      => 'ORDER BY tx_myext_domain_model_event.start_date ASC',
    ],
],

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Что ж, похоже, что foreign_default_sortby еще не был реализован для extbase: https://review.typo3.org/c/Packages/TYPO3.CMS/+/61487

Поскольку мое первое решение не работает должным образом (подробности см. В комментариях), я теперь сортирую массив событий с помощьюPHP usort:

usort($events, function ($a, $b) {
    if ($a->getStartDate() == $b->getStartDate()) {
        return 0;
    }
    return ($a->getStartDate() > $b->getStartDate()) ? +1 : -1;
});

Старый не рабочий ответ

Мой временный решение заключается в использовании foreign_sortby, но только для внешнего интерфейса, поскольку foreign_default_sortby отлично работает в бэкэнде.

Семинар TCA

$seminarTca = [

    // More TCA stuff; missing some array keys in this code

    'events'           => [
            'exclude' => 1,
            'label'   => 'Veranstaltungen',
            'config'  => [
                    'type'                   => 'inline',
                    'foreign_table'          => 'tx_myext_domain_model_event',
                    'foreign_field'          => 'seminar',
                    'foreign_default_sortby' => 'start_date',
                    'maxitems'               => 999,
                    'appearance'             => [
                            'collapseAll'           => true,
                            'expandSingle'          => true,
                            'newRecordLinkAddTitle' => true,
                            'levelLinksPosition'    => 'both',
                            'useSortable '          => false,
                    ],
            ],
    ],
];

if (TYPO3_MODE === 'FE') {
    $seminarTca['columns']['events']['config']['foreign_sortby'] = 'start_date';
}

return $seminarTca;

0 голосов
/ 07 октября 2019

Из вашего описания это звучит так, как будто это невозможно, даже в чистом SQL, поскольку вы не можете отсортировать одну строку по значениям полей нескольких связанных строк.

Возможно, вы хотите отразить ближайшую дату началасвязанных событий с вашей моделью семинара, то вы можете просто использовать это для сортировки в SeminarRepository:

protected $defaultOrderings = [
    'nextEventStartDate' => QueryInterface::ORDER_DESCENDING,
];
...