欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Drupal:AHAH AJAX异步机制 有大用

AHAH是Drupal6中Form Element的一个新的参数,可以通过Form Element来触发事件,提交AJAX请求。
AHAH的作用域

AHAH参数可被作用在以下Form Element上:
button, checkbox, image button, password, radio, select, submit, textarea, textfield

AHAH的使用

1. 为form元素增加ahah属性。

 

2. 配置AHAH的参数。

 

参数 作用

 

path 异步请求的路径。

 

wrapper 请求callback后需发生改变的DIV的ID。

 

method 改变wrapper这个DIV的方式,可以是replace或append。

 

effect 在wrapper这个DIV发生改变时的视觉效果。

 

progress 是否显示进度条,progress共4个配置项type、interval、url、message。

 

默认情况下type是throbber(一个旋转的时钟),我们可以将type设置为bar来显示一个进度条,在interval、url不配置的情况 下,bar仅仅只会显示一个永远在滚动的虚假的进度条。message是进度条上显示的文字,url是获取进度状态的地址,progress将会异步轮询 这个地址来获取当前的进度情况,interval则是轮询间隔的时间。

 

例:

 

 

<?php
          $form
['submit'
]=array(
             
 '#type'=>'submit'
,
             
 '#value' => t('Submit'
),
             
 '#ahah'
 => array(
                 
 'path' => 'user_dig/export_user/js'
,
                 
 'wrapper' => 'user-dig-msg'
,
                 
 'method' => 'replace'
,
                 
 'effect' => 'fade'
,
                 
 'progress' => array('interval'=>1000,'type' =>'bar','url'=>base_path().'user_dig/export_user/progress', 'message' => t('Please wait...'
))
              ),
          );

?>

 

3. 配置一个menu来接受path的请求。
menu配置

 

<?php
$items
['user_dig/export_user/js'
]=array(
             
 'title' => 'Javascript Choice Form'
,
             
 'page callback' => 'user_dig_export_user_js'
,
             
 'access arguments' => array('access content'
),
             
 'type' => MENU_CALLBACK
,
          );

     
 callback实现

     
 function user_dig_export_user_js
(){
         
 drupal_json(array('status' => TRUE, 'data' =>theme('status_messages'
)));
      }

?>

 

这时候data中的文本将会以method参数配置的方式来改变wrapper DIV中的内容。
4. 配置一个DIV做为wrapper用的DIV
wrapper用的DIV

 

<?php
          $form
['msg'
]= array(
         
 '#prefix' => '<div id="user-dig-msg">'
,
         
 '#type'=>'item'
,
         
 '#suffix' => '</div>'
,
          );

?>

 

5. 配置进度条状态请求的menu。 menu配置

<?php
$items
['user_dig/export_user/progress'
]=array(
             
 'title' => 'Javascript Choice Form'
,
             
 'page callback' => 'user_dig_export_user_progress'
,
             
 'access arguments' => array('access content'
),
             
 'type' => MENU_CALLBACK
,
          );

?>
callback实现:
<?php
     
 function user_dig_export_user_progress
(){

//好像这里不能用 一用的话 好像数据可能出错
          _drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION);
         
 drupal_json(array('status' => TRUE, 'percentage'=>$_SESSION['user_dig_percentage'],'message'=>$_SESSION['user_dig_message'
]));
      }

?>

 

当然这里的

$_SESSION['user_dig_percentage']

$_SESSION['user_dig_message']

是在path这个menu callback中计算出来的,percentage的范围是0到100。使用messsage来显示当前请求的执行阶段也是很方便的。
在这里值得注意的是似乎Drupal的ajax请求并不会完整的boot整个Drupal框架,这也就是为什么要先调用
//好像这里不能用 一用的话 好像数据可能出错

drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION);

来手动boot session的目的,不然对session的任何改变都不会有作用。

小结

使用AHAH可以在无需编写javascript的情况下发送AJAX请求,利用AHAH的progress的功能可以简单快捷的实显进度条。可以很容易实现提交异步form的工作。

来自  http://blog.sina.com.cn/s/blog_4fa035580100fmgr.html

普通分类: