如何使用Ajax在Lightbox中提交Drupal表单

How to submit Drupal Form in Lightbox with Ajax

本文关键字:提交 Drupal 表单 Lightbox 何使用 Ajax      更新时间:2023-11-23

我有一个表单已成功加载到灯箱中。灯箱显示时没有任何css或javascript。像Date Popup这样的模块在灯箱中不起作用。

我添加到提交按钮的ajax处理程序在lightbox中也不起作用。相反,表单会正常提交,将用户从初始页面带到我为灯箱分配的URL($items['entry/lightbox'])。表单验证也不能仅保存在灯箱中。我可能需要研究一个javascript解决方案。

但是,如果表单是在lightbox之外调用的,那么ajax处理程序可以正确地处理提交按钮。我有一种感觉,所有这些问题都联系在一起,因为js/css没有加载到灯箱中。

我的问题是:Ajax提交按钮无法在lightbox中执行,并阻止用户离开页面。

我的问题是:假设缺少的JS(添加CSS)与问题相关,我如何加载JS&我的表单在灯箱中需要CSS吗?

我的目标:从他们的主页(例如work/###/home),使用户能够打开表单,插入值,验证&将值提交到lightbox中的DB,而不离开其页面。

理想情况下,在不关闭的情况下,我希望drupal消息,如表单验证错误,出现在灯箱中,让用户有机会用他们输入的值更正错误。我更喜欢php验证,但我仍然对jQuery持开放态度。

我的代码:

$items['work/%/home'] = array(
    'title' => 'Admin Home',
    'page callback' => 'fsa_work_page',//Callback not shown below
    'page arguments' => array(0),
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
);
$items['entry/lightbox'] = array( 
    'title' => 'Lightbox Overlay',
    'page callback' => 'fsa_lightbox',
    'page arguments' => array(0),
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
);
function fsa_lightbox(){
    $output = '';       
    $output .= drupal_render(drupal_get_form('fsa_daycare_roster_form'));
    print $output;
}
function fsa_daycare_roster_form(/*args*/){
$form['wrapper'] = array(
    '#markup' => '<div id="fsa_daycare_roster_form">Wrapper Div</div>'
);//I read this could somehow be used to capture drupal msg within the lightbox?
$form['fname'] = array(
    '#type' => 'textfield',
    '#title' => t('First Name'),
    '#prefix' => '<div id="form-left">'
);
$form['dob'] = array(
    '#type' => 'date_popup',
    '#title' => t('Date of Birth'),
    '#date_format' => $format,
    '#date_label_position' => 'none',
    '#date_year_range' => '-25:+0',
    '#required' => TRUE,
    '#suffix' => '</div>',
);
$form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save Entry'),
    '#ajax' => array(
        'callback' => 'fsa_daycare_roster_form_submit',
        'wrapper' => 'fsa_daycare_roster_form',
        'method' => 'replace',
        'effect' => 'fade',
  ),
);
return $form;
function fsa_daycare_roster_form_validate($form_id, &$form_data){
    $fname = $form_data['values']['fname'];
    if(!is_string($fname) || empty($fname)){
    form_set_error('fname', t("Please Enter a valid First Name"));  
    }
        /*more*/
}
}//end form func
function fsa_daycare_roster_form_submit($form_id, &$form_data){
     $insertDaycare = db_insert($dcc_table)
    ->fields(array(
        'child_fname' => $form_data['values']['fname'],
        'dob' => $form_data['values']['child_dob'],
          /*more*/
    ))
    ->execute();
}

任何智慧的话语和示例代码都将不胜感激。根据你的经验,如果你认为我的方法有些无效或低效,请告诉我并提供替代方案。我很欢迎。

谢谢。

我建议使用对话框API而不是lightbox,假设lightbox的意思是"模态"。

这是我的朋友罗杰写的一篇好文章

例如,查看示例模块。

有一个关于使用ajax的具体示例。

对于一个真实世界的例子,我修改了Drupal Commerce的一个添加到购物车按钮,其中包含对话框,您可以在我的github 中查看该对话框