欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

drupal 7 里面 的 $form['#method'] = 'get' 表单 ,如何进行验证 AG chatgpt 有大用 有大大用

<?php
function search_cs_yaxin_dengji_form()
{
    $mac_address = !empty($_GET['mac_address'])? _removeCnEnSpace($_GET['mac_address']):'';
    $mac_address = _my_mac_address_to_zhong_duan_heng($mac_address);
    $hostname = !empty($_GET['hostname'])? _removeCnEnSpace($_GET['hostname']):'';
    $ICTDRI = !empty($_GET['ICTDRI'])? _removeCnEnSpace($_GET['ICTDRI']):'';
    $vendorname = !empty($_GET['vendorname'])? _removeCnEnSpace($_GET['vendorname']):'';
    $emp_id = !empty($_GET['emp_id'])? _removeCnEnSpace($_GET['emp_id']):'';
    $emp = !empty($_GET['emp'])? _removeCnEnSpace($_GET['emp']):'';
    $entry_time_start = !empty($_GET['entry_time_start'])? _removeCnEnSpace($_GET['entry_time_start']):'';
    $entry_time_end = !empty($_GET['entry_time_end'])? _removeCnEnSpace($_GET['entry_time_end']):'';
    $form['mac_address'] = array(
        '#type' => 'textfield',
        '#title' => t('mac地址:'),
        '#size' => 20,
        '#default_value' => $mac_address,
    );
    $form['vendorname'] = array(
        '#type' => 'textfield',
        '#title' => t('厂商姓名:'),
        '#size' => 20,
        '#default_value' =>$vendorname,
    );
    $form['hostname'] = array(
        '#type' => 'textfield',
        '#title' => t('主机名:'),
        '#size' => 20,
        '#default_value' =>$hostname,
    );
    $form['emp_id'] = array(
        '#type' => 'textfield',
        '#title' => t('公司名称:'),
        '#size' => 20,
        '#default_value' =>$emp_id,
    );
    $form['emp'] = array(
        '#type' => 'textfield',
        '#title' => t('公司简称:'),
        '#size' => 20,
        '#default_value' =>$emp,
    );
    $form['ICTDRI'] = array(
        '#type' => 'textfield',
        '#title' => t('ICT人员:'),
        '#size' => 20,
        '#default_value' =>$ICTDRI,
    );
    $form['ip'] = array(
        '#type' => 'textfield',
        '#title' => t('ip地址:'),
        '#size' => 20,
        '#default_value' =>$ICTDRI,
    );
    $form['entry_time_start'] = array(
        '#type' => 'textfield',
        '#title' => t('开始时间:'),
        '#size' => 20,
        '#default_value' =>$entry_time_start,
    );
    $form['entry_time_end'] = array(
        '#type' => 'textfield',
        '#title' => t('结束时间:'),
        '#size' => 20,
        '#default_value' =>$entry_time_end,
    );
    $form['#method'] = 'GET';
    //提交按钮  //
    $form['submit'] = array('#type' => 'submit', '#value' => t('搜索'));
    return $form;
}
?>


drupal 7 里面 的 $form['#method'] = 'get' 表单 ,如何进行验证 

在Drupal 7中,对使用GET方法的表单进行验证需要特别处理,因为Drupal的表单API默认更适合POST方法。以下是解决方案和实现步骤:


关键解决方案

  1. 自定义验证函数:无论是查询还是更改操作,都需要绑定相同的验证函数

  2. 处理GET参数:在验证前确保能正确获取URL中的参数

  3. 按钮级验证:为不同按钮分配不同的验证逻辑


实现代码示例

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('必须选择分组'));  } }

关键注意事项

  1. 参数获取方式

  • 使用 drupal_get_query_parameters() 替代 $form_state['values']

  • 或通过 $_GET 全局变量直接访问

  • 路由处理

    php
    $form['#action'] = url(current_path(), array('query' => drupal_get_query_parameters()));
  • 验证触发

    php
    if ($form_id == 'your_form_id' && $_SERVER['REQUEST_METHOD'] == 'GET') {  $form['#validate'][] = 'your_custom_get_validator'; }
    • Drupal仍会触发标准的 _validate 钩子

    • 建议在 hook_form_alter() 中增加预处理:

  • 安全考虑

    • 对GET参数进行严格过滤

    • 敏感操作建议仍使用POST方法


    补充建议

    对于需要修改数据的操作(如"更改"按钮),强烈建议:

    1. 改用POST方法

    2. 或者通过JavaScript将GET表单转换为POST提交

    3. 添加CSRF token保护($form['#token'] = TRUE

    如需保持纯GET表单,务必在提交处理中进行二次验证和数据消毒。



    普通分类: