[gelöst] file_save_upload und Fieldsets?
am 29.07.2010 - 00:27 Uhr in
Ich versuche hier gerade krampfhaft, ein Formular mittels der Form API zu erstellen, bei welchem man Dateien hochladen kann.
Der Upload der Dateien soll über 3 Form-Elemente vom Typ "file" geschehen.
Diese 3 Datei-Felder sollen allerdings in ein Fieldset gepackt werden (Damit ich dafür einen ordentlichen Titel und Beschreibung angeben kann und außerdem will ich die Collapse-Möglichkeiten des Fieldsets nutzen).
Weiß irgendjemand, wie man der Funktion file_save_upload verständlich machen kann, die drei Upload-Felder zu berücksichtigen?
Ich habe bisher folgende Möglichkeiten entdeckt:
<?php
//Variante 1:
//Upload-Feld
$form['upload'] = array(
'#type' => 'file',
'#title' => 'Daten-Upload',
'#size' => 50,
);
//file_save_upload
file_save_upload('upload', array(), 'files', FALSE));
//Variante 2:
//Fieldset
$form['test_datei'] = array(
'#type' => 'fieldset',
'#title' => 'Datei-Uploads',
'#description' => "<h2>Hier kannst du Dateien hochladen.</h2>",
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => TRUE,
);
//Upload-Feld
$form['test_datei']['upload'] = array(
'#type' => 'file',
'#title' => 'Daten-Upload',
'#size' => 50,
);
//file_save_upload
file_save_upload('test_datei', array(), 'files', FALSE));
//In einem Fieldset nimmt man also den Namen des Fieldsets.
//Aber in folgendem Fall:
$form['test_datei'] = array(
'#type' => 'fieldset',
'#title' => 'Datei-Uploads',
'#description' => "<h2>Hier kannst du Dateien hochladen.</h2>",
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => TRUE,
);
//Upload-Feld
$form['test_datei']['upload1'] = array(
'#type' => 'file',
'#title' => 'Daten-Upload',
'#size' => 50,
);
$form['test_datei']['upload2'] = array(
'#type' => 'file',
'#title' => 'Daten-Upload',
'#size' => 50,
);
$form['test_datei']['upload3'] = array(
'#type' => 'file',
'#title' => 'Daten-Upload',
'#size' => 50,
);
//Wie genau kann man da die einzelnen Dateien abrufen?
//file_save_upload('test_datei', array(), 'files', FALSE)) gibt nur die letzte hochgeladene Datei aus...
?>Weiß jemand, was man da machen könnte? Es muss doch einen Weg geben, mehrere Dateien aus einem Fieldset hochzuladen, oder?
- Anmelden oder Registrieren um Kommentare zu schreiben

Konkrete Lösung hab ich auch
am 29.07.2010 - 09:50 Uhr
Konkrete Lösung hab ich auch nicht.
Hier wird ein Patch diskutiert für D6.15
wenn ich das auf drupal.org
am 29.07.2010 - 11:07 Uhr
wenn ich das auf drupal.org lese, könnte dies für die 1.Datei funktionieren:
<?phpfile_save_upload('test_datei][upload1', array(), 'files', FALSE))
?>
@sepp68 Das funktioniert eben
am 29.07.2010 - 13:07 Uhr
@sepp68
Das funktioniert eben nur mit dem Patch.
@Luzer
Ich habe leider keinen Shell-Zugriff. Weißt du, wie ich den Patch auch ohne SSH einspielen kann? Und wenn ich das recht verstehe, ist der Patch nach einem Core-Update wieder weg, oder?
Hab mir den Patch jetzt nicht
am 30.07.2010 - 15:34 Uhr
Hab mir den Patch jetzt nicht angesehen aber sofern er die Tests mal irgendwann übersteht wird er in die nächste Version integriert.
FTP Zugang hast du ja. Es gibt ein Programm für Windows zum Patchen und im Handbuch auch eine Doku dazu, irgendwo.
Dann kannst du auf der Workstation patchen und per FTP hochladen.
Benutzt du schon 6.17? Sonst könntest du nochmal checken ob der Patch schon enthalten ist.
Danke für die Info :-) Ja,
am 30.07.2010 - 21:37 Uhr
Danke für die Info :-) Ja, ich benutze die Version 6.17, aber da ist das Problem auf jeden Fall noch vorhanden... Vielleicht bekomme ich für die Zukunft auch noch irgendwann heraus, wie man mit NetBeans einen Patch einspielen kann ;-)
Aber ich habe mich jetzt erstmal gegen den Patch entschieden. Es ist mir zu riskant, auf einer produktiven Seite einen ungetesteten Patch im Drupal-Core einzuspielen.
Stattdessen probiere ich einen anderen Weg:
Ich verzichte komplett auf das Fieldset-Element der Form API und erstelle das Fieldset über ein Markup-Element:
<?php
function test_upload_form($form_state)
{
//Enctype festlegen, um Daten hochladen zu können
$form['#attributes'] = array('enctype' => "multipart/form-data");
//Fieldset für alle Form-Elemente beginnen
$form['start_global_fieldset'] = array('#type' => 'markup', '#value' => '<fieldset class=" collapsible collapsed"> <legend>Datei-Einstellungen</legend>');
$form['text'] = array(
'#type' => 'textfield',
'#title' => 'Hier ist ein Text-Feld.',
'#size' => 60,
'#maxlength' => 128,
'#description' => "Hier kannst du eintragen, was du willst.",
);
//Fieldset für Upload-Felder beginnen
$form['start_upload_fieldset'] = array('#type' => 'markup', '#value' => '<fieldset class=" collapsible collapsed"> <legend>Datei-Anhang</legend>');
$form['upload_1'] = array(
'#type' => 'file',
'#title' => 'Daten-Upload 1',
'#size' => 50,
);
$form['upload_2'] = array(
'#type' => 'file',
'#title' => 'Daten-Upload 2',
'#size' => 50,
);
$form['upload_3'] = array(
'#type' => 'file',
'#title' => 'Daten-Upload 3',
'#size' => 50,
);
//Fieldset für Upload-Felder schließen
$form['end_upload_fieldset'] = array('#type' => 'markup', '#value' => '</fieldset>');
$form['submit'] = array('#type' => 'submit', '#value' => t('Senden'));
//Fieldset für alle Form-Elemente schließen
$form['end_global_fieldset'] = array('#type' => 'markup', '#value' => '</fieldset>');
$form['#validate'][] = 'test_mail_validate';
return $form;
} //function test_upload_form
?>
Damit kann ich meine Upload-Felder in beliebig viele und tiefe Fieldsets unterteilen und kann trotzdem ganz einfach auf alle Felder zugreifen und die Daten mittels file_save_upload speichern.
Und indem ich dem Fieldset die Class " collapsible collapsed" mitgebe, kann ich auch die Collapse-Eigenschaften der Fieldsets nutzen - super :-)
Ist zwar nicht ganz die feine Art, das Fieldset so über das Markup-Element einzufügen, aber ich weiß mir gerade nicht anders zu helfen und kann soweit erstmal keine Nachteile feststellen. Oder übersehe ich da etwas?
Ansonsten scheint mir das eine ganz brauchbare Lösung zu sein. Zumindest besser, als im Drupal-Core ungetestete Patches einzuspielen.
Edit:
Was mir gerade beim herumprobieren aufgefallen ist:
Man kann das ganze Problem auch umgehen, indem man "#tree" für das Fieldset auf FALSE setzt (oder für das Fieldset auf TRUE und nur für die einzelnen Upload-Felder auf FALSE).
Es macht ja so einen riesen Spaß, stundenlang nach einer Lösung zu suchen, langsam zu verzweifeln und dann stößt man auf zwei solch' simple Möglichkeiten -,-'
Eine Frage noch zum
am 31.07.2010 - 09:19 Uhr
Eine Frage noch zum Verständnis:
wenn man "#tree" für das Fieldset auf FALSE setzt dann kann man "FLAT" auf die Upload-Felder zugreifen ?
Puh, bin mir jetzt nicht ganz
am 31.07.2010 - 12:53 Uhr
Puh, bin mir jetzt nicht ganz sicher, was du mit "Flat" meinst.
Aber so würde das funktionieren:
<?php
function my_test_form($form_state)
{
$form['test_datei'] = array(
'#type' => 'fieldset',
'#title' => 'Datei-Uploads',
'#description' => "<h2>Hier kannst du Dateien hochladen.</h2>",
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => FALSE,
);
//Upload-Feld
$form['test_datei']['upload1'] = array(
'#type' => 'file',
'#title' => 'Daten-Upload',
'#size' => 50,
);
$form['test_datei']['upload2'] = array(
'#type' => 'file',
'#title' => 'Daten-Upload',
'#size' => 50,
);
$form['test_datei']['upload3'] = array(
'#type' => 'file',
'#title' => 'Daten-Upload',
'#size' => 50,
);
return $form;
}
function my_test_form_submit($form, &$form_state)
{
$file1 = file_save_upload('upload1', array(), 'files', FALSE);
$file2 = file_save_upload('upload2', array(), 'files', FALSE);
$file3 = file_save_upload('upload3', array(), 'files', FALSE);
}
?>
Man könnte das ganze natürlich auch mit einer Schleife auslesen. Ich bräuchte z.B. nach dem Speichern jeweils den Server-Pfad zu diesen Dateien, danach benötige ich das File-Object nicht mehr:
<?php
function my_test_form_submit($form, &$form_state)
{
$i = 1;
$pfade = array();
while($file = file_save_upload("upload$i", array(), 'files', FALSE);
{
$pfade[$i] = $file->path; //ja, das gibt nur den relativen Pfad, dient jetzt nur dem Verständnis
$i++;
}
}
?>
Grosses Danke daß du das hier
am 31.07.2010 - 19:08 Uhr
Grosses Danke daß du das hier veröffentlichst, ich habe Ähnliches in Planung...
Mit "Flat" meinte ich den Parameter beim file_save_upload:
'upload1' statt 'test_datei']['upload1'