Как сбросить состояние $form при вызове ajax, чтобы получить реальную ценность при отправке?


Я видел какой-то пост об этом, но у меня все еще нет реального ответа.

В моей форме пользователь может выбрать адрес регистрации в поле выбора. Когда он выбирает адрес, ajax устанавливает значение в некоторых других полях:

enter image description here

Код:

  if($form_state->getTriggeringElement()['#name']=="mes_adresses")
  {
      $listAdresse = $this->adresse_service->getUserAdresseById($form_state->getValue('mes_adresses'));

  }


  $form['containerGeneral']['livraison']['adresseComplete']['nom_livraison'] = array(
      '#title' => 'Nom de livraison',
      '#type' => 'textfield',
      '#value' => $listAdresse['nom'],
  );

  $form['containerGeneral']['livraison']['adresseComplete']['prenom_livraison'] = array(
      '#title' => 'Prénom de livraison',
      '#type' => 'textfield',
      '#value' => $listAdresse['prenom'],
  );



  $form['containerGeneral']['livraison']['adresseComplete']['pays_livraison'] = array(
      '#title' => 'Pays de livraison',
      '#type' => 'select',
      '#required'=>true,
      '#options'=>$this->taxonomy_service->getTermsByVid('pays_livraison'),      
      '#value' => $listAdresse['pays'],
  );

  $form['containerGeneral']['livraison']['adresseComplete']['adresse_livraison'] = array(
      '#title' => 'Adresse de livraison',
      '#type' => 'textfield',
      '#value' =>  $listAdresse['adresse'],
  );

  $form['containerGeneral']['livraison']['adresseComplete']['adresse2_livraison'] = array(
      '#title' => 'Adresse de livraison',
      '#type' => 'textfield',
      '#value' =>$listAdresse['adresse2'],
  );

  $form['containerGeneral']['livraison']['adresseComplete']['cp_livraison'] = array(
      '#title' => 'Code postal de livraison',
      '#maxlength'=>5,
      '#type' => 'textfield',
      '#value' => $listAdresse['code_postal'],
  );

  $form['containerGeneral']['livraison']['adresseComplete']['ville_livraison'] = array(
      '#title' => 'Ville de livraison',
      '#type' => 'textfield',
      '#value' =>$listAdresse['ville'],
  );

И обратный вызов:

public function ajaxChangeAdresseCallback(array &$form, FormStateInterface $form_state)
{

    $form_state->setRebuild(TRUE);
    return  $form['containerGeneral']['livraison']['adresseComplete'];

}

Итак, есть 2 вещи:

# ценность

Если вы зададите такое значение, пользователь может никогда не меняйте значение, потому что

$form_state->getValue()

Сохраню значение, установленное ajax.

# значение по умолчанию

Если вы зададите такое значение, это не сработает, потому что параметр #default_value используется только при первой загрузке формы.

Основная проблема связана с $form_state.

Если вы кинете при отправке формы $form_state->GetValue() и $_POST, $_POST хорош, но не $form_state.

Но проблема вы также находитесь в функции проверки, если пользователь выберет опцию новый адрес, ajax перезагрузит форму, везде установит пустую, и при отправке функция проверки сообщит вам, что у вас пустое значение.

Я знаю, что на D7 некоторые люди сбрасывают значения $form_state['];

Но на D8?

Итак, как сбросить значение $form_state?

Author: Kevin, 2018-09-03

1 answers

Благодарим @4k4 за решение, опубликованное здесь:

Как изменить значение поля по умолчанию с помощью AJAX?

Для моей проблемы вот как я добавляю эту функцию:

$form['containerGeneral']['livraison']['adresseComplete'] = array(
          '#type' => 'container',
          '#prefix'=>'  <div id="adresseComplete">',
          '#suffix'=>'</div>'
      );

      $form['containerGeneral']['livraison']['adresseComplete']['nom_livraison']['#tree']=true;
      $form['containerGeneral']['livraison']['adresseComplete']['prenom_livraison']['#tree']=true;
      $form['containerGeneral']['livraison']['adresseComplete']['pays_livraison']['#tree']=true;
      $form['containerGeneral']['livraison']['adresseComplete']['adresse_livraison']['#tree']=true;
      $form['containerGeneral']['livraison']['adresseComplete']['adresse2_livraison']['#tree']=true;
      $form['containerGeneral']['livraison']['adresseComplete']['cp_livraison']['#tree']=true;
      $form['containerGeneral']['livraison']['adresseComplete']['ville_livraison']['#tree']=true;

      if($form_state->getTriggeringElement()['#name']=="mes_adresses")
      {

          $_SESSION['compteur']++;

          $listAdresse = $this->adresse_service->getUserAdresseById($form_state->getValue('mes_adresses'));

          $key = $_SESSION['compteur'];


      }


      $form['containerGeneral']['livraison']['adresseComplete']['nom_livraison'][$key] = array(
          '#title' => 'Nom de livraison',
          '#type' => 'textfield',
          '#required'=>true,
          '#placeholder' => 'Nom',
          '#default_value' => $listAdresse['nom'],
      );

      $form['containerGeneral']['livraison']['adresseComplete']['prenom_livraison'][$key] = array(
          '#title' => 'Prénom de livraison',
          '#type' => 'textfield',
          '#required'=>true,
          '#default_value' => $listAdresse['prenom'],
      );



      $form['containerGeneral']['livraison']['adresseComplete']['pays_livraison'][$key] = array(
          '#title' => 'Pays de livraison',
          '#type' => 'select',
          '#options'=>$this->taxonomy_service->getTermsByVid('pays_livraison'),
          '#default_value' =>  $listAdresse['pays_livraison'],
      );

      $form['containerGeneral']['livraison']['adresseComplete']['adresse_livraison'][$key] = array(
          '#title' => 'Adresse de livraison',
          '#type' => 'textfield',
          '#required'=>true,
          '#placeholder' => 'Adresse de livraison',
          '#default_value' =>  $listAdresse['adresse'],
      );

      $form['containerGeneral']['livraison']['adresseComplete']['adresse2_livraison'][$key] = array(
          '#title' => 'Adresse de livraison',
          '#type' => 'textfield',
          '#default_value' =>$listAdresse['adresse2'],
      );

      $form['containerGeneral']['livraison']['adresseComplete']['cp_livraison'][$key] = array(
          '#title' => 'Code postal de livraison',
          '#maxlength'=>5,
          '#type' => 'textfield',
          '#placeholder' => 'Code postal de livraison',
          '#default_value' => $listAdresse['code_postal'],

      );

      $form['containerGeneral']['livraison']['adresseComplete']['ville_livraison'][$key] = array(
          '#title' => 'Ville de livraison',
          '#type' => 'textfield',
          '#placeholder' => 'Ville de livraison',
          '#default_value' =>$listAdresse['ville'],
      );

Не забудьте установить значение $_SESSION['compteur'] равным 0 при отправке и установить его равным 0 при загрузке формы.

 0
Author: Kevin, 2018-09-03 14:35:45