TYPO3 中的高效 Flexform 数据库查询

问题描述

是否有一种简单和/或有效的方法来使数据库请求考虑 flexform 列中的字段,例如用于排序、where 子句等

可能是通过 TypoScript DatabaseQueryProcessor 或 PHP exec_INSERT/UPDATE/DELETE/SELECTquery。

我目前没有一个好的有效选项如何去做,我很乐意提供解决方案。

更新: 感谢您的所有回答,我正在考虑将一些设置从普通数据库列切换到 Flexform,以允许后端用户动态创建表单结构,但我显然不会对需要搜索的字段执行此操作,因为这需要像你们所有人提到的那样被解析两次。无论如何,新的 FlexForm 处理器非常酷,它使读取这些字段以进行正常数据输出变得非常容易(并且它结束了我有时为每个扩展而苦苦挣扎的不同 flexform 处理)。感谢您的帮助。

解决方法

没有。 Flexform 以 XML 格式存储在文本字段中。因此,为了查询 XML 的实体,必须为 所有 行解析此文本字段。

你的用例是什么?也许还有另一种方式...

,

并非如此,flexforms 存储为 XML 的字符串表示形式,并且很难或不可能按某个值对它们进行排序或搜索。您实际上可以做的最好的事情就是获取。即使使用一些 XML 标签,您也可以尝试按全文搜索,但是您唯一能做的排序就是获取整组行并在 PHP 中对其进行排序(非常无效)

如果出于某种原因,按 FF 中的值排序对您来说真的很重要,那么唯一的选择是自定义扩展,列存储原子值。您可以在表单的自定义字段中设置此顺序,即在保存或更新行期间通过钩子设置。

,

在这种情况下,您可能想看看 MySQL 的 ExtractValue 方法。

https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html

如果您知道 XML 标记的确切 XPATH,这将返回该 XML 标记的文本值。

SELECT ExtractValue(pi_flexform,'/xpath/to/your/desired/tag') AS flexform_fieldname;

它的性能不是很好,因为仍然需要解析字符串,但在这种情况下,它将在 MySQL 服务器端使用一个函数来完成,该函数可能仍然比基于 PHP 的解析具有一些优势。

在将内容元素从 FlexForm 字段迁移到真正规范化的数据库字段时,我们使用这种方法取得了一些不错的结果。

,

在全新的 TYPO3 11.1 中,在 TYPO3 核心中实现了一个原生的 FlexForm 数据处理器:

10 = TYPO3\CMS\Frontend\DataProcessing\FlexFormProcessor
10 {
    fieldName = my_flexform_field
    as = myOutputVariable
}

查看功能说明了解更多详情:#89509 - Data Processor to resolve FlexForm data

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...