2014-08-29 2 views
0

У меня есть форма в Drupal, которая вызывает внешнюю базу данных в Netezza. Получить эти данные от Netezza длится около 10 секунд. Затем, основываясь на этой информации, мне нужно создать элемент управления, чтобы пользователь мог выбирать из списка категорий. Когда пользователь выбирает категорию, я делаю еще один дорогой вызов Netezza для получения дополнительной информации.Drupal Ajax Forms

Проблема заключается в том, что для второго взаимодействия (когда пользователь выбрал категорию) форма перерабатывается и, следовательно, выполняет 2 дорогостоящих вызова в Netezza, а не то, что ожидало бы или желала бы.

Знаете ли вы обходной путь для этой ситуации? Есть ли способ сделать вызов ajax с помощью Drupal Ajax Framework без перестройки всей формы?

Спасибо.

PD: Чтение документации по Ajax Framework Я предполагаю, что решение может использовать другой путь, указывающий #ajax ['path'], но не полностью протестировал это поведение и будет благодарен, если вы поделитесь своим опытом.

PD2: Я бы предпочел обходное решение, основанное на платформе Drupal Ajax Framework, а не в механизме кэширования.

ответ

0

Я бы настоятельно рекомендовал вам взглянуть на Drupal Examples, особенно модуль, называемый 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']; 
}