Richtiger Einsatz von $form['#validate']?
am 02.08.2012 - 17:09 Uhr in
Ich habe ein Modul geschrieben mit einem hook_form_alter.
Der konkrete Fall betrifft einen Video-Upload in einem bestimmten Inhaltstyp.
Der Video wird gespeichert und sein Pfad ermittelt.
Mit $form['#validate'][] = 'my_video_validate'; wird eine Funktion aufgerufen, die die Länge des Videos (in Sec.) ermittelt.
Wenn eine bestimmte Länge überschritten wird, wird eine Fehlermeldung mit form_set_error erzeugt, daß die Dauer des Videos zu lang ist.
Soweit ist alles OK, es wird immer noch die Seite node/add/myvideotyp angezeigt, also nicht gespeichert.
Es wird nun der Name der Videodatei und das Entfernen-Button gezeigt.
Ich möchte aber gerne wieder das leere Video-Uploadfeld und den Upload-Button sehen, wie wenn ich das Entfernen-button gedrückt hätte.
D.h. ich müßte in der Validate-Funktion das Drücken des Entfenen-Buttons simulieren.
Wie kann ich das am Besten machen?
- Anmelden oder Registrieren um Kommentare zu schreiben

Wenn Du eine eigene
am 02.08.2012 - 18:22 Uhr
Wenn Du eine eigene validate-Funktion hast bekommt die $form und &$form_state übergeben. $form_state['values'] hat die eingegebenen Werte. Da solltest Du den Wert für das entsprechende Feld löschen.
Beste Grüße
Werner
Hi Werner, ja, sowas
am 07.08.2012 - 15:48 Uhr
Hi Werner,
ja, sowas ähnliches habe ich schon versucht.
Diese Werte stecken in
$form_state['values'] ['field_teilnehmer_video']
und (Array, 1 element)0 (Array, 6 elements)
fid (String, 3 characters ) 117
display (String, 1 characters ) 1
description (String, 0 characters )
upload_button (String, 6 characters ) Upload
remove_button (String, 9 characters ) Entfernen
upload (String, 0 characters )
Was ist da genau der Wert für das entsprechende Feld?
Ich habe schon das ganze Feld gelöscht per
<?phpunset($form_state['values'] ['field_teilnehmer_video'] );
?>
Es steht dann immer noch der Pfad auf dieses Video und der Entfernen-Button statt dem leeren Upload-Feld.
Habe ich die Validierung richtig eingebunden?
Ich habe beim hook_form_alter für das Formularfeld eine VAldidierungsfunktion definiert und die wird aufgerufen.
<?php$form['#validate'][] = 'my_teilnehmer_video_validate';
?>
Hast Du in der
am 07.08.2012 - 16:02 Uhr
Hast Du in der Validation-Routine den Parameter richtig angenommen? Der muß als &$form_state in der Funktionszeile stehen.
Ich würde
$form_state['values'] ['field_teilnehmer_video'] = array();benutzen, aber ich weiß jetzt nicht, was in der Form-Routine benutzt wird beim default_value des Feldes.Beste Grüße
Werner
Jupp, der Parameter ist so
am 07.08.2012 - 17:27 Uhr
Jupp, der Parameter ist so aufgerufen als Referenz (&$form, &$form_state) .
Auch die Zeile
<?php$form_state['values']['field_teilnehmer_video']= array();
?>
interessiert den Programmablauf nicht im Geringsten.
Der Link auf den Video und das Entfernen-Button stehen immer noch da.
Es gibt für dieses Feld keinen Default-Value oder Value.
Der Wert ist fid, also die ID auf das File in der Datenbank.
Wobei die Datei ja noch nicht wirklich physikalisch hochgeladen wurde.
Irgendwas funktioniert da beim File-Upload komplett anders, als ich es von Text- oder select-Feldern her erwarten würde.
Auch spukt da ja noch die Ajax-Funktionalität mit rum, die dafür sorgt, daß bei Klick auf das Entfernen-Button dann wieder das leere Upload-Feld da steht.
Diesen Klick müßte ich simulieren, wie auch immer.
Ich habe schon versucht, einen drupal_goto zu machen, wo einfach die gleiche Seite node/add/teilnehmer-video wieder aufgerufen wird.
Dann wird aber die entsprechende Fehlermeldung nicht angezeigt und der User weiß nicht, warum das Speichern nicht geklappt hat, ist also auch nicht sinnvoll...
Dann würde ich als nächstes
am 07.08.2012 - 18:34 Uhr
Dann würde ich als nächstes im Upload-Module nachsehen, ob es da so etwas wie eine reset-Funktion gibt. Irgenwie macht es das Widget mittels Ajax ja auch.
Beste Grüße
Werner
Ja, eigentlich ist der Klick
am 07.08.2012 - 18:48 Uhr
Ja, eigentlich ist der Klick auf das Entfernen-Button ja sowas wie ein Reset.
Das File wird zwischen Upload und Speichern temporär in das Verzeichnis /sites/default geschoben.
Wenn man nun diesen Reset in Form des Klicks auf Entfernen durchführt, dann wird das File dort wieder rausgelöscht.
Andernfalls -also wenn gar nicht in den Fehler gegangen wird- dann wird die Datei nach dem Speichern in das User-Verzeichnis geschoben, das ich so mit file_path und tokens gewünscht habe.
Dieses Entfernen-Button, das das ganz normale CCK-Filde-Modul (file) liefert, macht also perfekt, was es soll.
Ich weiß nur nicht, wie ich das im Fehlerfall auslösen kann, also den Klick simulieren.
Momentan habe ich die Fehlermeldung so formuliert, daß der User angehalten ist, selbst auf den Entfernen-Button zu klicken.
Aber das ist natürlich noch Bediener-Unfreundlich.
Die Datei einfach löschen via
am 07.08.2012 - 21:02 Uhr
Die Datei einfach löschen via file_delete().
Hi Tobias, Danke, das ist
am 08.08.2012 - 07:46 Uhr
Hi Tobias,
Danke, das ist eine gute Funktion, die ich zum Aufräumen nach weiteren Manipulationen noch brauchen werde.
In dem Fall passiert nun folgendes:
Die Datei ist tatsächlich verschwunden, wenn ich nach form_set_error auch noch file_delete mache.
Der Link auf das File steht aber immer noch da plus der Entfernen-Button statt dem Formularfeld zum Hochladen eines neuen Videos.
Wenn ich auf den Link klicke kommt dann natürlich eine Fehlermeldung File not Found.
Versuch es mal hiermit
am 08.08.2012 - 09:00 Uhr
Versuch es mal hiermit http://api.drupal.org/api/drupal/modules%21system%21system.api.php/funct...