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

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

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

В ajax callback можно возвращать не только отдельные элементы, но и всю форму:

/**
 * 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
Похожие записи

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

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

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

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

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

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

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

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 должен возвращать набор команд или часть формы

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

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

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

Добрый день.

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

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

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

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

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

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

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