2014-09-12 3 views
4

У меня есть статья модели Extbase и продукт отношения 1: n. В статье TCA у меня есть встроенное поле. В моем шаблоне статьи я хочу отобразить все связанные продукты. Они поддерживаются uid. Как я могу изменить порядок расположения дочерних объектов в сортировке полей, чтобы их сортировать вручную. (В бэкэнде образует сортировка возможно только diplaying сортировка по сортировке полей не представляется возможным)TYPO3 Extbase: как сортировать дочерние объекты

спасибо, Lukas

ответ

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

+0

А я полностью извиняю эту часть, извините. Googling «extbase sort child objects» показал немало результатов. Кроме того, похоже, есть суперкомпьютер fedext http://fluidtypo3.org/viewhelpers/fed/Data/SortViewHelper.html, который может сделать это в представлении – Urs

+0

Вот правильный URL http://fluidtypo3.org/viewhelpers/vhs/ 1.8.3/Итератор/SortViewHelper.html – Urs

-1

Мне не нравится идея делать базовую сортировку внутри представления (mvc).

Недостаток большинства абстракций базы данных Слои ist, что вы часто нередко ограничиваетесь mxc mixup или имеют (иногда немного) более низкую производительность.

Я нахожусь в том же месте прямо сейчас. Я думаю о возвращении родителей (с привязанными детьми). Затем перейдите к каждому родительскому объекту и получите дочерние элементы для этого родителя отсортированным способом.

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

1

Используя точечную нотацию можно сортировать по свойствам подобъектов:

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

редактировать: застало меня врасплох, я думаю, что я прочитал ваш вопрос неправильно. Да, это сортировка по дочернему объекту, но, конечно, это относится к родительскому объекту. Если вы хотите сортировать дочерние объекты самостоятельно, вы должны установить эту сортировку в репозитории дочернего объекта, как объяснил @Urs.

Смежные вопросы