1.在hook_menu()中定义弹窗路径(带'/nojs',定义中为'/**/%ctools_js')
function member_menu(){
$items = array();
$items['member/invitation/%ctools_js'] = array(
'page callback' => 'user_invitation_callback',
'page arguments' => array(2),
'access callback' => 'user_is_logged_in',
'file' => 'includes/user_invitation.inc',
'type' => MENU_CALLBACK,
);
return $items;
}
2.定义hook_menu()中路径调用的函数(ajax callback)
function user_invitation_callback($ajax){
if ($ajax) {
ctools_include('ajax');
ctools_include('modal');
$form_state = array(
'ajax' => TRUE,
'title' => '请输入您朋友的信息',
);
// Use ctools to generate ajax instructions for the browser to create
// a form in a modal popup.
$output = ctools_modal_form_wrapper('generate_invitation_code_form', $form_state);
// If the form has been submitted, there may be additional instructions
// such as dismissing the modal popup.
if (!empty($form_state['ajax_commands'])) {
$output = $form_state['ajax_commands'];
}
// Return the ajax instructions to the browser via ajax_render().
print ajax_render($output);
drupal_exit();
}
else {
return drupal_get_form('generate_invitation_code_form');
}
}
3.定义弹窗中的form--'generate_invitation_code_form'
function generate_invitation_code_form($form, $form_state){
$form = array('#prefix' => '<div id="generate-invitation-code-form-wrapper">', '#suffix'=> '</div>');
$form['invitee'] = array(
'#prefix' => '<div id="invitee-info">',
'#suffix' => '</div>'
);
$form['invitee']['real_name'] = array(
'#type' => 'textfield',
'#title' => '姓名',
'#element_validate' => array('element_validate_realname'),
'#required' => true,
);
$form['invitee']['email'] = array(
'#type' => 'textfield',
'#title' => '邮箱',
'#required' => true,
'#element_validate' => array('element_validate_email_address'),
);
$form['invitee']['send'] = array(
'#type' => 'submit',
'#name' => 'send',
'#ajax' => array(
'callback' => 'generate_invitation_code_form_ajax_send',
'event' => 'click',
'wrapper' => 'generate-invitation-code-form-wrapper',
'progress' => array('type' => 'throbber', 'message' => '请稍候...'),
'method' => 'html',
'effect' => 'fade',
),
'#value' => '发送邀请',
);
return $form;
}
4.定义提交后的ajax函数--generate_invitation_code_form_ajax_send()
/*
* ajax to send the reg code
*/
function generate_invitation_code_form_ajax_send($form, &$form_state){
if($errors = form_get_errors()) {
foreach($errors as $field => $error) {
$selector = '#edit-'. str_replace('_', '-', $field) .'-error';
$form_state['ajax_commands'][] = ajax_command_invoke($selector, 'html', array($error));
}
drupal_get_messages();//clear messages
}else{
global $user;
$updated_nbr = db_query('SELECT quota FROM {member_invitation_quota} WHERE uid = :uid', array(':uid' => $user->uid))->fetchField();
$form_state['ajax_commands'][] = ajax_command_invoke('#quota-nbr', 'html', array($updated_nbr));
$form_state['ajax_commands'][] = ajax_command_invoke('#modal-title', 'html', array('系统提示'));
$form_state['ajax_commands'][] = ajax_command_html('#generate-invitation-code-form-wrapper', theme('status_messages'));
}
$page = array('#type' => 'ajax', '#commands' => $form_state['ajax_commands']);
ajax_deliver($page);
drupal_exit();
}
5.效果如图