it-swarm.com.de

So entfernen Sie unerwünschte Formularstatuswerte vor der Validierung

Was ist der gute Weg, um ein Formular in Drupal 8) zu validieren?

Ich habe eine Reihe von Feldern, die mit einem positiven numerischen Wert gefüllt werden sollen (und das ist alles, keine anderen Eingabetypen, nur positives int).

public function validateForm(array &$form, FormStateInterface $form_state) {
$values = $form_state->getValues();

foreach ($values as $method => $fee) {
  if ($method != 'Free order') {
    if (!is_numeric($fee) || floatval($fee) < 0) {
      $form_state->setErrorByName($method, t('Value must be a positive integer.'));
    }
  }
}

}}

Das Problem ist, dass bei Verwendung von $form_state->getValues() auch "submit", "form_token", "form_build", "form_id", "op" zurückgegeben wird, was ziemlich langweilig ist, da diese Informationen für die Durchführung der Validierung nicht benötigt werden.

Also habe ich diese vier unerwünschten Werte entfernt mit:

$values = array_splice($values, count($values) - 5, 5);

Aber es ist wirklich ärgerlich, mache ich etwas falsch oder ist es genauso? Weil ich denke, dass diese Werte im Validierungsprozess wirklich nicht notwendig sind.

5
Aporie

Die Klasse FormState hat eine Methode dafür: FormState::cleanValues() . Aus der Beschreibung geht hervor, welche Methode Sie verwenden sollten.

Diese Funktion kann verwendet werden, wenn ein Modul alle übermittelten Formularwerte speichern möchte, indem es sie beispielsweise in einer einzelnen Datenbankspalte serialisiert. In solchen Fällen sollten nicht alle internen Form-API-Werte und alle Form-Schaltflächenelemente enthalten sein. Diese Funktion ermöglicht deren Entfernung, bevor das Modul gespeichert wird. Neben Schaltflächenelementen werden die folgenden internen Werte standardmäßig entfernt.

  • form_id
  • form_token
  • form_build_id
  • op

Sie rufen es einfach auf, bevor Sie die übermittelten Werte erhalten.

public function validateForm(array &$form, FormStateInterface $form_state) {
  $values = $form_state->cleanValues()->getValues();

  foreach ($values as $method => $fee) {
    if ($method != 'Free order') {
      if (!is_numeric($fee) || floatval($fee) < 0) {
        $form_state->setErrorByName($method, t('Value must be a positive integer.'));
      }
    }
  }

Da FormState::cleanValues() das FormState -Objekt zurückgibt, können Sie es einfach in derselben Zeile aufrufen, in der Sie FormState::getValues() aufrufen, um die beiden Aufrufe zu verketten.

Wenn Sie weitere Schlüssel hinzufügen müssen, um sie aus den übermittelten Werten zu entfernen, können Sie FormState::setCleanValueKeys() verwenden. Beachten Sie jedoch Folgendes:

  • Das an die Methode übergebene Array muss auch die Standard-Array-Schlüssel enthalten Drupal würde entfernen
  • Die Methode ändert die Array-Schlüssel, die aus FormState::cleanValues() für jedes Drupal - Formular entfernt werden
8
kiamlaluno