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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 8-10-2012 21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


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

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

 

 

 

 

1
, b  m8 J% H5 y2 R( B. j2' j% z# ~) X2 M1 D  n
3. D* c; l* x2 c6 A  t! t
4# r: V0 B, ?3 z2 ~2 U- J1 z
5
5 M# D9 O3 N- G6
5 e. u1 k  A& T6 M4 a+ q7
5 z: i' g* u2 @. _+ t! }- [8
3 O$ {3 V3 U" q, ~) L9
6 j' J4 |9 ~* o4 B; @* ^  K105 B0 }+ O5 q0 x# o
11
( B; a7 P9 {' V  F" U4 `123 F. x5 I( n  D* }; V! ?
13
& J: w  C, h" F: _% f6 q* T
function module_name_form() {' o# q! s1 H$ M4 j0 B
  $form = array(); 
5 h6 s; E( A( _! s# h& H& o' r  $form['city'] = array(
. I1 g$ J3 R% h. k    '#title' => t('City'),! z- N1 A0 B" \
    '#type' => 'textfield',
2 o) d4 X1 o! m; _0 Q3 U    '#autocomplete_path' => 'example/autocomplete', //留意这行。下面将做讲解。) B  R8 {+ }, Y3 m
   );" u( ]4 m. z" b3 A
  $form['submit'] = array(8 A) i  ~/ r& @+ V$ {& W# m* M. j
    '#type' => 'submit',) o7 D% W; [8 Z8 n, ]
    '#value' => 'Save',
/ s1 p! P3 S) Q" t+ @" [' Y  ); 1 o3 b, U* _7 ?# x) m
  return $form;
' f5 `: ?) b% b5 v: s$ u" t0 ^}

 

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

17 p: R0 N4 L: ^: p# K( J# ]( ~
2
$ K; @$ u5 W# j3- @3 T/ C( Z+ W: v2 z
4
% S+ [# z5 g& b5) U  ~; {8 B8 E- L' l0 Y* K
6
( B5 {3 t& O' t# _7; O' S2 s& J- w
8
5 R' ^; n" P0 B4 e3 I1 g" |1 m
function module_name_menu() { ! `2 |( z; @9 t! p
  $items['example/autocomplete'] = array(
$ P) h4 d; \2 u$ A5 W. k    'page callback' => '_module_name_autocomplete',//这个是函数 function _module_name_autocomplete($string),下面将讲述。0 k# l/ G1 o( g
    'access arguments' => array('access example autocomplete'),! Q$ {# k0 R- I6 _4 {2 W
    'type' => MENU_CALLBACK6 D3 F( S$ ^4 V6 d* m
  );" x  j& E9 @0 W6 C" {
  return $items;( M: Q# ]$ |2 [$ i
}

 

最后一步是创建函数 _module_name_autocomplete:

1
" V* i$ j8 l* A: f3 u& M* \7 L2
8 a7 G9 ?6 {+ Y( J3
2 ]' z# p0 |$ t! [( H0 U4 c) `  g& B41 r1 V0 N/ a% t( F
5  ~( I6 ]  T! y, q, V  X
6: p- V4 M# r- l  ~0 ^9 e
7
% _& \4 X5 t- ~' S2 J. S6 I8
2 F) T( w3 ?% |' e# D3 C9! N0 v7 I) k, @: Z6 V" s
10/ y0 n3 ?+ o7 e; V* U" V) R
11
) t! C, p- \9 s# q* z; h12& _' I8 L- Y. i
13
3 u/ g' C/ n7 X, P14
5 P+ j9 t9 o- O4 K150 m# \9 e6 _; z* f! W3 R
16
$ {9 ^9 }' A7 o. O" O" Y% p17- x" o8 c* e: C, @. _$ [1 Y4 M, e" Y
function _module_name_autocomplete($string) {6 M8 m* [+ @1 z2 }4 Q5 m5 o4 y
  $matches = array(); 
" }, V; x; Y/ x5 j  // Some fantasy DB table which holds cities
$ ]" k, ~8 x5 E4 b5 a& G  $query = db_select('cities', 'c');. _* b6 r4 w8 j2 J1 T$ w
  // Select rows that match the string
3 Z, L' m% D5 f$ R  $return = $query2 C& W% p% d8 K
    ->fields('c', array('city'))
( v+ i& }( t+ E2 h    ->condition('c.city', '%' . db_like($string) . '%', 'LIKE')
* r) R# K/ g( Q7 p8 ?) ]5 _" j& K    ->range(0, 10)" r  y. q7 |1 d' ]7 U) X3 ?; s
    ->execute(); 
0 ]% H' D" {5 Y6 E  // add matches to $matches # W  y) J9 n! p) ~4 _
  foreach ($return as $row) {
8 {+ r% c# O) P5 [1 ]    $matches[$row->city] = check_plain($row->city);! x) `% _* Z, a7 f& P
  } 
5 ]( z" e* `: T5 S! s" B1 ~+ x  // return for JS& f( x; i; r3 p+ c* j
  drupal_json_output($matches);
1 G7 m2 A+ a. s) C. a0 x}

 

这个函数我们通过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-20-2025 06:48 , Processed in 0.710038 second(s), 121 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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