Upload Feld einbinden mittels Form API

am 08.04.2010 - 13:27 Uhr in
Hallo, ich steh grad völlig auf dem Schlauch. Ich möchte ein vereinfachtes Formular eines content types erstellen. Und eines der Felder sollte files uploaden können.
Wie kann ich den upload Mechanismus (attachments) in ein eigenes Formular integrieren?
Ich hab auch probiert das mit imagefield und filefield Felder zu realisieren. Aber da ist das selbe Problem. Es gibt fast keine Dokumentation zu dem #type 'imagefield_widget' oder 'filefield_widget'.
Weiss jemand mehr darüber?
paese
- Anmelden oder Registrieren um Kommentare zu schreiben
Was genau willst du denn
am 08.04.2010 - 13:40 Uhr
Was genau willst du denn machen bzw. wozu brauchst du die Upload-Funktion. Eventuell gibts ja ne einfachere Lösung als es selbst zu coden.
ansonsten müsste es so gehen:
<?php
function MY_MODULE_forms()
{
$form['#attributes'] = array('enctype' => "multipart/form-data");
$form['my_upload'] = array(
'#type' => 'file',
'#title' => 'Datei Hochladen',
'#description' => 'Eine Beschreibung',
);
$form['my_upload_submit'] = array(
'#title' => 'Hochladen',
'#value' => 'Hochladen',
'#type' => 'submit',
);
return $form;
}
function MY_MODULE_forms_submit($form, &$form_state)
{
$validators = array( 'file_validate_extensions' => array('pdf txt exe')); //Erlaubte Datei-Endungen
//Pfad des Ordners, wo die Uploads gespeichert werden
$upload_path = 'sites/default/files/downloads/';
if($file = file_save_upload('my_upload', $validators, $upload_path,
$replace = FILE_EXISTS_RENAME))
{
file_set_status($file, FILE_STATUS_PERMANENT);
drupal_set_message("Upload erfolgreich");
}
else {
drupal_set_message('Fehler beim Upload', 'error');
}
}
?>
Das Problem ist, dass mehrere
am 08.04.2010 - 13:45 Uhr
Das Problem ist, dass mehrere Uploads möglich sein müssen. Inklusive löschen und Vorschaubild anzeigen...
Ich möchte es eben nicht selber coden, den Upload Mechanismus find ich schon recht cool.
Also willst du ja nur Bilder
am 08.04.2010 - 13:58 Uhr
Also willst du ja nur Bilder hochladen? Da würd ich zu CCK + Filefield + ImageField raten. Da kannst du beliebig viele Bilder nacheinander hochladen, ohne die Seite neu laden zu müssen und mit Vorschau-Bild. In diesem Zusammenhang kannst dir auch noch ImageCache anschauen, das bietet dafür noch ein paar zusätzliche Funktionen, wie z.B. das Bild verkleinern / vergrößern und solche sachen.
Ja eben, hab ich ja probiert.
am 08.04.2010 - 14:07 Uhr
Ja eben, hab ich ja probiert. Wie bind ich jetzt korrekt das imagefield Feld in mein Formular ein?
Ich hab aus dem hook_elements herausgefunden, dass der #type imagefield_widget heissen muss. Das hat aber nicht funktioniert. (Fehlermeldung müsst ich nochmals reproduzieren) Dokumentation dazu hab ich keine gefunden...
Und warum genau fügst du
am 08.04.2010 - 23:28 Uhr
Und warum genau fügst du nicht einfach einem Inhaltytyp via CCK ein Imagefield hinzu und erweiterst das ganze mit Image FUpload? Das wäre doch ganz einfach, oder?
Ja das ist ganz einfach, ist
am 09.04.2010 - 09:34 Uhr
Ja das ist ganz einfach, ist aber nicht das was ich erreichen möchte.
Ich probiere mein Problem ein bisschen zu umschreiben, vielleicht wirds dann klarer.
Ich habe einen Contenttype der aus ungefähr 30 Feldern besteht. Textareas, Textfields und weitere, alles kunterbunt gemischt. Ich möchte jetzt ein eigenes (kürzeres) Formular machen, das die Daten aus dem CCK bezieht und diese auch dort wieder speichert. Das Formular besteht aus zwei Textfelder und soll eben auch Dateien (mehrere) hochladen können. Das geht mit der Form API ganz gut bis auf den Upload.
Und jetzt die Quizfrage: Wie binde ich den upload Mechanismus (das kann drupal upload, cck imagefield oder cck filefield sein, ist mir egal) in mein Formular ein ohne alles neu zu programmieren?
Falls es jemanden
am 14.04.2010 - 12:59 Uhr
Falls es jemanden interessiert hab ich hier eine Lösung für das Problem. Es gibt ein paar Stolpersteine, aber so funktioniert das bei mir.
- Der Name des Formulars muss mit 'node_form' aufhören, weil das Upload Module einen CCK Type erwartet.
- Der Node muss zum Formular hinzugefügt werden
- Als Type den Formularname ($form_id) ohne 'node_form' definieren.
- Die submit Funktion muss explizit nochmal definiert werden und muss nach dem upload Modul submit kommen.
Danach greift der form_alter hook vom Upload Modul und bindet die Attachments automatisch im Formular ein (falls Attachments eingeschalten sind).
<?php
function MY_MODULE_my_form_node_form($form_state, $node) { //important that your $form_id ends with 'node_form'
$form = array();
//add node values to the form
$form['#node'] = $node;
$form['type'] = array('#value'=>'MY_MODULE_my_form');
$form['my_textfield'] = array(
'#type' => 'textfield',
'#title' => t('textfield'),
'#default_value' => $node->field_my_textfield[0]['value'],
);
$form['#submit'][] = 'upload_node_form_submit';
$form['#submit'][] = 'MY_MODULE_my_form_node_form_submit';
return $form;
}
function MY_MODULE_my_form_node_form_submit($form, &$form_state) {
$nid = (int) $form_state['values']['nid'];
$node = node_load($nid, NULL, true);
$node->field_my_textfield[0]['value'] = $form_state['values']['my_textfield'];
//add files to the node
if (is_array($form_state['values']['files'])) {
foreach($form_state['values']['files'] as $fid => $file) {
$node->files[$fid] = $file;
}
}
node_save($node);
}
?>
Ohne zu programmieren geht
am 15.04.2010 - 08:08 Uhr
Ohne zu programmieren geht das nicht. Das ergibt sich schon aus der Aufgabenstellung den Node über ein kürzeres Formular zu speichern. Mit der Definition des Datentyps stellt Drupal das zugehörige Formular bereit. Willst Du das nicht nutzen mußt Du die Umgehung selbst programmieren. Das Upload Feld kommt dann dazu.
Warum nicht den Node Type mit Gruppen versehen, die im Normalfall zugeklappt bleiben. Damit läßt sich Dein Formular auch verkürzen und du mußt nichts selbst programmieren.