Drupal 7自定义表单按钮重定向异常技术求助
解决Drupal表单"保存并重载当前页面"按钮的重定向问题
我看你在给registration_form添加自定义提交按钮时遇到了重定向失效的问题,这是因为代码里有几处不符合Drupal表单API的写法,我来帮你修正并解释原因:
原代码的问题点
- 提交函数绑定错误:你用了
$form['actions']['#save_reload'][] = 'custom_form_submit';,这不是Drupal绑定表单提交函数的正确方式,应该给按钮元素本身添加#submit属性 - 未保留原表单保存逻辑:你的自定义提交函数只处理了重定向,但原表单的条目保存逻辑没有被触发,可能导致条目没保存就跳转了
- 路径获取不准确:
current_path()在表单提交场景下可能返回的是表单处理的后台路径(比如system/ajax),而非用户实际访问的页面路径
修正后的完整代码
1. 表单修改函数(form alter)
function custom_form_alter(&$form, $form_state, $form_id) { if ($form_id == 'registration_form') { // 添加"保存并重载"按钮 $form['actions']['save_reload'] = array( '#type' => 'submit', '#value' => t('Save and Reload'), '#weight' => 0, // 合并原表单的提交函数和自定义函数,确保先执行保存逻辑 '#submit' => array_merge($form['actions']['submit']['#submit'], array('custom_form_submit_reload')), ); } }
2. 自定义提交处理函数
function custom_form_submit_reload($form, &$form_state) { // 使用request_uri()获取用户当前访问的完整路径,避免路径错误 $current_page = request_uri(); $form_state['redirect'] = $current_page; drupal_set_message(t('条目已成功保存,页面正在重载')); }
关键说明
- 合并提交函数:用
array_merge把原表单的提交函数(比如registration_form_submit)和自定义函数合并,这样会先执行原表单的保存逻辑,再执行你的重定向逻辑,确保条目被正确保存 - 传引用修改form_state:提交函数的第二个参数
$form_state必须传引用(&$form_state),这样你对$form_state['redirect']的修改才能生效 - 准确获取当前路径:
request_uri()能获取用户浏览器地址栏的完整路径,比current_path()更适合这种重定向到当前页面的场景
这样修改后,点击"Save and Reload"按钮时,会先保存表单条目,然后重定向回当前页面,同时显示成功提示。
内容的提问来源于stack exchange,提问作者davidvera
相关产品推荐
相关产品推荐

