#database #typo3 #typo3-extensions #flexform
Вопрос:
Существует ли простой и / или эффективный способ выполнения запросов к базе данных, учитывающих поля в столбцах гибкой формы, например, для сортировки, предложения where и т.д.
Может быть, это через TypoScript DatabaseQueryProcessor или PHP exec_INSERT/UPDATE/DELETE/SelectQuery.
В настоящее время у меня нет хорошего действительного варианта, как это сделать, я был бы очень рад решению.
ОБНОВЛЕНИЕ: Спасибо за все ваши ответы, я подумывал о том, чтобы переключить некоторые настройки с обычных столбцов базы данных на Flexform, чтобы позволить внутренним пользователям динамически создавать структуру формы, но я, очевидно, не буду делать этого для полей, которые мне нужно просмотреть, так как это нужно проанализировать дважды, как все вы, ребята, упомянули. В любом случае, новый процессор FlexForm довольно классный, он делает чтение этих полей для обычного вывода данных очень простым (и это кладет конец различной обработке flexform каждого расширения, с которой я иногда боролся). Спасибо за вашу помощь.
Комментарии:
1. Можете ли вы описать свой случай использования? Могут быть и другие (лучшие?) возможности, помимо использования гибких форм.
Ответ №1:
Нет. Гибкие формы хранятся в виде XML в текстовом поле. Таким образом, для запроса сущностей XML это текстовое поле должно быть проанализировано для всех строк.
Каков ваш вариант использования? Может быть, есть другой способ…
Ответ №2:
На самом деле нет, гибкие формы хранятся в виде строкового представления XML, и их будет трудно или невозможно упорядочить или выполнить поиск по какому-либо значению. Лучшее, что вы можете сделать на самом деле, — это забрать. Вы можете попытаться выполнить поиск по полному тексту даже с некоторыми XML-тегами, однако единственное, что вы можете сделать для сортировки, — это извлечь весь набор строк и отсортировать их в PHP (очень неэффективно).
Если по какой-то причине сортировка по значению из FF действительно важна для вас, единственным вариантом является пользовательское расширение, в столбце которого хранятся атомарные значения. Вы можете установить этот порядок в пользовательском поле формы или, т. Е., вручную во время сохранения или обновления строки.
Ответ №3:
Возможно, вы захотите взглянуть на подход MySQL к извлечению значений в этом случае.
https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html
Если вы знаете точный XPATH для своего XML-тега, это вернет текстовое значение этого XML-тега.
SELECT ExtractValue(pi_flexform, '/xpath/to/your/desired/tag') AS flexform_fieldname;
Это не очень эффективно, так как строки все равно должны быть проанализированы, но в этом случае это будет сделано на стороне сервера MySQL с функцией, которая все равно может дать вам некоторое преимущество перед синтаксическим анализом на основе PHP.
Благодаря такому подходу мы добились некоторых хороших результатов при переносе элементов контента из полей гибкой формы в действительно нормализованные поля базы данных.
Ответ №4:
В совершенно новой версии TYPO3 11.1 в ядро TYPO3 был внедрен собственный процессор обработки данных FlexForm:
10 = TYPO3CMSFrontendDataProcessingFlexFormProcessor
10 {
fieldName = my_flexform_field
as = myOutputVariable
}
Смотрите описание функции для получения дополнительной информации: #89509 — Процессор обработки данных для разрешения данных FlexForm
Комментарии:
1. Тем не менее, это не даст вам возможности сгенерировать отсортированный запрос для результирующего набора записей на основе их значений гибкой формы.