TYPO3 tx_form编辑模式SaveToDatabaseFinisher whereClause配置异常排查
TYPO3 tx_form编辑模式提交空白页问题排查
问题描述
我使用tx_form创建和编辑自定义模型条目,表单本身未配置Finisher,完全通过TypoScript添加。创建模式下,配置mode=insert的SaveToDatabaseFinisher,搭配使用{SaveToDatabase.insertedUids.0}的RedirectFinisher可正常运行。但编辑模式下,配置mode=update的SaveToDatabaseFinisher并设置whereClause关联隐藏预填充的uid字段与常量pid后,提交表单直接返回空白页,URL参数变为?tx_form_formframework[action]=perform &tx_form_formframework[controller]=FormFrontend。
原配置代码
['{$plugin.tx_extension.settings.formMode}' == 'insert'] plugin.tx_form { settings { formDefinitionOverrides { formid { finishers { # savetodatabase insert 0 { identifier = SaveToDatabase options { 0 { table = tx_extension_domain_model_item mode = insert databaseColumnMappings { pid { value = {$plugin.tx_extension.persistence.storagePid} } tstamp { value = {__currentTimestamp} } crdate { value = {__currentTimestamp} } } elements { form-field { mapOnDatabaseColumn = field } } } } } # redirect detail 1 { identifier = Redirect options { pageUid = {$plugin.tx_extension.settings.listPid} additionalParameters = tx_extension_pi1[action]=detail&tx_extension_pi1[controller]=Item&tx_extension_pi1[item]={SaveToDatabase.insertedUids.0} } } } } } } } [end] ['{$plugin.tx_extension.settings.formMode}' == 'edit'] plugin.tx_form { settings { formDefinitionOverrides { formid { finishers { # savetodatabase update 0 { identifier = SaveToDatabase options { 0 { table = tx_extension_domain_model_item mode = update whereClause { uid = '{uid}' pid = {$plugin.tx_extension.persistence.storagePid} } databaseColumnMappings { tstamp { value = {__currentTimestamp} } } elements { form-field { mapOnDatabaseColumn = field } } } } } # redirect detail 1 { identifier = Redirect options { pageUid = {$plugin.tx_extension.settings.listPid} additionalParameters = tx_extension_pi1[action]=detail&tx_extension_pi1[controller]=Item&tx_extension_pi1[item]={uid} } } } } } } } [end] [request && traverse(request.getQueryParams(), 'item') > 0] plugin.tx_form { settings { formDefinitionOverrides { formid { renderables { # page 0 { renderables { # fieldset 0 { renderables { # uid 0 { defaultValue = CONTENT defaultValue { table = tx_extension_domain_model_item select.pidInList = {$plugin.tx_extension.persistence.storagePid} select.where.dataWrap = uid = {GP:item} renderObj = TEXT renderObj.required = 1 renderObj.field = uid } } # form-field 1 { defaultValue = CONTENT defaultValue { table = tx_extension_domain_model_item select.pidInList = {$plugin.tx_extension.persistence.storagePid} select.where.dataWrap = uid = {GP:item} renderObj = TEXT renderObj.required = 1 renderObj.field = field } } } } } } } } } } } [end]
错误点分析与修正方案
1. 变量引用错误
编辑模式下的whereClause和RedirectFinisher中,直接使用{uid}无法正确获取表单字段值,需要通过formState.formValues来引用表单提交的字段数据。
2. 隐藏字段类型缺失
预填充的uid字段未设置为Hidden类型,导致表单不会提交该字段值,进而让whereClause无法匹配到数据库记录,更新操作失败。
修正后的关键配置片段
编辑模式SaveToDatabaseFinisher修正:
['{$plugin.tx_extension.settings.formMode}' == 'edit'] plugin.tx_form { settings { formDefinitionOverrides { formid { finishers { 0 { identifier = SaveToDatabase options { 0 { table = tx_extension_domain_model_item mode = update whereClause { # 修正:通过formState获取表单中的uid值 uid = {formState.formValues.uid} pid = {$plugin.tx_extension.persistence.storagePid} } databaseColumnMappings { tstamp { value = {__currentTimestamp} } } elements { form-field { mapOnDatabaseColumn = field } } } } } 1 { identifier = Redirect options { pageUid = {$plugin.tx_extension.settings.listPid} # 修正:通过formState获取表单中的uid值 additionalParameters = tx_extension_pi1[action]=detail&tx_extension_pi1[controller]=Item&tx_extension_pi1[item]={formState.formValues.uid} } } } } } } } [end]
uid字段类型修正:
[request && traverse(request.getQueryParams(), 'item') > 0] plugin.tx_form { settings { formDefinitionOverrides { formid { renderables { 0 { renderables { 0 { renderables { # uid 0 { # 新增:设置为隐藏字段 type = Hidden identifier = uid defaultValue = CONTENT defaultValue { table = tx_extension_domain_model_item select.pidInList = {$plugin.tx_extension.persistence.storagePid} select.where.dataWrap = uid = {GP:item} renderObj = TEXT renderObj.required = 1 renderObj.field = uid } } # form-field 1 { defaultValue = CONTENT defaultValue { table = tx_extension_domain_model_item select.pidInList = {$plugin.tx_extension.persistence.storagePid} select.where.dataWrap = uid = {GP:item} renderObj = TEXT renderObj.required = 1 renderObj.field = field } } } } } } } } } } } [end]
额外排查建议
开启TYPO3调试模式(修改typo3conf/LocalConfiguration.php中的BE.debug和FE.debug为true),查看系统日志或前端调试信息,可快速定位数据库更新失败的具体原因。
内容的提问来源于stack exchange,提问作者C27
相关产品推荐
相关产品推荐

