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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

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

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


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

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

 

 

 

 

1
" X! b8 s! v3 e8 D2
; r8 b$ Z; b. A" N8 G9 ~2 T5 G3
  x: w! c; w* Y$ r4
# y$ U/ M: y( E5) a- n; ?) q. _7 I7 A( D) {
6& G! N6 t3 Z# T& Q. x% g7 x
7
, i6 e: c$ ^& e8
. A- c1 @, F% Z7 k9' x. H& ?" J+ `0 j4 E# W% N
103 h' l% r  D0 f5 p4 t* O
11
' J0 L1 m, m: }2 h" ?9 r# u12) v  Q0 L, `0 {, z- l
13
# F- g9 F1 X& B/ S* [
function module_name_form() {2 h! d" `9 V' L$ t8 _- K1 X2 K9 e" ~
  $form = array();   V+ m2 {3 i, P
  $form['city'] = array(
% a9 {" ]  @$ u8 A9 R8 t% P7 u3 Q$ z* d    '#title' => t('City'),
& _8 Y7 s/ ~  v    '#type' => 'textfield',7 K, h+ e* l' W( j7 ?
    '#autocomplete_path' => 'example/autocomplete', //留意这行。下面将做讲解。* N" Y$ m! C) U5 m) c
   );
, X% h, k% k& p$ {! a; D5 F  $form['submit'] = array(
2 `6 K. X2 h) L4 _    '#type' => 'submit',
# Q2 I7 b8 w, b2 Q" e# C    '#value' => 'Save',
6 v  y5 n1 `- i  ); , Z- `' @* u% X: p# ~
  return $form;* {. o& N' G/ I1 |. r3 m
}

 

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

1
, S( a. p; O! j2" Y1 j. T4 O1 k! \
38 {/ \- X, p, M4 _5 g0 H: Y* x) G
4! E' X' X) S. k( @8 F& D
5; S( |" w: [+ t3 m% c! t0 k6 N: D+ V
6- E! m) q) s3 [
7
8 h- S5 n# z( l5 }/ ]8
$ o0 p: d; W% Z5 B( U: z
function module_name_menu() { 
* M/ c% x) P# R: |1 k  N9 M  $items['example/autocomplete'] = array(
2 w) ^$ W3 o; N8 |' }$ E# S: s    'page callback' => '_module_name_autocomplete',//这个是函数 function _module_name_autocomplete($string),下面将讲述。
) R/ A( U) x! L2 Q$ M- I9 K    'access arguments' => array('access example autocomplete'),
2 Q2 p: N' y' f9 C    'type' => MENU_CALLBACK* h2 a+ h: k  c, {. a4 w. h
  );
9 }' j4 y$ O8 j0 c- e+ s  return $items;
4 G; e: L" P: o. P1 }}

 

最后一步是创建函数 _module_name_autocomplete:

1
- Z& x$ B; \/ q/ W- t! X* [2
% X& M" L# n: ~$ w5 X34 _, O7 ?& ^5 j7 M
4" a7 @9 S0 ]! Z9 f2 A1 k
5
9 I5 I$ ]7 ^& u" {7 R5 K* `' I  U6# ^( t( m1 T* A9 ]& d# @. s
7- N: M. q$ ~) W( ?4 R
8
1 x* z, N) I+ R! e4 h3 a9; w7 F! I- W. _
10
6 w# O# U+ T4 }11
( {( I5 L( d+ Y* P% p+ E! ^# J12, q2 S- p( `0 w0 {
13, E+ A* h$ c! W3 g% N9 U: D2 ~" h: I
14$ S! W' W( N! b! R: W( X
158 a% y, T4 x  J7 ~$ v! m# A# U
16
/ p. l# I& n% g) v6 g7 `4 \9 i; [. D1 l17
1 a* F: x1 \2 u2 z) L! {8 \$ F: w
function _module_name_autocomplete($string) {5 F  i1 k6 O* I# `6 {
  $matches = array(); 
  p8 m3 e9 [; q8 U  // Some fantasy DB table which holds cities
5 S& {+ x# ]8 C: v5 o  $query = db_select('cities', 'c');1 g# p% M. K2 Y3 |4 J& T3 |
  // Select rows that match the string
7 Z" A/ A/ [9 Z5 g, w/ }- D6 p  $return = $query
( P# |! _- t7 `% S4 S    ->fields('c', array('city'))
# @& M* j3 V7 V0 A2 I    ->condition('c.city', '%' . db_like($string) . '%', 'LIKE')
$ K) e% j6 ?) ~# K  E6 U1 N    ->range(0, 10): L" c3 N& f7 {' X
    ->execute(); * r6 P! U" e! @+ p: Z5 i
  // add matches to $matches 
3 x- K& o- Z$ I! t  a0 `  foreach ($return as $row) {- T" c% F4 A) i3 }4 [
    $matches[$row->city] = check_plain($row->city);1 ]$ k0 B3 i2 ~. S4 s% w+ s
  } 
3 C& X! S+ @4 @" Q/ b0 h  // return for JS% V4 r7 U, O0 j/ r, G
  drupal_json_output($matches);9 y* t5 f: e6 g; G) _+ F
}

 

这个函数我们通过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, 11-11-2025 19:58 , Processed in 0.203351 second(s), 70 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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