it-swarm.com.de

Verwenden von form_set_value () in Drupal 7

Ich versuche, einen Wert während der Validierungsphase eines Knotenformulars zu aktualisieren, d. H. Wenn der benutzerdefinierte Validierungsfehler ausgelöst wird, leeren Sie einfach eines der Felder.

in den letzten 30 Stunden versuche ich, die drupal api) zu verstehen, aber ich gebe auf. Ich verstehe einfach nicht, was die verschiedenen Werte bedeuten.

die Funktion lautet: form_set_value ($ element, $ value, & $ form_state)

jetzt verstehe ich, dass der letzte Wert einfach der $ form_state ist, den ich durch die Validierungsfunktion habe. aber was ist mit $ element und $ value?

Ich habe viel versucht und anscheinend befindet sich der gewünschte Wert in $ form ['Feldname'] ['und'] [0] ['Wert'] ['# Wert'] und nur dort.

aber wenn ich form_set_value ($ form ['field_name'] ['und'] [0] ['value'] ['# value'], 'foo', $ form_state) versuche, wird es ausgelöst

    Recoverable fatal error: Argument 2 passed to drupal_array_set_nested_value() must be an array, string given, called in /includes/form.inc on line 2436 and defined in drupal_array_set_nested_value()

und wenn ich es versuche:

    $newvalue = $form['field_name']['und'][0]['value'];
    $newvalue['#value']='foo';
    form_set_value($form['field_name']['und'][0]['value'],$newvalue,$form_state);

es steigt:

    Warning: mb_strlen() expects parameter 1 to be string, array given in drupal_strlen()

Vielen Dank für jede Hilfe!

[BEARBEITEN]

Meine komplette Funktion ist:

    function hook_node_validate($node,$form,&$form_state) {
      if(fancy_stuff){
        form_set_value();
        form_set_error();
      } 
    }

[EDIT2]

    //calls when node is being created
    function eventcheck_node_validate($node,$form,&$form_state) {
      //checks if the node type is applicable
      if($node -> type=='article') {
        //checks if field 'field_event_choose' AND either 'field_event_title' 
        //or 'field_event' is supplied, if so, fire form_set_value() and form_set_error()
        if ((array_key_exists('endpoints',$node -> field_event_choose['und'][0])) && 
        (($node -> field_event_title['und'][0]['value']<>'') || (isset($node -> 
        field_event['und'][0]['value'])))) {

          //fire away
          $form_set_value(???);
          $form_set_error('event_checker_group',t('sorry blabla'));

        }
      }
    }

Ich hoffe das hilft.

4
alex

Nach vielem Debuggen habe ich es endlich geschafft, dass dies funktioniert. Der Trick liegt in $form['complete form']. Aber als erstes, wie funktioniert form_set_value() und was macht es?

Die Funktion form_set_value()

Wie aus der Dokumentation hervorgeht:

Wenn Sie den Wert von $form['elem1']['elem2'] aktualisieren möchten, der in $form_state['values']['elem1']['elem2'] gespeichert werden soll, setzen Sie $element['#parents'] = array('elem1','elem2').

Was bedeutet das nun? In meinem Fall hatte ich ein Textfeld namens 'field_event_title', den ich bei der Erstellung angegeben habe. In $form haben alle Felder ein Unterarray in $form['field_name'], in meinem Fall $form['field_event_title']. Hier wird auch der übermittelte Wert gespeichert. Da es sich um ein Textfeld handelt, behält Drupal sowohl die Sprache als auch das Delta [Frage für Redakteure: Ist das richtig?] Der Eingabedaten bei. Der Wert wird also tatsächlich nicht in $form['field_name']['value'] gespeichert, aber in $form['field_name']['und'][0]['value'] (['und']=language; [0]=delta). Beachten Sie, dass "und" der Schlüssel ist Drupal Schlüssel für die Standardsprache der Site; wenn es in Deutsch ist, dann wäre es "de"; jedoch in In den meisten Fällen sollte es "und" sein.

