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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

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

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


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

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

 

 

 

 

1
  d5 P/ q7 k0 M7 I- @, s2- U! g! D  s7 H) w1 X  l
3
( G' _( j2 s* T( j4
2 @2 [- o/ t( E( E5
8 ~/ J. z) K! Z* k# e0 D6* |1 e  ^3 h6 w% @$ D
7* R) d* Q$ n0 F5 L5 a' Y
8
( ?% J# j  Q+ W1 K5 i$ z9
& J3 f" X- E* ^10
- e% c  _- D* z( F. U11! b+ I. f6 n# x* L; i3 V
12
# {5 E; ^) K9 U13
! v/ t0 u' k& r0 x
function module_name_form() {
8 D5 J. ?  d. |" o3 Q8 B" X  $form = array(); 
. p0 r/ g' _% b6 `: Q  $form['city'] = array(
: z2 P9 F# M6 f8 e/ l( ^: F    '#title' => t('City'),9 Y8 E  q6 B5 X4 v, n" I
    '#type' => 'textfield',
7 \) \; W' z& a+ H6 f2 F8 T    '#autocomplete_path' => 'example/autocomplete', //留意这行。下面将做讲解。
) y2 s5 J9 L4 Y/ [9 ]7 \  v   );4 L$ L; X) E/ r9 a' y
  $form['submit'] = array($ c8 E* r& F% P8 d
    '#type' => 'submit',1 {% I/ Y! O) c8 L) K7 C
    '#value' => 'Save',
8 O0 _& m! v0 H; b; }8 @+ G  ); 
% \% @8 y  s# m  \( k  return $form;
2 R9 x& \3 @% n+ z}

 

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

1
: \! ?- z6 B3 m9 P" r/ C, `20 u7 R1 U9 M- D# E8 C7 i) {9 t
3
8 r9 i6 J$ V, e. o8 v* C- _4
& [# n) Q- I* F/ I5 m, ^' G5" {" X( l: I7 }" g: c, w0 _( s
6
% W  k' A2 F% b" Z+ b4 b! o' R; e7
6 I$ k, f" k) s# n+ ^84 G2 ~/ N! u1 |& H
function module_name_menu() { * D8 H, L& |- ?. ~3 Z& I! |
  $items['example/autocomplete'] = array(
- I" Q0 ^; ]8 X  N    'page callback' => '_module_name_autocomplete',//这个是函数 function _module_name_autocomplete($string),下面将讲述。
1 b0 U$ g% [; W  w6 V! {    'access arguments' => array('access example autocomplete'),; g' V$ r/ x- G3 {( |
    'type' => MENU_CALLBACK
% s1 |8 P9 R8 R% A) I: L  );  h8 X' \$ d8 b7 d& ^0 I
  return $items;
6 K' y2 d* H0 A}

 

最后一步是创建函数 _module_name_autocomplete:

1! `$ H  P- s  S6 M
2# H, u. V* P, k5 @, {  {1 B5 q, F
3
, |" g8 z+ q1 S! c46 c1 }5 k7 E6 X. e3 Z+ I& A) L% a% l" u
50 V, u! u$ Q5 c: W5 w
6' _/ Z9 d5 D4 i; R3 L; Z) B
7
% s' x. ]/ y% f6 z. M* l# P7 d8
6 h; p7 N, b, F( E* f4 W9: i# Y5 l! W, U, [/ P* g0 R# e
10
% t- s" J& l4 o11
# g$ c) [  D) ?( w+ r' E12! s7 c- D+ ^) U+ ]2 f! E6 x
13
* X# ~, {$ G0 u7 s7 T14
' [1 o6 p2 ^  f6 g15% Q& K6 t/ e' O4 ]" i: ~% x" c* ?6 A
16/ p7 i- ?8 W2 C" R
17
+ K' s0 C; t/ [1 l* X# `0 X
function _module_name_autocomplete($string) {( F4 V/ R4 r" C9 g$ M7 I: s$ U' h
  $matches = array(); 
' |1 U" r5 R8 t7 t+ d  // Some fantasy DB table which holds cities0 n% O, ]$ X/ F) U1 \% W
  $query = db_select('cities', 'c');
: r: W" R- ?* K4 b7 [  // Select rows that match the string+ W& Z+ q" ~9 Z. g
  $return = $query" `0 I+ s  E2 x8 o. Y* F
    ->fields('c', array('city'))* D/ o4 z% _9 J4 Y# t( R1 ^- l
    ->condition('c.city', '%' . db_like($string) . '%', 'LIKE')$ O3 h3 }( S) i6 ]% b
    ->range(0, 10)
0 Q( r+ _- s- n$ S' l: O    ->execute(); 3 T9 N, f5 A- o6 F6 P& ?6 C5 U
  // add matches to $matches 
- |+ ^3 f% G- o$ N8 o5 R  foreach ($return as $row) {3 e# _7 h3 U$ u( b# b
    $matches[$row->city] = check_plain($row->city);
4 [- z2 b. k. a& w6 n- a7 ?0 ]4 ]  } ; g9 ?1 @. K6 a
  // return for JS- A5 `, x0 m* ]1 U/ T5 n3 T* y" t
  drupal_json_output($matches);
, \7 k, Y/ {1 ^6 c- z}

 

这个函数我们通过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, 5-1-2025 07:23 , Processed in 0.316846 second(s), 122 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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