0

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

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

我目前没有一个很好的有效选择如何做到这一点,我会很高兴有一个解决方案。

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

4

4 回答 4

0

在这种情况下,您可能想看看 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 字段迁移到真正规范化的数据库字段中时,我们使用这种方法获得了一些不错的结果。

于 2021-03-03T14:40:21.777 回答
0

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

你的用例是什么?或许还有别的办法...

于 2021-03-03T14:17:53.037 回答
0

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

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

于 2021-03-03T14:22:10.063 回答
0

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

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

有关更多详细信息,请参阅功能描述:#89509 - 数据处理器来解析 FlexForm 数据

于 2021-03-03T15:20:23.077 回答