xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Как с помощью ajax обновить НЕСКОЛЬКО элементов формы

Опубликовано в

Функция, указанная в #ajax['callback'] может возвращать только один элемент формы (не считая дочерних):

/**
 * Form builder.
 */
function test_form($form, $form_state) {
  $form['element1'] = array(
    ...
    '#prefix' = '<div id="element1-wrapper">',
    '#suffix' = '</div>',
  );
 
  $form['element2'] = array(
    ...
    '#prefix' = '<div id="element2-wrapper">',
    '#suffix' = '</div>',
  );
 
  $form['ajax_element'] = array(
    ...
    '#ajax' = array(
      'callback' => 'test_form_ajax_callback',
      'wrapper' => 'element1-wrapper', // либо element2-wrapper, но не два сразу
    ),
  );
 
  return $form;
}
 
/**
 * Ajax callback.
 */
function test_form_ajax_callback($form, $form_state) {
  return $form['element1']; // либо $form['element2'], но не два сразу
}

Можно конечно обернуть оба элемента в fieldset или обычный div, но это не всегда возможно. Поэтому для решения задачи следует отказаться от #ajax['wrapper'], а в #ajax['callback'] возвращать набор команд:

/**
 * Form builder.
 */
function test_form($form, $form_state) {
  $form['element1'] = array(
    ...
    '#prefix' = '<div id="element1-wrapper">',
    '#suffix' = '</div>',
  );
 
  $form['element2'] = array(
    ...
    '#prefix' = '<div id="element2-wrapper">',
    '#suffix' = '</div>',
  );
 
  $form['ajax_element'] = array(
    ...
    '#ajax' = array(
      'callback' => 'test_form_ajax_callback',
    ),
  );
 
  return $form;
}
 
/**
 * Ajax callback.
 */
function test_form_ajax_callback($form, $form_state) {
  $commands[] = ajax_command_insert('#element1-wrapper', drupal_render($form['element1']));
  $commands[] = ajax_command_insert('#element2-wrapper', drupal_render($form['element2']));
  return array(
    '#type' => 'ajax',
    '#commands' => $commands,
  );
}
Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Спасибо за материал. То что нужно.

Этот вариант не учитывает случая, когда форма не прошла валидацию и должна вернуть сообщение об ошибке вместе с элементом

Спасибо!!! Все работает отлично...

Для того что бы вылетало сообщение с ошибкой валидации достаточно добавить следующее:

$commands[] = ajax_command_prepend($selector, theme('status_messages'));

Пытаюсь с помощью ajax обновить select формы, но вылетает ошибка: "Сделан недопустимый выбор. Пожалуйста, обратитесь к администратору сайта."
Понимаю, что в $form['element1']['#options'] - изначально не было такого элемента, поэтому это и вызывает ошибку.
Как можно обновить форму? Чтобы новые опшины были в кеше формы?

Добрый день.
Пытаюсь заменить по предложенной технологии поле checkbox :

  $form['line1']['proverka']['#default_value'] = 1;
  $commands[] = array();
  $commands[] = ajax_command_insert('#proverka-wrapper', drupal_render($form['line1']['proverka']));  
 
  return array(
    '#type' => 'ajax',
    '#commands' => $commands,
  );

Но при этом поле proverka не меняет значение. Здесь line1 - markup.
При этом в случае , если просто указать
$commands[] = ajax_command_insert('#proverka-wrapper', drupal_render($form['proverka']));   , то поле просто стирается .

В форме описано :

  $form['line1'] = array(
    '#type' => 'markup',
    '#theme' => array('inline_fields_bootstrap'),
    '#not_div' => FALSE,
    '#bootstrap_prefix' => 'col-md-',
  );
 
  $form['line1']['proverka'] = array(
    '#type' => 'checkbox',
    '#title' => 'Проверено',
    '#bootstrap_size_this' => 2,    
    '#prefix' => '<div id="proverka-wrapper">',
    '#suffix' => '</div>',
  );

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании