Drupal → Как с помощью AJAX обновить ВСЮ форму

06.04.2012

Drupal 8

class ExampleForm extends FormBase {
  ...

  /**
   * Form builder.
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['#id'] = 'example-form';

    $form['refresh_button'] = [
      ...
      '#ajax' => [
        'callback' => '::ajaxUpdateForm',
        'wrapper' => 'example-form',
      ],
    ];

    return $form;
  }

  /**
   * Ajax update all form.
   */
  public function ajaxUpdateForm(array $form, FormStateInterface $form_state) {
    return $form;
  }
}

Drupal 7

/**
 * Form builder
 */
function mymodule_test_form() {
  // ...

  $form['#prefix'] = '<div id="test-form-wrapper">';
  $form['#suffix'] = '</div>';

  $form['refresh_button'] = array(
    '#type' => 'button',
    '#value' => 'Refresh',
    '#ajax' => array(
      'callback' => 'mymodule_test_form_refresh',
      'wrapper' => 'test-form-wrapper',
    ),
  );

  return $form;
}

/**
 * Ajax callback
 */
function mymodule_test_form_refresh($form, $form_state) {
  return $form;
}
Написанное актуально для
Drupal 7, Drupal 8
Похожие записи

Комментарии

/**
 * Ajax callback
 */
function mymodule_test_form_refresh($form, $form_state) {
  // для избежания дублирования врапера после обновления формы
  unset($form['#prefix'],$form['#suffix']); 
  return $form;
}
Гость
01.07.2012, 22:45

A как с помощью ajax сделать автосабмит для формы?

Смотря что такое автосабмит, если зависимые селекты, то там уже есть событие change.

Если текстовые поля, то достаточно навесить ajax обработчик на событие "blur"

Гость
13.08.2012, 18:47

Спасибо за Вашу статьи очень помогает.
Вопрос: КАК обновить всю страницу по изменению значения textfield в форме?

Гость
17.09.2012, 22:03

Имеем функцию, выводящую форму в блоке:

function mymodule_block_view($delta) {
......
	$return['content'] .= drupal_render(drupal_get_form('mymodule_test_form'));    
      return   $return;
  }

и, собственно, форму с автосабмитом:

function mymodule_test_form($form, &$form_submit) {
  $form['sort-box'] = array(
    '#title' => t('Sort by'),
    '#type' => 'select',
    '#options' => array('' => t('Default'), 'pr_low' => t('Price: lowest'), 'pr_high' => t('Price: higest'), 'title_a_z' => t('Title: A-Z'), 'title_z_a' => t('Title: Z-A')),
    '#default_value' => '',
    '#attributes' => array('class' => array('sort-crit'), 'onchange' => 'this.form.submit()'),
  );
  return $form;
}

резульаты выбора опций из формы переопределяют вывод зависимых значени вьюхи посредством функции:

function mymodule_views_query_alter( &$view, &$query ) {
...
}

Пытаюсь прикрутить к данной форме AJAX:

function mymodule_test_form($form, &$form_submit) {
  $form['sort-box'] = array(
    '#title' => t('Sort by'),
    '#type' => 'select',
    '#options' => array('' => t('Default'), 'pr_low' => t('Price: lowest'), 'pr_high' => t('Price: higest'), 'title_a_z' => t('Title: A-Z'), 'title_z_a' => t('Title: Z-A')),
    '#default_value' => '',
    '#attributes' => array('class' => array('sort-crit'),),
    '#ajax' => array(
      'callback' => 'mymodule_views_query_alter',
      'event' => 'change',
    ),
  );
  return $form;
}

Визуально наблюдаю крутящийся кружок работы AJAX, но результаты формы не меняются...

Подскажите, что не так, ибо с автосабмитом форма работает отлично, но только после перезагрузки страницы соответственно?!

ajax callback должен возвращать набор команд или часть формы

Гость
17.09.2012, 22:32

Пробовал ставить методом "научного" тыка 'callback' => 'mymodule_test_form' и 'callback' => 'mymodule_block_view' ... более вроде нет зависимых от результатов выбранных в форме опций функций, однако форма никак не хочет работать также как с простейшим автосабмитом на javascript (this.form.submit()).
Может поделитесь хотябы ссылкой где копать в данном направлении, ведь задача вроде бы банальная, но что-то сути я не улавливаю..

Гость
18.09.2012, 03:05

Спасибо за ссылку, почитал, проработал примеры, понял что callback вызывает специально созданную дополнительную функцию, которая с помощью return возвращает результат, будь то та же форма или что-то другое, причем выбранную опцию можно получить по $_POST, и этот результат вставляется в место указанное wrapper.
Но, к сожалению, так и не понял как это связать с моим views_query_alter...
Видно не судьба.

Alex Milkovsky
06.11.2012, 02:37

Привет,
если нужно во время клика на кнопку button удалить элемент с формы и одновременно удалить запись с базы, то обработку и запрос db_delete тоже в теле формы mymodule_test_form() писать? Может я не правильно что то понял, почитал как было описано тут http://xandeadx.ru/blog/drupal/387

Роман
19.08.2014, 08:52

Добрый день.

При обновлении формы заметил одну неприятную вещь.

А именно, если есть форма с тремя элементами SELECT (например, список стран, список регионов по данной стране и список населенных пунктов по данному региону) и при обновлении первого элемента (выборе новой страны) должен автоматически обновляться и устанавливаться в значение по умолчанию список регионов и список населенных пунктов.

В общем, списки обновляются, значения по умолчанию правильно вычисляются, но почему-то не устанавливаются. Пытаюсь устанавливать значения с помощью #default_value.

Вы не знаете, в чем могут быть проблемы ?

Василий Лукасевич
09.02.2020, 12:56

Для Drupal 8 разве не нужно ещё $form_state->setRebuild(); ?

Добавить комментарий