欢迎各位兄弟 发布技术文章
这里的技术是共享的
drupal 7 里面 的 $form['#method'] = 'get' 表单 ,如何进行验证
在Drupal 7中,对使用GET方法的表单进行验证需要特别处理,因为Drupal的表单API默认更适合POST方法。以下是解决方案和实现步骤:
自定义验证函数:无论是查询还是更改操作,都需要绑定相同的验证函数
处理GET参数:在验证前确保能正确获取URL中的参数
按钮级验证:为不同按钮分配不同的验证逻辑
php// 修改后的表单构建 $form['#method'] = 'get'; $form['#action'] = current_path(); // 确保提交到当前页面 // 为两个按钮分配不同的验证 $form['submit'] = array( '#type' => 'submit', '#value' => t('查询'), '#validate' => array('js_ise_query_validate') // 查询验证 ); $form['submit1'] = array( '#type' => 'submit', '#value' => t('更改'), '#validate' => array('js_ise_modify_validate') // 修改验证 ); // 自定义验证函数示例 function js_ise_query_validate($form, &$form_state) { // 从GET参数获取值(而不是$form_state['values']) $params = drupal_get_query_parameters(); if (empty($params['mac'])) { form_set_error('mac', t('MAC地址不能为空')); } // 验证MAC格式 if (!empty($params['mac']) && !valid_mac_address($params['mac'])) { form_set_error('mac', t('请输入有效的MAC地址')); } } function js_ise_modify_validate($form, &$form_state) { $params = drupal_get_query_parameters(); // 更严格的修改验证 if ($params['group'] == -1) { form_set_error('group', t('必须选择分组')); } }
参数获取方式:
使用 drupal_get_query_parameters() 替代 $form_state['values']
或通过 $_GET 全局变量直接访问
路由处理:
php$form['#action'] = url(current_path(), array('query' => drupal_get_query_parameters()));
验证触发:
phpif ($form_id == 'your_form_id' && $_SERVER['REQUEST_METHOD'] == 'GET') { $form['#validate'][] = 'your_custom_get_validator'; }
Drupal仍会触发标准的 _validate 钩子
建议在 hook_form_alter() 中增加预处理:
安全考虑:
对GET参数进行严格过滤
敏感操作建议仍使用POST方法
对于需要修改数据的操作(如"更改"按钮),强烈建议:
改用POST方法
或者通过JavaScript将GET表单转换为POST提交
添加CSRF token保护($form['#token'] = TRUE)
如需保持纯GET表单,务必在提交处理中进行二次验证和数据消毒。