Как сбросить состояние $form при вызове ajax, чтобы получить реальную ценность при отправке?
Я видел какой-то пост об этом, но у меня все еще нет реального ответа.
В моей форме пользователь может выбрать адрес регистрации в поле выбора. Когда он выбирает адрес, ajax устанавливает значение в некоторых других полях:
Код:
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?
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 при загрузке формы.