繁体   English   中英

TYPO3 中的高效 Flexform 数据库查询

[英]Efficient Flexform Database Queries in TYPO3

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

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

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

更新:感谢您的所有回答,我正在考虑将一些设置从普通数据库列切换到 Flexform,以允许后端用户动态创建表单结构,但我显然不会对需要搜索的字段执行此操作需要像你们提到的那样被解析两次。 无论如何,新的 FlexForm 处理器非常酷,它使读取这些字段以获取普通数据 output 超级容易(它结束了我有时苦苦挣扎的每个扩展的不同 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 服务器端使用 function 完成,这可能仍然比基于 Z2FEC392304A5C23AC138DA228 的解析为您提供一些优势。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM