我在Drupal中有一个表单,它调用Netezza中的外部数据库。从Netezza检索此数据持续约10秒。然后,基于这些信息,我必须构建一个选择控件,让用户从类别列表中进行选择。当用户选择一个类别时,我会再次调用Netezza来检索更多信息。
问题是,对于第二次交互(当用户选择一个类别时),表单会被重新处理,因此会对Netezza进行两次昂贵的调用,而不是像任何人所期望或期望的那样。
你知道这种情况的解决方法吗?有没有一种方法可以在不重建整个表单的情况下使用DrupalAjax框架进行ajax调用?
谢谢。
PD:阅读关于Ajax框架的文档,我想解决方案可能使用另一个指定#Ajax[路径]的路径,但尚未完全测试该行为,如果您分享您的经验,我们将不胜感激。
PD2:我更喜欢基于DrupalAjax框架的解决方案,而不是缓存机制。
我强烈建议您了解Drupal示例,特别是名为ajax_example的模块。
这是一个快速的示例代码,可能没有运行,但只是为了给你的想法
function expensive_form($form, &$form_state) {
$form['category'] = array(
'#title' => t('Cateogry'),
'#type' => 'select',
'#options' => first_expensive_operation(),
'#ajax' => array(
'callback' => 'choose_category_callback',
'wrapper' => 'ajax-div',
// 'method' defaults to replaceWith, but valid values also include
// append, prepend, before and after.
// 'method' => 'replaceWith',
// 'effect' defaults to none. Other valid values are 'fade' and 'slide'.
'effect' => 'slide',
// 'speed' defaults to 'slow'. You can also use 'fast'
// or a number of milliseconds for the animation to last.
// 'speed' => 'slow',
),
);
$form['ajax_fieldset'] = array(
'#title' => t("Ajax Fields"),
// The prefix/suffix provide the div that we're replacing, named by
// #ajax['wrapper'] above.
'#prefix' => '<div id="ajax-div">',
'#suffix' => '</div>',
'#type' => 'fieldset',
'#description' => t('This is where we get automatically updated something'),
);
// this will only be executed on the second run of the form
// when the category is set.
if (isset($form_state['values']['category'])) {
$form['ajax_fieldset']['something'] = array(
'#title' => t('Somethings'),
'#type' => 'select',
'#options' => second_expensive_operation($form_state['values']['category']),
);
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
/**
* Callback element needs only select the portion of the form to be updated.
* Since #ajax['callback'] return can be HTML or a renderable
* array, we can just return a piece of the form.
*/
function choose_category_callback($form, $form_state) {
return $form['ajax_fieldset'];
}