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(); }