web-dev-qa-db-fra.com

Modifier la valeur sur le formulaire de validation lorsque je crée ou modifie un bloc

J'ai besoin de changer une valeur en élément lors de la validation du formulaire.

J'ai ce code:

/**
 * Implements hook_form_FORM_alter().
 */
function MY_MODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'block_content_MY_BLOCK_form' || $form_id == 'block_content_MY_BLOCK_edit_form') {
    $form['#validate'][] = '_custom_validate';
  }
}

Je veux changer la valeur du champ field_test. Ce champ est en texte brut.

function _custom_validate($form, FormStateInterface $form_state) {
  $form_state->setValueForElement($form['field_test'], 'changed');
}

Mais quand j'ai enregistré ce bloc, le champ field_test ne change pas sa valeur.

Qu'est ce que je fais mal?

4
rpayanm

Veuillez insérer la méthode de validation dans la fonction #element_validate, puis modifiez la valeur de l'élément.

/**
 * Implements hook_form_FORM_alter().
 */
function MY_MODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'block_content_MY_BLOCK_form' ||  $form_id =='block_content_MY_BLOCK_edit_form') {
       $form['field_test']['widget'][0]['#element_validate'][] = '_custom_validate';
      }
    }

function _custom_validate(&$element, FormStateInterface $form_state, &$complete_form) {
  $form_state->setValueForElement($element,['value' => 'See the change']);
}
7
Shreya Shetty

Utilisez la fonction setValue pour modifier la valeur du champ de texte.

function MY_MODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'block_content_MY_BLOCK_form' || $form_id == 'block_content_MY_BLOCK_edit_form') {
    $form['#validate'][] = '_custom_validate';
  }
}

function _custom_validate(&$form, FormStateInterface $form_state) {
  $form_state->setValue('field_test', 'changed');
}
0
amol_shetkar

Votre code semble devoir fonctionner, selon les documents de setValueForElement (). Je ne pouvais pas non plus le faire fonctionner de cette façon.

Il y a finalement ce qui a fonctionné:

$title = t(
  '@user enrolled in @class',
  ['@user' => $userName, '@class' => $classTitle]
);
$formState->setValue('title', [['value'=>(string) $title]]);

Si le champ a d'autres attributs, comme un nom de format pour un champ de texte enrichi, vous devrez peut-être également ajouter les attributs:

$formState->setValue('field_notes', [['value'=>'Dogs are great!', 'format'=>'skilling']]);

Quelque chose d'autre qui pourrait aider. Dans hook_alter, mon code cache le champ qui verra sa valeur calculée. Cependant, le champ a besoin d'une valeur pour garder Drupal heureux:

// Hide the title. Compute it from other elements.
$form['title']['#type'] = 'hidden' ;
// Need to give the field a default value, for Drupal's validation code
// to get to the point where a value for the field can be computed. 
$form['title']['widget'][0]['value']['#default_value'] = 'Dogs are the best!';
0
Kieran Mathieson