Drupal中使用form的#autocomplete_path属性完成json格式的ajax文本框自动填充效果

来源:互联网 发布:java中list多个列排序 编辑:程序博客网 时间:2024/05/17 08:28

  由于drupal默认添加Jquery支持,而且对json格式支持非常好(如有专门的drupal_json方法等),实现文本框自动填充很方便,今天做了个实例

 

首先是写一个form,我打算让我的“策略名”文本框实现自动填充,写完form后应该是这样,我没有加入ajax功能时候,就是个普通的文本:

 

         $form['autoname'] = array(
            '#title' => t('策略名'),
            '#type' => 'textfield',
            '#size' => '50',
            '#required' => TRUE,
            '#default_value'=>$sname,
         );

 

效果如下:

 

auto1

 

现在为策略名这个textfield加入自动填充功能,就是在表单加个#autocomplete_path属性,如下:

         $form['autoname'] = array(
            '#title' => t('策略名'),
            '#type' => 'textfield',
            '#size' => '50',
            '#required' => TRUE,
            '#autocomplete_path' => 'credit/score/view',
            '#default_value'=>$sname,
         );

 

这时,这个form元素会知道你在使用自动填充功能,而且给其指定了一个异步访问路径,这个textfield会调用Jquery把键入文本框的值传给这个指定的异步地址,接下来的工作就是要自己写个异步取数据库的方法了,如下:

 

menu部分指定一个item可以连接到一个方法

 

   //动态存取测验autocomplete
   $items ['credit/score/view'] = array (
    'title' => t('view strategy name'),
    'page callback' => 'getautoname',
    'access callback' => 'user_access',
    'access arguments' => array('administer credit setting'),
    'type' => MENU_CALLBACK
    );

 

 

然后写出这个取数据库的方法,如下:

 

function getautoname($string = ''){

  $matches = array();
  if ($string) {
    $result = db_query_range("SELECT sname FROM {credit_score_strategy} WHERE LOWER(sname) LIKE LOWER('%%%s%%')", $string, 0, 5);//下拉框显示五个结果
    while ($r = db_fetch_object($result)) {
      $matches[$r->sname] = check_plain($r->sname);
    }
  }

  drupal_json($matches);
}

 

上面程序将取出的结果赋给一个数组,然后调用drupal_json()方法,这个方法会自动将数组转为json格式,然后打印出来,想echo一样

 

之后,加了 '#autocomplete_path'  属性的表单元素会自己接收这个输出的结果然后解析并放在文本框里,届时文本框右侧会出现那个常见的小蓝圆圈,表示你加入了drupal的文本自动填充功能,如下:

auto2