Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

[gelöst] file_save_upload und Fieldsets?

Eingetragen von Exterior (2903)
am 29.07.2010 - 00:27 Uhr in
  • Allgemeines zu Drupal
  • Drupal 6.x

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?

‹ Multisite News Sharing Fehler zu Modul "Imagecache_Actions" reporte ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Konkrete Lösung hab ich auch

Eingetragen von netzkoop (1820)
am 29.07.2010 - 09:50 Uhr

Konkrete Lösung hab ich auch nicht.
Hier wird ein Patch diskutiert für D6.15

  • Anmelden oder Registrieren um Kommentare zu schreiben

wenn ich das auf drupal.org

Eingetragen von sepp68 (444)
am 29.07.2010 - 11:07 Uhr

wenn ich das auf drupal.org lese, könnte dies für die 1.Datei funktionieren:

<?php
file_save_upload
('test_datei][upload1', array(), 'files', FALSE))
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

@sepp68 Das funktioniert eben

Eingetragen von Exterior (2903)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hab mir den Patch jetzt nicht

Eingetragen von netzkoop (1820)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke für die Info :-) Ja,

Eingetragen von Exterior (2903)
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 -,-'

  • Anmelden oder Registrieren um Kommentare zu schreiben

Eine Frage noch zum

Eingetragen von sepp68 (444)
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 ?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Puh, bin mir jetzt nicht ganz

Eingetragen von Exterior (2903)
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++;
      }
  }
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

Grosses Danke daß du das hier

Eingetragen von sepp68 (444)
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'

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 1 Woche 2 Tagen
  • Hey danke
    vor 1 Woche 3 Tagen
  • Update: jetzt gibt's ein
    vor 1 Woche 4 Tagen
  • Hallo, im Prinzip habe ich
    vor 2 Wochen 1 Tag
  • Da scheint die Terminologie
    vor 2 Wochen 1 Tag
  • Kannst doch auch alles direkt
    vor 2 Wochen 6 Tagen
  • In der entsprechenden View
    vor 2 Wochen 6 Tagen
  • Dazu müsstest Du vermutlich
    vor 2 Wochen 6 Tagen
  • gelöst
    vor 5 Wochen 2 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 5 Wochen 3 Tagen

Statistik

Beiträge im Forum: 250233
Registrierte User: 20450

Neue User:

  • Mroppoofpaync
  • 4aficiona2
  • AppBuilder

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 16 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association