2013-11-21 61 views
0

美好的一天。 我创建自定义表单我的模块中定义的提交按钮这样的:Drupal ajax表单,部分呈现

$form['submit'] = array(
    '#type' => 'submit', 
    '#value' => t('Save'), 
    '#ajax' => array(
     'callback' => 'fmg_addbanner_ajax_callback', 
     'method' => 'replace', 
     'wrapper' => 'banner_add_wrapper' 
    ) 
); 

然后输出我的形式是这样的:

$form = drupal_get_form('fmg_banner_add_form', $region_id); 
print render($form); 

但是Ajax请求不起作用。我想因为没有需要的drupal js文件。我怎么解决这个问题?谢谢。

+0

您可以添加您的完整表单定义和'fmg_addbanner_ajax_callback'的实现,这样我们可以进一步帮助您... –

回答

0

正常情况下,将有#ajax连接到一个共同的输入,像复选框,文本框等

行为是当用户改变输入值,它会通过Ajax火回调和发送整个表单,然后您可以在场景后面处理此表单,并在发送表单并将元素更改为您定义的包装器之前调整某些内容。

我对部分表单呈现的问题之一是当我需要做一些Ajax调用或者在页面的某个区域注入部分表单元素的同时保持表单呈现的完整性。 (我不知道到底是什么形式的构建做了做,我想我也不想知道)

由于形式渲染使用渲染阵列,如果你只是想提取某些元素,你可以只是做

$form = drupal_get_form('application_form'); 
$body = render($form['body']); 

以下是一个真正的例子,我采取了一种形式,并分割成页眉,页脚和其余的表单元素。

// get a form for updating application info. 
$form = drupal_get_form('pgh_awards_review_application_form', $app); 
$elements = array(); 
$form_render = render($form); 
$elements = array(
    'qualify' => render($form['qualify']), 
    'threshold_met' => render($form['threshold_met']), 
    'submit' => render($form['submit']), 
); 
if (preg_match('/<form.+div>/', $form_render, $matches)) { 
    $elements['header'] = $matches[0]; 
} 
if (preg_match('/<input type="hidden".+form>/s', $form_render, $matches)) { 
    $elements['footer'] = $matches[0]; 
} 
$vars['form'] = $elements; 

这绝对不是漂亮的办法,它只是起到此刻的需求。