it-swarm.com.de

Ändern Sie den Wert im Validierungsformular, wenn ich einen Block erstelle oder bearbeite

Ich muss bei der Formularüberprüfung einen Wert in Element ändern.

Ich habe diesen 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';
  }
}

Ich möchte den Wert des Feldes field_test ändern. Dieses Feld ist Klartext.

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

Aber als ich diesen Block gespeichert habe, ändert das Feld field_test seinen Wert nicht.

Was mache ich falsch?

4
rpayanm

Bitte fügen Sie die validate-Methode in die Funktion #element_validate ein und ändern Sie dann den Elementwert.

/**
 * 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

Verwenden Sie die Funktion setValue, um den Textfeldwert zu ändern.

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

Ihr Code sollte laut den Dokumenten für setValueForElement () funktionieren. Ich konnte es auch nicht so zum Laufen bringen.

Es gibt das, was letztendlich funktioniert hat:

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

Wenn das Feld andere Attribute enthält, z. B. einen Formatnamen für ein Rich-Text-Feld, müssen Sie möglicherweise auch die folgenden Attribute hinzufügen:

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

Etwas anderes, das helfen könnte. In hook_alter verbirgt mein Code das Feld, dessen Wert berechnet wird. Das Feld benötigt jedoch einen Wert, um Drupal happy:

// 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