欢迎各位兄弟 发布技术文章
这里的技术是共享的
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,
);
?>
<?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