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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

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

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


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

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

 

 

 

 

1& Q" L- A" W: i% d- X; z2 a
20 r8 G8 o5 U; f) W6 H4 u$ P
3
  ^6 c" A. S3 G  d, ^0 F" G4
6 t0 k, v) S# k( j: e/ o- o) {5. |1 }; L6 d# A8 @' s+ K: ^
6
+ @) L; R- _- D; \; Z- N  X" W& X73 t: N2 l+ H. y& t2 M# N
8
& u$ S* x& n+ i# {% D. [9
( W! w" Q6 ~$ ?& Q2 ^10! H, p( ~3 Y- Y) P7 E
114 V6 W* |* _  |( q" W4 N$ u
12
. p# A8 H/ k# X13
; ]4 d9 a) |1 `6 u
function module_name_form() {% b" A# m9 ?! {
  $form = array(); 
' b. D9 ~, ]- [/ M; W  $form['city'] = array(
; o- r& k6 m/ y' y$ ?4 v    '#title' => t('City'),
( m% n* H8 B. p; a    '#type' => 'textfield',
( E) K+ G! b% p$ q/ n    '#autocomplete_path' => 'example/autocomplete', //留意这行。下面将做讲解。/ D1 T/ h" z% X3 }1 X2 \
   );
0 G1 _2 b- X/ |2 T. u8 f  $form['submit'] = array(. V" v7 q6 ]# d8 K3 j
    '#type' => 'submit',
6 y7 G( |* s% u    '#value' => 'Save',4 F- f0 x5 ~2 n) Q' m, Y; W& ^! K
  ); 8 x: n6 k0 _. \9 y- Z1 R6 J
  return $form;* K. }1 F2 m4 M) Z7 y9 m9 c9 Q
}

 

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

1
+ S6 n& `) K& j9 x: s6 s2
# P6 w9 A. A; P/ U, f3$ U! y8 p3 Z( `9 L  ]  k
4! t4 Q: `0 ~) z0 t% p) x9 R
5
: s( r& W+ z- u0 j! C3 o: M& t1 ]$ G6
3 e5 s/ \+ C# V4 F7 G+ v* a7 [! y0 l7
$ m+ }1 s- S9 k8$ E' Z+ B( r& z2 B
function module_name_menu() { ! {& Z3 J) l, ?- [
  $items['example/autocomplete'] = array(
( x# ~- @1 E2 `8 v6 D! b    'page callback' => '_module_name_autocomplete',//这个是函数 function _module_name_autocomplete($string),下面将讲述。
) L5 v& a' x* \" Y( w    'access arguments' => array('access example autocomplete'),' d6 D2 s# \( ^  B4 e
    'type' => MENU_CALLBACK
9 \% P8 U' G/ |; t7 y* }  );$ R; C0 O, O. G  h/ N5 [
  return $items;
% c* z3 ]  ?, G2 v9 o/ C. h# q. h}

 

最后一步是创建函数 _module_name_autocomplete:

11 Q: K; p7 d8 K) }# H7 V' N% _
2$ c; V% \% Q9 B4 D6 x% t. a. p5 o
3
6 n8 s6 u* R# `2 ~0 M4( ?% R% H0 T+ P" u, `- [  x
59 f1 R2 H, @& v
6  ?9 t$ M: @) R/ `
7
* R* ?1 W4 r3 Q( K% V6 I7 ?( R82 x- q$ S; a, F
9
# s7 ?# O0 g  M! d6 |10
+ Z9 b& k& x9 p2 y' d117 ^/ X5 W. y0 y; e/ Q
12
  l8 ]3 m  d0 C( l# ~+ T138 I% t, O, J& s8 R/ C1 S
14
& C$ i6 g! ?" q- m) d% ]1 u15  u( H! V9 F' e6 Z" Z
16
( I- S! ~! _& }; n174 l- o; T2 x2 g- K+ `, ^
function _module_name_autocomplete($string) {5 z. e) F! d1 z6 {( K
  $matches = array();   Z; P+ l, }: R) w) I
  // Some fantasy DB table which holds cities6 N4 a6 M6 H, @* _6 u+ J# U
  $query = db_select('cities', 'c');, u- X$ q/ A/ t& p
  // Select rows that match the string/ ~) S% |0 T/ I6 U. k
  $return = $query
2 l( S, H# R' R" l    ->fields('c', array('city'))7 c/ K& e5 _# {+ l0 J
    ->condition('c.city', '%' . db_like($string) . '%', 'LIKE')
) A' Y/ m6 ]) y" m: y' z) Q6 f    ->range(0, 10)
, r& a( m4 k2 ^: X    ->execute(); 
7 w% C" M% D8 ]0 ?, D- D7 b1 T  // add matches to $matches 
; D  R# _0 B7 |8 `. y" ^; a; k% d: h  foreach ($return as $row) {
8 T0 S- W4 {: t# V    $matches[$row->city] = check_plain($row->city);. _( i, X' G3 z: ~
  } , g; Z+ ]# P1 B4 F; r( d) g7 S
  // return for JS  |, \6 R* x1 e3 l( a
  drupal_json_output($matches);2 B0 B' {' x4 ^4 X) L; f& _- i
}

 

这个函数我们通过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-21-2025 10:49 , Processed in 0.409553 second(s), 123 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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