ahah使form能实现ajax效果。使用需要先在form使用DIV划定wrapper区域(可以通过#prefix与#suffix添加DIV外框),传递#ahah参数,#ahah参数决定callback路径、wrapper的ID与过渡效果等。带有#ahah参数的form项被点击或改变状态时将会无刷新访问callback URL, callback会返回一些json结果,来替换(或追加)wrapper区域内的内容。
主要实现代码如下:
$form['howmany'] = array( // 表单项定义
'#title' => t('How many checkboxes do you want?'),
'#type' => 'select',
'#options' => array(1=>1, 2=>2, 3=>3, 4=>4),
'#default_value' => $default,
'#ahah' => array( // ahah参数
'path' => 'examples/ahah_example/autocheckboxes/callback', // callback路径
'wrapper' => 'checkboxes', // wrapper ID
'effect' => 'fade',
),
);
$form['checkboxes'] = array(
'#title' => t("Generated Checkboxes"),
'#prefix' => '<div id="checkboxes">', // 用div把表单项包住,并设定ID,必须唯一,本例子中作为wrapper区域使用
'#suffix' => '</div>',
'#type' => 'fieldset', // fieldset表单项,一般用于表单项分组
);
// wrapper内的表单项,将会被替换的数据部分
$form['checkboxes']["checkbox1"] = array(
'#type' => 'checkbox',
'#title' => "Checkbox 1",
);
// callback处理函数
function ahah_example_autocheckboxes_callback() {
$form = ahah_example_callback_helper(); // 自定义方法,用于得到表单最新状态
$checkboxes = $form['checkboxes'];
// Remove the wrapper so we don't double it up.
unset($checkboxes['#prefix'], $checkboxes['#suffix']); // 被替换的部分,不包括wrapper DIV
$output = theme('status_messages');
$output .= drupal_render($checkboxes); // 通过表单数据生成表单HTML
// Final rendering callback.
print drupal_json(array('status' => TRUE, 'data' => $output)); // 转为json数据
exit();
}