Drupal表单文件上传必填校验异常问题求助
Drupal文件上传表单必填验证失败问题解决
问题现象
表单上传文件并提交后,系统提示文件字段为必填项,但明明已经选择了文件。移除文件字段的#required => TRUE后,表单能正常提交。
问题原因
你的表单中params元素设置了#tree = TRUE(树状结构),但文件上传字段手动指定了#name = 'files[attachment]',这和树状结构下的字段命名规则不匹配。Drupal的表单验证逻辑会根据字段的层级结构查找提交的值,手动设置的#name破坏了这个结构,导致验证阶段找不到上传的文件数据,进而触发必填错误。
解决方案
1. 修正文件字段的#name设置
移除attachments字段中的手动#name属性,让Drupal自动生成符合树状结构的name:
'attachments' => [ '#type' => 'file', '#title' => $this->t('Choose a file to send for translation.'), '#required' => TRUE, ],
2. 调整验证方法中的文件获取逻辑
在validateForm方法中,使用正确的字段键来获取上传文件,对应树状结构的params[attachments]:
$file = file_save_upload('params[attachments]', ['file_validate_extensions' => ['doc docx pdf']], 'temporary://', 0); if ($file) { $form_state->setValue(['params', 'attachments'], [['filepath' => $file->getFileUri()]]); } // 手动触发错误提示,确保必填验证逻辑生效 else { $form_state->setErrorByName('params][attachments', $this->t('Please upload a valid file.')); }
3. 额外检查(可选)
确认表单的enctype属性为multipart/form-data,Drupal的file类型字段会自动添加该属性,但如果有自定义渲染逻辑,需要确保该属性存在。
修改后,表单的树状结构和文件上传的命名规则一致,验证阶段就能正确识别已上传的文件,同时保留必填验证的功能。
内容的提问来源于stack exchange,提问作者sp2012
相关产品推荐
相关产品推荐

