You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:44:53