J'ai un code de validation:
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
$form_state->setValue('my_variable', $form_state->getValue('my_variable') + 1);
$form_state->setRebuild();
}
Et j'ai précédemment défini my_variable
Sur 1
Si c'est NULL
:
public function buildForm(array $form, FormStateInterface $form_state) {
if($form_state->getValue('my_variable') == NULL){
$form_state->setValue('my_variable', 1);
}
...
J'utilise le rappel ajax pour la soumission du formulaire et la validation fonctionne bien. Après avoir cliqué sur le bouton soumettre, j'affiche my_variable
Et je vois 2
(Avant la soumission, c'est 1
).
Mais lorsque je clique à nouveau sur le bouton d'envoi, je vois à nouveau 2
Au lieu de 3
. De plus, lorsque je recharge la page, les données sont manquantes (il s'agit donc de récupérer la valeur 1
).
Comment faire prévaloir la valeur? Il semble que j'opère sur une copie de $form_state
Au lieu de référence mais je ne peux pas écrire & $ form_state (public function validateForm(array &$form, FormStateInterface &$form_state)
) car cela me donne une erreur (car c'est pas la déclaration correcte de la méthode validateForm).
La valeur dans le $form_state
(en fait tout) est perdu après la fin du processus PHP. Il n'y a donc aucun moyen de conserver votre my_variable
valeur via le $form_state
. Votre meilleure option est de stocker cette valeur dans la session, je suppose.
Exemple:
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
$session = \Drupal::request()->getSession();
$session->set('my_variable', $session->get('my_variable') + 1);
}
public function buildForm(array $form, FormStateInterface $form_state) {
$session = \Drupal::request()->getSession();
if (empty($session->get('my_variable'))) {
$session->set('my_variable', 1);
}
}
Notez que les données sont perdues dès que l'utilisateur efface ses cookies et/ou que les sessions sont invalidées. Si vous avez besoin d'un stockage global permanent (pour tous les utilisateurs), utilisez State API . Pour un stockage permanent par utilisateur, utilisez API de base de données .
S'il s'agit d'une variable personnalisée, vous devez utiliser $form_state->set('property_name', 'value')
(au lieu de "$form_state->setValue(...)
").
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
// Update custom variable (in PHP "null + 1" equals one)
$form_state->set('my_variable', $form_state->get('my_variable') + 1);
// Below is only required when your "buildForm(...)" depends on the variable
$form_state->setRebuild();
}
Juste pour ajouter si vous souhaitez réellement enregistrer une valeur de formulaire. Je fais ce qui suit lors de l'utilisation du formulaire Web, j'imagine qu'il est facilement modifié pour un formulaire habituel.
$form['elements']['form_element']['#default_value'] = 'my_value'