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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

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

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


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

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

 

 

 

 

1$ l0 V, j$ p' t
2& _5 G: \% K. G6 X; c- n
3
+ j) }/ Y) _0 P  B4
5 H5 t% q4 T: |$ T* `5/ l; W+ ^3 f0 h
6
% O" Q' s, A( w% c8 n! p7; I$ l9 {& [3 u! z; d
8
, [/ h/ r. Q. I% u5 K/ q3 m9
9 {$ N& [; m1 J* {& r% \' y% i+ U10
6 t6 s9 D: c$ r0 U) y! \11
0 D, g( u2 s* w+ w9 v7 l4 k2 K125 Z. i! X5 S" a0 p9 ?7 a& E
13) ~( r" Y0 h& S. M
function module_name_form() {
; C0 b5 U+ g) k# X5 |: p  $form = array(); 0 m% ^  D5 `! u$ L/ `6 f7 g6 v
  $form['city'] = array(
! g4 _/ {8 z+ _- A0 W    '#title' => t('City'),) o7 y: m  T3 C4 r9 v
    '#type' => 'textfield',
- w" k6 s" ?" K0 @$ T    '#autocomplete_path' => 'example/autocomplete', //留意这行。下面将做讲解。( |! x: M1 _3 f, d$ N* C& A
   );+ E4 @# k1 {5 T$ E$ s4 V' _: n/ i
  $form['submit'] = array(* r7 Z7 f% Z. b: ]
    '#type' => 'submit',- F0 ]( U9 [2 c7 \
    '#value' => 'Save',
" p2 I0 i1 z6 T& a1 L$ x  ); 4 {$ D+ B9 e) H" o" H% \! E
  return $form;; D& A; V: S; W" a! O
}

 

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

19 T! ]9 M" S) u2 ^
2
  J. Z; y0 q  {# y. m  `3
! N4 R) M* N: t' K% r2 A" `4
: d1 Z/ M. `  X( j' I8 T* M/ E5
  y+ j6 e0 \+ [: |8 Z6
% E' x# b* v' j/ g& v73 [" T4 |  ?0 s! Y
8& Q3 s* E1 B/ `- v7 k6 d
function module_name_menu() { 
& _7 P" _+ R2 i0 p5 V) {* f3 _6 P  $items['example/autocomplete'] = array(3 L( U; t' H8 P5 o1 {6 p4 E( H" c+ Q. p+ P
    'page callback' => '_module_name_autocomplete',//这个是函数 function _module_name_autocomplete($string),下面将讲述。
% Q3 e% g- A& ~- P# ~    'access arguments' => array('access example autocomplete'),
4 j% h) B6 P. p7 w& ^    'type' => MENU_CALLBACK: e/ P4 A" s% |4 Y6 f  w
  );
/ G& b* t1 [! i. P. @& H- @  return $items;
( @) G; T& c  `0 Y/ {}

 

最后一步是创建函数 _module_name_autocomplete:

1
- N6 L( Q  E2 p: t20 a  k7 t. u$ f( b/ ?9 f  O5 ^# U
3
. m5 _, D$ F$ a& u; l49 \  m% S, s5 x4 K+ f
55 ^& O, @6 w( {$ Q
6
8 A- P- N+ n* Y) C! W+ C7* U5 Y  ~. P' i
8
3 e1 a: A* Z% `& ~9. E1 t* N- Q. K: r- ~
10: q+ n. O! C( d
110 o* V0 V% e' B) M* D. z
12% ^# R2 n4 u% @( f
13
9 g* c9 [4 V8 j4 w9 @* |144 m/ q) w# X, |9 c$ V
156 t9 B  C$ {7 Q2 ^
165 t5 f' C; y/ E
17
: l8 K) G) z( {
function _module_name_autocomplete($string) {
8 c3 j* J# a% V  $matches = array(); 0 w( d9 n! ~. F) n# F& d( \
  // Some fantasy DB table which holds cities3 l+ l7 B3 J3 Z1 Q; M5 B$ ]7 V
  $query = db_select('cities', 'c');
7 r. {% Z/ b4 t3 {" x& W  // Select rows that match the string
8 X- t! K+ f8 _  $return = $query
6 j8 h, p* b) W5 c0 ^4 V' a( M    ->fields('c', array('city'))1 s, |6 S* a7 q' P8 i4 a, }
    ->condition('c.city', '%' . db_like($string) . '%', 'LIKE')
( d: v2 ]& s, L& }2 A    ->range(0, 10)
% q3 P2 ]1 Y4 v9 F/ }    ->execute(); ) |# G* S0 T( y" b3 ^+ d
  // add matches to $matches 
) p% j% o3 h+ J# Y+ N' n. I' W  foreach ($return as $row) {
: s2 ~, ]2 }0 f( l" r: |8 Y    $matches[$row->city] = check_plain($row->city);, }/ e( z/ y! Y' o( O
  } 
' C0 b9 X1 C, Q2 B5 }2 d: u: V  // return for JS
5 y7 [! V0 f: T1 F( |  drupal_json_output($matches);
! V0 n% D' w! F7 m}

 

这个函数我们通过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, 2-19-2025 14:30 , Processed in 0.421236 second(s), 120 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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