Рейтинг:0

How to add a secondary Ajax submit to a regular node form?

флаг cn

I'm trying to add an Ajax submit to a regular node edit form (Drupal 9). I'm using Field Groups so that there's a series of tabs, and I've added a pair of "buttons" (Right now they're just markup <div>s, but I could change them to real buttons if that's recommended) that users can use to move forward and back through the tabs with some Javascript.

The ask now is that each time the tab focus changes, the form is submitted via Ajax. All the examples I'm finding seem to be doing something other than what I'm after. I've seen examples using completely custom forms, loading forms, and altering fields, but nothing that just adds the ability to submit a a regular node form with Ajax.

Things I've tried:

  • Adding an #ajax subarray of various sorts to the buttons and/or the regular submit element. Nothing Ajaxy at all has happened in any of these experiments
  • Using Javascript to trigger a click event on the submit, without and without an #ajax subarray. All I get is a regular submit with page refresh
  • Bypassing all of that just calling $.post($('#form-id').attr('action'), $('#form-id').serialize()). There's some semblance of Ajax submit going on as my custom hook_form_alter gets hit, but the node isn't saved/updated. I think that's failing because there's no proper submit/op value associated with it, and I haven't been able to figure out how to add/set it.

Can someone point me in the right direction?

Рейтинг:1
флаг cn

Первый пункт — единственный прямой путь. Обычная форма редактирования узла уже содержит элементы формы Ajax. Вы можете проверить подмассив "ajax" drupal-настройки-json доставлено в браузер.

Здесь вы также должны увидеть свой собственный обратный вызов Ajax:

  "аякс": {
    "редактировать-поле-статьи-добавить-больше": {
      "перезвонить": [
        "Drupal\Core\Field\Plugin\Field\FieldWidget\EntityReferenceAutocompleteWidget",
        "добавить ещеAjax"
      ],
      "wrapper": "поле-статья-добавить-больше-обертка",
      "эффект": "исчезновение",
      "событие": "mousedown",
      "нажатие клавиши": правда,
      "предотвратить": "щелкнуть",
      "url": "\/узел\/123\/edit?destination=\/admin\/content\u0026ajax_form=1",
      "диалогтип": "аякс",
      "представить": {
        "_triggering_element_name": "field_article_add_more",
        "_triggering_element_value": "Добавить еще один элемент"
      }
    },
    "edit-field-paragraph-add-more-add-more-button-text": {
      "перезвонить": [
        "Drupal\paragraphs\Plugin\Field\FieldWidget\InlineParagraphsWidget",
        "добавить ещеAjax"
      ],
      ...

Если нет, то вам придется отлаживать PHP на стороне сервера. Если да, то клиентский Javascript.

beltouche avatar
флаг cn
В исходном коде страницы есть тег script с data-drupal-selector="drupal-settings-json". Браузер только что упорно кэшировал эксперимент, в котором я пытался добавить подмассив #ajax к произвольному элементу. В противном случае нет никаких доказательств того, что какой-либо ajax связан с формой узла ни там, ни при анализе массива $form с xdebug в моем файле hook_form_alter.
beltouche avatar
флаг cn
Теперь у меня четыре вопроса: 1) Правильно ли я смотрю? 2) Мне просто добавить подмассив #ajax к обычной кнопке отправки? 3) Что такое обратный вызов? Достаточно ли «::submitForm» или мне нужно написать пользовательскую функцию, которая каким-то образом вызывает весь массив функций «#submit»? 4) Как запустить Ajax вместо обычной отправки?
4uk4 avatar
флаг cn
Как уже было сказано, точка 1 (#ajax) — правильное место. Добавьте виджет автозаполнения ссылки на объект в форму узла, и вы увидите кнопку ajax add more из вывода json выше.
beltouche avatar
флаг cn
Я согласен с тем, что пункт № 1 - это путь. «Я смотрю в правильном месте?» имел в виду, где/как я нашел упомянутый вами «drupal-settings-json».

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

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.