Чи можу я використовувати Ajax для націлювання на декілька елементів форми з одного входу?


8

Я намагаюся використовувати ajax для оновлення двох різних частин форми друпалу лише з однієї розмитості введення форми.

У мене є стандартний матеріал Ajax:

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

Це добре працює, змінюючи свою подію, коли вхід оновлюється ... однак я також хочу оновити інший вхід форми в іншому вигляді з іншим кодом в результаті розмиття мого початкового вводу.

Чи можливо це, якісь ідеї?

Редагувати: Для наочності, ось мій приклад із реального світу:

  • Тип вмісту "фільм"
  • Додано поле 'basic_title'
  • Коли 'basic_title' оновлено, мій зворотний дзвінок ajax перевіряє наявність подібних рядків і повертає html.
  • HTML з зворотного дзвінка вставляється в порожній div.

    Ця частина працює чудово!

Я намагаюся також змінити стандартний вхід 'title' введення вузла, надавши йому значення 'basic_title' після того, як я зробив деякий регекс, щоб виправити рядок (видаляючи "The" або "A" з початку та ін.) Результат будуть два поля заголовка, одне з повним заголовком 'basic_title' і одне обрізане 'title', яке буде корисним для сортування та відображення записів.


Відповіді:


13

Схоже, ви можете націлювати на різні частини форми за допомогою команд ajax, однак ви повинні повернути лише одну з них:

  • HTML або

  • Передавальний масив або

  • Масив команд AJAX

У ситуації, про яку я спочатку писав, я намагався повернути як масив команд AJAX, так і масив, що передається, що не здається можливим.

Код у модулі прикладів демонструє націлювання на різні частини форми за допомогою масиву команд AJAX:

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

У цьому зразку коду #html_div отримує $ текст, а окремо #html_status отримує "Оновлений html_command_example with text = $ text;". дата ('r'). ""

Два різних місця у формі з двома різними відомостями з одного зворотного виклику Ajax!

Переглянувши ще раз те, над чим працював, я зрозумів, що мені взагалі не потрібно повертати поле заголовка вузла. Це буде лише поле утиліти, яке використовується для сортування даних за списками.

Я приховав поле у ​​формі вузла, і воно заповнюється вдруге, коли моя форма побудована, коли спрацьовує мій оригінальний зворотний виклик ajax.


0

Я зовсім новачок у Drupal, але поки що я вважав, що рамки Ajax досить негнучкі. Він чудово працює, якщо ви користуєтесь ним, як було призначено. Тож у вашому випадку, якщо ви знаєте деяких JS, найкращим було б зробити цей сценарій вашим "я", він повинен бути дуже легким.

Удачі!


Дякую за пропозицію :) Я зрозумів, що мені взагалі не потрібно повертати поле заголовка вузла, оскільки воно просто використовується як поле утиліти для організації списків. Він заповнюється, коли моя форма перебудовується в результаті мого існуючого зворотного виклику Ajax.
Рік

0

Ще один варіант з drupal.org :

Ви можете легко замінити всю форму, якщо це найпростіше. Просто додайте #prefix та #suffix до всього масиву форм, а потім встановіть це як #ajax ['обгортка']. (Це дозволить вам змінити декілька елементів форми за допомогою одного виклику ajax.) Єдина причина цього не робити - це процес швидший, якщо передається менше інформації.

Ваш функція зворотного дзвінка може бути такою ж простою, як:

function _callback($form, $form_state) {
  return $form;
}

Це має бути викликано з #ajaxмасиву на елементі форми ( field_whateverнаприклад, наведеному нижче), визначеному в hook_form_FORM_ID_alter()(або якомусь гачку зміни форми), де ви також перевіряєте $form_stateі вносите зміни до $formмасиву, наприклад:

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.