国外设计欣赏网站 - DOOOOR.com

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

[Drupal问题] Drupal 7 如何做自动完成输入框(Ajax Autocomplete)

[复制链接]
发表于 8-10-2012 21:48 | 显示全部楼层 |阅读模式


人天性是懒惰的,网站浏览者也是一样,很多时候,浏览者在输入单词时候,都希望能有自动提示功能,如果表单能自动完成,是能够提高不少的用户体验。Drupal 7能够很方便的创建自动完成的textfield,下面讲解如何做:

让我们想象一下,你正在构建一些表单,你想帮助用户自动完成。例如,这个可以是一个“城市”的输入文本框。你可以有类似下面的形式:

 

 

 

 

11 @- t8 ]9 W, B: |5 Y' N8 b
2
* E' S4 {" J' d3
( y/ \6 e9 k6 E4& O. `- J9 H# z$ h; r/ g2 t9 W' h
5
7 [8 q! Q1 J2 @$ ~6
3 X5 ^/ H- z5 _/ k' U7% ~$ {- o  ]2 z! v" V; F7 ?' l8 i2 n
87 R& \; o% G' r' q: Y' b
9" e6 n& u  G- T, e
10
" g9 s0 o- `' @: p% B11
  {' K" U" {4 c3 g: X. E- X$ b12
7 v' y6 a% w2 I/ ?13
% D% z, N. E% a6 m
function module_name_form() {
, d0 @" w# V+ Y" v. M" B  $form = array(); 
& u9 V' ]4 k! q  $form['city'] = array(
4 |! F+ D& f0 U4 \$ {. Z$ X( V    '#title' => t('City'),
3 |- l) m; A: x- C% E    '#type' => 'textfield',1 S* w1 I& T/ `9 l1 R
    '#autocomplete_path' => 'example/autocomplete', //留意这行。下面将做讲解。
9 B# O, v; b- N   );& k9 L2 Q4 U! {7 Z/ `8 G8 Y9 g+ g
  $form['submit'] = array(
+ F' P) N, r  A+ n. @# b    '#type' => 'submit',3 p: ~0 Q5 u7 P: Q
    '#value' => 'Save',  K* X' B  m  D  z: x+ k
  ); . b+ p4 j+ a. N- }
  return $form;
' Q3 T) _4 U/ A, ?. X; v% d}

 

上面代码,最关键的部分是:'#autocomplete_path' => 'example/autocomplete',它定义了一个回调到textfield,当用户在文本框输入一些文本,drupal 将会发送一个请求到example/autocomplete 路径,同时通过Json回调结果回来,而example/autocomplete我们是可以用hook_menu 菜单系统实现:

1* c; a) |- N! ]% q2 w
2
, d* B; J0 E+ R% q# R( K36 k0 q: _" _% i+ A4 ?+ v
4
6 P0 Q6 u8 w: g, z7 I  t  M+ w1 F5# S! Y! u$ [) T5 |6 q( Q& R, o
6
, A- V: d, t  L$ l7
" H: a" J" s2 O+ A/ K* P+ V, F$ L. _8% Z& W( g# L8 D& K
function module_name_menu() { ' L# N& t9 p0 g+ v5 C
  $items['example/autocomplete'] = array(
9 r" f% x8 ~; Q" U; M. q! `    'page callback' => '_module_name_autocomplete',//这个是函数 function _module_name_autocomplete($string),下面将讲述。
8 i* i  k  k1 d- T& H( c    'access arguments' => array('access example autocomplete'),' {8 }9 t, Z$ x- h+ n3 N4 e% A
    'type' => MENU_CALLBACK
3 ]; n0 Y  Z0 a  );* M% @3 ]& O, w/ {2 z& o( j0 u
  return $items;
+ N8 w: U* _: i( K5 x/ p* ^}

 

最后一步是创建函数 _module_name_autocomplete:

13 l# d, s0 u9 k! S+ @# |
2& f/ ?5 m7 V: _
3
) R4 ~! i! J2 K+ H$ h9 J4
- z6 f  `* ?  t* j5
2 O9 f( P" ?2 Q* `# T6
7 s, _7 m% O; @6 t( c' ~7
+ u- D8 ]8 G  _8 t; w8
5 I/ C: A2 m9 r3 a7 `99 E& b( J: t9 \
10
: }3 S( X, d* S0 G' N* K& B( M11' ?  [' q9 g5 j* ?1 S/ V
12: |$ A% j1 U+ D
13$ z0 X/ Q" q; m% v. O% D
14+ j+ h/ [) k  }( f& q" @6 |
15, B5 w' r& S( F& h: u! {. ^
16
5 g( S: y) D, w' `176 R# z& v4 ^2 P/ s# o, B
function _module_name_autocomplete($string) {0 a( C. ]0 w$ O" L9 ^
  $matches = array(); 
8 t! M& {9 z3 L; T  g  // Some fantasy DB table which holds cities
$ ]3 g; R) B6 }$ ~  $query = db_select('cities', 'c');
4 |1 W! R4 C3 z0 |3 K/ P. c  // Select rows that match the string) K: a: |9 A' c; z
  $return = $query
( r, P) `5 G7 m5 B    ->fields('c', array('city'))6 M4 E( W5 A" j4 a8 [8 g
    ->condition('c.city', '%' . db_like($string) . '%', 'LIKE'): ]" I4 K+ H* ^( L3 |1 T! H
    ->range(0, 10)
/ W9 W  G  n4 \' f    ->execute(); 
) V' U9 y" C0 q. F& S: g; m  // add matches to $matches 
: r& ?% N% w. z: s+ X' d7 z' f; u  foreach ($return as $row) {
  M9 _* _7 \% ?$ p2 [9 [    $matches[$row->city] = check_plain($row->city);
7 W' u) z: _) ?  } 
. p1 S0 w, E2 k  // return for JS
; v7 U7 k% R3 T  drupal_json_output($matches);
  C3 I( X$ g/ V: ?}

 

这个函数我们通过db_select 读取数据库cities表的数据,从表数据中找到与用户输入相类似的条目。(如果不习惯db_select,也可以用回db_query,drupal 7同样支持)

如果你想要更多比较完整的例子,你可以去看看drupal 7的核心模块 taxonomy,里面有一个函数function taxonomy_autocomplete,大概在79行(‘modules/taxonomy/taxonomy.pages.inc’)。



猪跑啦网站的添加新问题页,http://www.drupalla.com/question/ask 是autocomplete,

还有也可以看看我的另外一个网站图标酷(http://www.openico.com),那个搜索表单,也是autocomplete的。

现在,我猜想你应该能完成一个autocomplete 了,赶紧试一下吧,实践最关键。



猪跑啦独家原创专稿,欢迎您转载本文,转载请注明来源。

|2011-2026-版权声明|平台(网站)公约|DOOOOR 设计网 ( 吉ICP备2022003869号 )

GMT+8, 6-16-2025 21:45 , Processed in 0.978259 second(s), 122 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表