Программно отправить ajax-форму

Главные вкладки

Аватар пользователя zheka2 zheka2 30 мая 2015 в 15:31

Здравствуйте

Написал форму, в которой есть #radios. Задача была при выборе элемента перестроить форму в соответствии с ним.
Для этого (наверно костыльное решение) создать submit, скрыл его через css, и при изменении radios через js кликаю на submit.
Далее вызывается xxx_form_submit в котором я помимо прочего указывает rebuild = True, а в форме вывожу дополнительные контролы по выбранному элементу.
Но есть проблемка, при таком решении если я дважды быстро кликаю по соседним пунктам то форма перестраивается для первого кликнутого.
Подозреваю что это из-за того что я вручную по кнопке кликаю, но как отправить ajax-форму программно не нашёл.

Спасибо

Комментарии

Аватар пользователя sg85 sg85 30 мая 2015 в 15:52

не в том направлении копаете
https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.h...
его и цепляйте к #radios, над формой сделайте wrapper и в колбеке возвращайте измененную форму, наиболее простым решением будет - добавить в форму сразу все элементы, какие там могут быть, и скрывать/показывать их через #access, иначе сломаете голову/потеряете время.

Аватар пользователя sg85 sg85 30 мая 2015 в 16:22

Есть еще вариант, вывести все сразу, и скрывать/показывать нужное через jQuery, такой вариант, даже более правильный, т.к. не нужно будет перезагружать саму форму

Аватар пользователя zheka2 zheka2 30 мая 2015 в 17:11

Да, так красивее будет, только у меня потом добавятся выборки из базы, так что обращение к серверу потребуется

Сейчас другая проблемка вылезла, при первоначальной загрузке учитывая автозаполнение на клиенте может быть выбран любой пункт. Раньше я это решал программно кликая на submit после загрузки страницы, а сейчас как быть?

Спасибо.

Аватар пользователя zheka2 zheka2 30 мая 2015 в 17:40

На примере:
В #radios формы в качестве значения по умолчанию я указал первый элемент в массиве
Но при загрузке страницы на клиенте браузер текущим элементом сделает 3ий пункт (это можно отключить через attributes('autocomple'=>'off') но думаю есть более правильный вариант).
Событие change при этом не сработает, нужно как то вручную его вызвать чтобы получить актуальную форму

Аватар пользователя serega111 serega111 30 мая 2015 в 18:11

"zheka2" wrote:
Сейчас другая проблемка вылезла, при первоначальной загрузке учитывая автозаполнение на клиенте может быть выбран любой пункт.

Автозаполнения для радиокнопок - никогда не видил. Такое происходит только при переходе назад, когда страница берется из кеша и отображается в том состоянии, в котором была покинута. По крайней мере в хроме так. Но при этом и весь контент, подгруженный по ajax, отображается нормально

Аватар пользователя zheka2 zheka2 30 мая 2015 в 21:00

Точно Smile . В Chrome'е срабатывает, а в Firefox нет. Порядок воспроизведения: загружаю страницу, выделяю какой-нибудь пункт отличный от дефолтового и нажимаю F5. В хроме выбранный пункт сбрасывается в дефолтовый, в firefox остаётся последний выделенный, но форму, как я выше описал, я сгенерировал с учётом дефолтового пункта.
Вот тут аналогичная на сколько я понял проблема http://www.faqssys.info/selected-option-on-drupal-form-not-coming-up-first/
Добавил у себя
$form['#attributes']['autocomplete'] = 'off';
проблема решилась.