2017-01-31 3 views
0

У меня есть расширение extbase (TYPO3 7) с простой моделью контактного лица. У человека есть имя и фотография.шаблон для просмотра списка с системными категориями

Пока это ясно.

Но каждый человек имеет категорию (например, когда он работает офис, маркетинг и т.д.).

Therefor я использовать систему категорий, как описано здесь: https://wiki.typo3.org/TYPO3_6.0#Adding_categories_to_own_models_without_using_Extension_Builder

При создании человека через веб> список, я могу присвоить категорию.

Теперь вопрос для шаблонов: Если я отлаживаю своего контактного лица, я получаю вывод, как показано ниже.

enter image description here

Я хочу иметь список, где каждая категория (заголовок) отображается с его контактными лицами.

Как это сделать? Является ли логика для этого только в шаблоне или также в контроллере?

У кого-нибудь есть пример?

С наилучшими пожеланиями Маркус

ответ

1

Я предполагаю, что требуемая логика вам нужно, это возможно с жидкостью с помощью GroupedFor ViewHelper и многих других. Поскольку у человека может быть несколько категорий, это станет огромной вложением в Viewhelpers, поэтому я не могу рекомендовать использовать Fluid для этого, даже если это возможно. Такие логики относятся к контроллерам, моделям и репозиториям.

Существует несколько способов решения этой логики. Вот пример того, как реализовать это в контроллере ...

Контроллер:

/** 
* @var \TYPO3\CMS\Extbase\Domain\Repository\CategoryRepository 
* @inject 
*/ 
protected $categoryRespoitory = NULL; 

/** 
* action list 
* @return void 
*/ 
public function listAction() 
{ 
    $allCategories = $this->categoryRespoitory->findAll(); 
    $categoriesWithContacts = []; 
    /** @var \TYPO3\CMS\Extbase\Domain\Model\Category $category */ 
    foreach($allCategories as $category) { 
     $contactsInCategory= $this->contactRepository->findByCategory($category); 
     if($contactsInCategory->count()>0) { 
      $categoriesWithContacts[] = [ 
       'category' => $category, 
       'contacts' => $contactsInCategory 
      ]; 
     } 
    } 
    $this->view->assignMultiple([ 
     'categoriesWithContacts' => $categoriesWithContacts 
    ]); 
} 

Впрыскивание CategoryRespository будет необходимый очистки кэша в инструмент установки или переустановки расширения.

Может быть вам нужна эта функция в вашем ContactRepository:

/** 
* @param \TYPO3\CMS\Extbase\Domain\Model\Category $category 
* @return array|\TYPO3\CMS\Extbase\Persistence\QueryResultInterface 
*/ 
public function findByCategory(\TYPO3\CMS\Extbase\Domain\Model\Category $category) { 
    $query = $this->createQuery(); 
    return $query->matching($query->contains('categories', $category))->execute(); 
} 

Затем в жидкость вы можете сделать что-то вроде этого:

<f:for each="{categoriesWithContacts}" as="categoryWithContact"> 
    {categoryWithContact.category.title} 
    <f:for each="{categoryWithContact.contacts}" as="contact"> 
     {contact.name} 
    </f:for> 
</f:for> 
Смежные вопросы