Um den Wert tatsächlich mit form_set_value() zu ändern, muss man die Funktion durch Schreiben aufrufen:

form_set_value($form['field_name'], array('und' => array(0 => array('value' => 'foo'))), $form_state);

Aktualisieren eines Formulars, um es mit anderen als den übermittelten Werten wieder aufzufüllen (oder zu löschen)

Bisher schlug Krister Andersson dies vor, aber das funktionierte in meinem Fall nicht, da ich Felder löschen wollte, sobald ein benutzerdefinierter Validierungsfehler aufgerufen wurde. Man würde vermuten, dass sich das Formular unter Verwendung der Werte in $form_state['values'] neu füllt (dies ist tatsächlich der Ort, an dem die Werte gespeichert werden, der tatsächliche Ort, der bei Verwendung von form_set_value() aktualisiert wird, und der Ort, an dem der $form später generiert wird). Dies ist jedoch nicht der Fall: Es werden die Werte in $form_state['complete form'] verwendet, bei denen es sich um eine 'Kopie' von $form handelt (beachten Sie, dass es sich um 'vollständige Form' mit einem Leerzeichen und keinem Unterstrich handelt).

Durch die Verwendung von $form_state['complete form']['field_name']['und'][0]['value']['#value'] = 'foo'; werden die Werte aktualisiert, die das Formular bei einem Validierungsfehler tatsächlich neu füllen. (Hinweis: Sie können es wie ich in meinem Anwendungsfall auf =NULL setzen, um das Feld einfach zu leeren.)

Zusammenfassung

Wo liegt der Unterschied zwischen $form['field_name'] (z. B. Aktualisierung über form_set_value()) und $form['complete form']? Nun, der erstere aktualisiert den tatsächlichen Wert, der dann in der Datenbank gespeichert wird. Letzteres wird verwendet, um ein Formular neu zu füllen, wenn eine Validierung fehlgeschlagen ist.

11
alex

Ich habe es geschafft, es zum Laufen zu bringen:

// hook_form_alter, check so it's the correct form and attach a validate function
function sample_form_alter(&$form,&$form_state,$form_id) {
  if ($form_id == "sample_dummy_node_form") {
    $form['#submit']['#validate'] = 'sample_dummy_node_form_validate';
  }
}

// validate function, wich just sets the `title` field to `tjoohooo` using `form_set_value`
function sample_dummy_node_form_validate($form, &$form_state) {
  $form['title']['#parents'] = array('title');
  form_set_value($form['title'],t('tjoohooo'), $form_state);
}

Wenn Sie dies noch nicht getan haben, sollten Sie sich die Dokumentation ansehen form_set_value

* EDIT *

In Ihrem Beispiel sollte der Code in Ihrer Validierungsmethode wie folgt lauten:

function hook_node_validate($node,$form,&$form_state) {
  if (fancy_stuff){
    $form['field_name']['#parents'] = array('field_name');
    form_set_value($form['field_name'],t('foo'),$form_state);
  } 
}

Aus der Dokumentation zu den Parametern:

$ element: Das Formularelement, dessen Wert aktualisiert werden soll. In den meisten Fällen können Sie das Element einfach aus dem $ form-Array übergeben, obwohl die einzige tatsächlich verwendete Komponente '#parents' ist. Wenn Sie sich selbst erstellen, setzen Sie $ element ['# parent'] als Array, das den Pfad durch die Schlüssel des Formulararrays zu dem Element angibt, dessen Wert Sie aktualisieren möchten. Wenn Sie beispielsweise den Wert von $ form ['elem1'] ['elem2'] aktualisieren möchten, der in $ form_state ['values'] ['elem1'] ['elem2'] gespeichert werden soll, würden Sie festlegen $ element ['# parent'] = array ('elem1', 'elem2').

1
Cyclonecode