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?
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']);
}
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');
}
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!';