列表视图的模板与系统类别

时间:2017-01-31 16:03:02

标签: typo3 typo3-7.6.x

我有一个extbase扩展名(TYPO3 7),其中包含一个简单的联系人模型。 这个人有一个名字和一张照片。

到目前为止,这很清楚。

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

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

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

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

enter image description here

我希望有一个列表,其中显示每个类别(标题)与其联系人。

怎么做? 这个逻辑只在模板中还是在控制器中?

有人为此做过一个例子吗?

祝你好运 马库斯

1 个答案:

答案 0 :(得分:1)

我想使用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>