具有系统类别的列表视图模板

template for list view with system categories

我有一个带有简单联系人模型的 extbase 扩展 (TYPO3 7)。 此人有姓名和照片。

到目前为止这很清楚。

但是每个人都有一个类别(例如他工作的地方。办公室、营销等)

因此我使用系统类别,如下所述: https://wiki.typo3.org/TYPO3_6.0#Adding_categories_to_own_models_without_using_Extension_Builder

通过网络>列表创建人物时,我可以指定一个类别。

现在是模板问题: 如果我调试我的联系人,我会得到如下屏幕所示的输出。

我想要一个列表,其中显示每个类别(标题)及其联系人。

如何做到这一点? 这个逻辑是只在模板里还是控制器里也有?

有人举个例子吗?

此致 马库斯

我想您需要的所需逻辑可以通过 Fluid 使用 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();
}

然后在 Fluid 中你可以这样做:

<f:for each="{categoriesWithContacts}" as="categoryWithContact">
    {categoryWithContact.category.title}
    <f:for each="{categoryWithContact.contacts}" as="contact">
        {contact.name}
    </f:for>
</f:for>