знайте, чи ви перебудовуєте всю форму або лише її частину і оберніть форму відповідно елементом div, який має атрибут ID, який ви будете використовувати у визначенні #ajax на запускаючому елементі як "обгортка". Використовуйте для цього атрибути #prefix та #suffix ( $form['#prefix'] = '<div id="myform-ajax-wrapper">'; $form['#suffix'] = '</div>';
). Також майте на увазі, що якщо у вас є власний шаблон для вашої форми, щоб НЕ відображати префікс і суфікс у цьому випадку ( {{ form|without('#prefix', '#suffix') }}
), інакше вони будуть виведені двічі - за вашим шаблоном, а також за допомогою обгортки теми форми. Ви не можете запобігти цьому, встановивши #theme_wrappers на порожній масив, оскільки шаблон форми містить фактичний елемент html форми.
у вашому обробці програм для надсилання Ajax поверніть всю форму або частину її, яку ви обгорнули та хочете відновити ( return $form
або return $form['myelement']
). Ви можете додатково використовувати команди ajax замість того, щоб просто повертати структуру форми, але це більш досконалі речі.
зберігайте кожне значення у сховищі стану форми, поки ви не подасте форму. Зробіть це в обробці подання ( $form_state->set('somevalue', $form_state->getValue('somevalue'))
) і завжди дзвоніть, $form_state->setRebuild()
якщо ви не виконуєте остаточного подання форми. Я вважаю за краще мати спеціально оброблені файли подачі, але мати більше логіки в основній обробці подачі теж добре.
завжди використовуйте #name
атрибут на кнопці, яка робить подання, і якщо у вас є лише одна форма, обробник подачі використовує, $for_state->getTriggeringElement()['#name']
щоб виявити, який елемент подав форму.
якщо ви використовуєте 'тригер_as' у визначенні #ajax, якщо ви хочете, наприклад, надіслати форму з елементом select, завжди використовуйте те саме визначення #ajax, як і ви. На мій досвід, це потрібно - хоча це не зазначено в документації.
використання #limit_validation_errors
може бути дуже складним іноді, і з'ясувати, чому форма не працює, може зайняти досить багато часу, тому використовуйте її обережно (це добре для виокремлення помилок форми лише на тих елементах, які ви насправді перебудовуєте, щоб ваш код не впливає на інші частини форми).
завжди використовуйте кнопки, щоб подати форму, і якщо ви хочете мати щось фантазійне, наприклад, вибравши як запускаючий елемент, скористайтеся опцією 'спуску_as' конфігурації #ajax та прихойте реальну кнопку з класом 'js-hid' для хорошого інтерфейсу.
у визначенні форми отримайте значення за замовчуванням зі сховища стану форми, якщо вони існують, або призначте їх у сховище, якщо вони відсутні. Інакше форма не працює належним чином.
не використовуйте $ this чи щось інше, до чого у вас немає доступу зовні, інакше це зламає аякс. завжди використовуйте статичні обробники ajax.
нарешті, надіславши форму, залежно від того, що у вас (немає) спеціального обробника форми подання для ajax, вимкніть перебудову форми за допомогою виклику $form_state->setRebuild(FALSE)
.
ви можете використовувати :: скорочені дзвінки в елементі подання ( $element['#ajax']['callback'] = '::ajaxFormRebuild';
і $element['#submit'] = [['::ajaxFormSubmitHandler'];
) ajax .
зворотний виклик ajax суто для повернення відновленої форми або команд ajax. Ніколи не повертайте змінену форму (тобто не змінюйте масив форм у цьому зворотному дзвінку).