TYPO3 计算有约束的对象并在流体模板中显示结果

TYPO3 count objects with constraint and display result in fluid template

我已经使用处理 objects 的扩展构建器构建了一个扩展,object 可以是 "item" 或 "project"。

一个对象有一个字段 status,它有 4 个选项,并填充了一个整数(3 = 已售出)。

一个对象可以被签名为 "project",在这种情况下,它有一个布尔值 1 用于 isproject 和一个字段 items,相关对象作为项目。

这一切都很好,我可以使用我的流畅模板遍历项目并使用 <f:count>{object.items}</f:count> 显示项目的项目数量。

以同样的方式,我应该仅显示已售商品的数量 ...
<f:count where="object.items.status == 3">{object.items}</f:count>这个显然不行,只是为了渲染思路)

with <f:debug>{object}</f:debug> 我看到为所有项目定义的字段 status ...
因为我不知道如何处理这个问题,所以我可能遗漏了一些重要信息

您可以在控制器中对它们进行计数或使用 GroupedFor ViewHelper https://fluidtypo3.org/viewhelpers/fluid/master/GroupedForViewHelper.html

如上一个答案所示,您可以为此目的使用 GroupedFor ViewHelper。但是在流体模板中使用它会涉及很多逻辑,这就是为什么应该在控制器、模型或存储库中完成的原因。

示例:将 Getter 添加到 Object-Model

/**
 * @return int
 */
public function getSoldItems() {
    $soldCount = 0;
    foreach($this->getItems() as $item) {
        // 0 = sold
        if($item->getStatus()===0) {
            $soldCount++;
        }
    }
    return $soldCount;
}

在流体中你可以用 {object.soldItems}

调用 Getter

一个更好的性能解决方案,尤其是对于延迟加载子对象,将计算在存储库中。为此,您必须在存储库中创建一个函数并在 Getter-Function 中调用它。要使用通用存储库方法创建查询,您需要 "Backrelation" 对象的项目。否则,您必须自己编写带有 "statement()" 的查询。