These are chat archives for dru-io/Drupal

29th
Jul 2016
Anatoly
@politsin
Jul 29 2016 09:19

Коллеги, добрый день.
Вопрос по D8 FAPI + AJAX:
Хочу аякс-сабмит, который бы содержал аякс респонс, меняющий хтмл на странице.

1) На фоме висит 2 аякс колбека при смене полей, которые добавляют в новые поля во врапперы.
Тут вроде всё понятно, сделано так, как в модуле examples, всё отлично работает
2) Хочу на сабмит повесить AJAX.
Делаю это так:

    $form['app-create']['actions']['submit'] = [
      '#type' => 'submit',
      '#attributes' => [ 'class' => ['btn', 'btn-success']],
      '#value' => $this->t('Create New App'),
      '#ajax'   => [
        'callback' => '::AjaxSubmit',
        'effect'   => 'fade',
        'progress' => ['type' => 'throbber', 'message' => NULL,]
      ],
    ];

AJAX-функция выглядит так:

public function AjaxSubmit(array &$form, FormStateInterface $form_state) {
    $response = new AjaxResponse();
    $values = $form_state->getValues(); \\ Про эту строчку у меня вопрос
    dsm($values);
    $otvet = 'Ответ';
    $response->addCommand(new HtmlCommand('#edit-app-create .details-wrapper', $otvet));
    return $response;
}

Беда в том, чо $form_state в этой функции отличается от общего $form_state'a.
Он не содеждит добавленные в форму поля
и он не похватывает значения, переданные во время buildForm (напр $form_state->foo='bar')

Подскажите, что я делаю не так?

KarmaBot
@KarmaBot
Jul 29 2016 09:19
Не узнал тебя, @politsin. Богатым будешь :)
Anatoly
@politsin
Jul 29 2016 09:59

Блин, даже если забыть о AjaxResponce $form_state разный :(
В первом случае всё норм с "переданные во время buildForm (напр $form_state->foo='bar')"

    $form['app-create']['checkbox'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Setup Domen'),
      '#ajax'   => [
        'callback' => '::CheckboxCallback',
        'wrapper'  => 'checkbox-wrapper',
        'event'    => 'change',
        'effect'   => 'none',
        'progress' => ['type' => 'throbber', 'message' => NULL,]
      ],
    ];

во втором случае всё плохо с "переданные во время buildForm (напр $form_state->foo='bar')"

    $form['app-create']['actions']['submit'] = [
      '#type' => 'submit',
      '#attributes' => [ 'class' => ['btn', 'btn-success']],
      '#value' => $this->t('Create New App'),
      '#ajax'   => [
        'callback' => '::AjaxSubmit',
        'wrapper'  => 'actions-wrapper',
        'effect'   => 'fade',
        'progress' => ['type' => 'throbber', 'message' => NULL,]
      ],
    ];
KarmaBot
@KarmaBot
Jul 29 2016 09:59
@politsin, чтобы показать длинный листинг кода желательно использовать pastebin-сервис, например gist.github.com или laravel.io/bin.
Anatoly
@politsin
Jul 29 2016 10:10
Оказалось проглема в том, что форму надо ребилдить:
/**
   * Implements a form submit handler.
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $form_state -> setRebuild(true);
  }
Anatoly
@politsin
Jul 29 2016 11:24

Продолжаю общаться с собой по D8 FAPI + AJAX
2016-07-29_14-22-43.png
politsin @politsin Мастер костылей!
Alan Bondarchuk
@fortis
Jul 29 2016 12:34
@politsin $_post надо через sanitize функции пропускать какой нить чекплейн хотя бы
это пользовательские данные
@politsin и вероятно элементы надо добавлять не в аякс колбеке а в конструкторе формы чекать формстейт и добавлять по условию
форма когда ребилдится вызывает конструктор формы
на это и опирайся добавляй там элементы. а не в момент когда уже сабмит нажали - тут уже обработка сабмита только)
Anatoly
@politsin
Jul 29 2016 12:47
@fortis спасибо!
KarmaBot
@KarmaBot
Jul 29 2016 12:47
Спасибо (+1) для @fortis принято! Текущая карма +31.
Anatoly
@politsin
Jul 29 2016 12:49
Элементы добавлял как в форм-экзампле.
Нигде не мог найти как подругому их добавить, везде в качестве примера такой код: делаем враппер, потом в колбеке возвращаем кусок формы.
Alan Bondarchuk
@fortis
Jul 29 2016 13:31
ага именно потому что новый элемент уже создан к этому моменту)
при ребилде