XML erstellen von hochgeladenen Dateien
Eingetragen von congomonster (24)
am 16.08.2016 - 11:12 Uhr in
am 16.08.2016 - 11:12 Uhr in
Hallo,
ich bin gerade dabei mein eigenes Modul bzw. eine Form zu entwickeln. In der Form kann man seine E-Mail Adresse angeben und Daten mit Plupload hochladen.
Von diese "hochgeladen" Dateien würde ich jetzt gerne XML-Dateien erstellen, die die angegeben E-Mail Adresse speichert. So dass unser Workflow System die Daten zuordnen kann.
Im Processwire CMS habe ich das schon mal geschafft. Ich wollte gerne die hochgeladenen Dateien durch eine For each Schleife laufen lassen. Drupal 8 meldet dann das er nichts mit der Klasse DOMDocument angfangen kann.
Hier mal die Funktion:
<?php
public function submitForm(array &$form, FormStateInterface $form_state) {
// Create target directory if necessary.
$destination = \Drupal::config('system.file')
->get('default_scheme') . '://service/service1_bildumwandlung_sw';
file_prepare_directory($destination, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
$saved_files = array();
foreach ($form_state->getValue('plupload') as $uploaded_file) {
$file_uri = file_stream_wrapper_uri_normalize($destination . '/' . $uploaded_file['name']);
// Move file without creating a new 'file' entity.
file_unmanaged_move($uploaded_file['tmppath'], $file_uri);
// @todo: When https://www.drupal.org/node/2245927 is resolved,
// use a helper to save file to file_managed table
$saved_files[] = $file_uri;
// create XML files for workflow
// remove extension from files
$withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $saved_files);
foreach($withoutExt as $withoutExt_string) {
$doc = new DOMDocument('1.0');
// we want a nice output
$doc->formatOutput = true;
$root = $doc->createElement('phpemail');
$root = $doc->appendChild($root);
$email = $doc->createElement('email');
$email = $root->appendChild($email);
$text = $doc->createTextNode('test@test.de');
$text = $email->appendChild($text);
$doc->save($upload_path . $withoutExt_string . ".xml");
}
}
?>
- Anmelden oder Registrieren um Kommentare zu schreiben
wo ist die Klasse DOMDocument deklariert?
am 17.08.2016 - 08:22 Uhr
wie hast du die Klasse eingebunden?
Wenn es eine Klasse innerhalb deines Modules ist, wird sie automatisch eingebunden.
Nichtsdestotrotz, wo wird sie initialisiert?
Grüße
Ronald
Hi, das PHP DOM Modul ist auf
am 17.08.2016 - 10:18 Uhr
Hi,
das PHP DOM Modul ist auf deinem Server nicht installiert.
Daher kann dein PHP Skript die Klasse nicht finden.
Installiere das Modul php_xml auf deeinem Server, dann Sollte dieser Fehler behoben sein.
MfG
Robert
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Klasse nicht erstellt
am 17.08.2016 - 11:01 Uhr
Hallo,
Danke für die Antworten. Ich habe keine Funktion für das erstellen einer XML Datei gebaut.
Wenn die Form abgesendet wird soll geschaut werden, was im saved_files array steckt und von diesem Dateinamen soll jeweils eine Datei erstellt werden.
Ich dachte man kann einfach so new = DomDocument nehmen. Ich habe es mal zum testen mit mit fopen probiert. Damit erstellt er zu jeder dabei z.B. einen Textfile.
Ich habe bei der Installation von Drupal 8 als PHP Version die 7 gewählt. Ich habe nachgeschaut bei meinem shared Hoster. Das DOM Modul ist für PHP 5 und 7 aktiv.
Auf dem gleichen Server liegt ja auch wie schon erwähnt, noch das Processwire CMS die den DomDocument Befehl auch nutzt.
Brauch man zwingend das php_xml Modul? Ich denke das kann ich beim shared Hoster vergessen :(
Hallo, schea mal in
am 17.08.2016 - 12:17 Uhr
Hallo,
schea mal in phpinfo(); ob das Modul tatsächlich
geladen wurde.
Alternativ sollte auch das funktionieren um zu testen ob das Modul geladen wurde:
echo "XML: ", extension_loaded('xml') ? 'OK' : 'MISSING', '<br>;
Im übrigen:
1.
Wenn du nur eine XML Datei schreiben möchtest und die Struktur kennst,
dann kannst Du das auch ohne Modul machen.
Warum schreibt das die XML Datei nicht einfach als File raus?
2. Es ist keine gute Idee Bilder direkt XML einzubetten:
a) Die Bilder müssen base64 encoded sein, d-H: das base64 Bild ist ca. 37% grösser als das Original
b) Da die XML Datei mehrere Bilder haben, kann Sie so gross sein, dass Sie der Server gar nicht mehr lesen kann (Ressource Limits)
Gruss
Robert
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
ich sehe das wie Robert
am 17.08.2016 - 17:21 Uhr
Es ist best practice im WEB, Bilder als Dateien in definierten Pfaden abzulegen, und in Markups nur die Pfade abzulegen.
Dabei ist es unerheblich ob dies HTML oder XML Dateien sind.
Vielleicht geht das ganze auch mit content_types erheblich besser?
Wir wissen ja nicht, was du am Ende erreichen willst.
Vielleicht kannst du dir die XML-Files ganz sparen?
Ich sehe XML nur als ein Transportformat, und halte es für ungeeignet, mit großen Datenmengen sicher umzugehen.
Grüße
Ronald
Läuft halbwegs....
am 17.08.2016 - 18:50 Uhr
Hallo,
danke für die vielen Antworten. Also das PHP Modul scheint zu laufen, zumindest bringt der gegebene code:
<?php
echo "XML: ", extension_loaded('xml') ? 'OK' : 'MISSING', '<br>';
?>
ein: XML : OK
Ich habe das nun über fopen gelöst, da ich ja die XML Struktur kenne. Ist aber nicht der "saubere" Weg denke ich.
Weiterhin habe ich den Daten eine unique id gegeben. Pluploads Setting mit unique_names hat nicht gegriffen.
<?php
public function submitForm(array &$form, FormStateInterface $form_state) {
// Create target directory if necessary.
$destination = \Drupal::config('system.file')
->get('default_scheme') . '://service/service1_bildumwandlung_sw';
file_prepare_directory($destination, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
$saved_files = array();
foreach ($form_state->getValue('plupload') as $uploaded_file) {
$file_uri = file_stream_wrapper_uri_normalize($destination . '/' . uniqid() . '_' . $uploaded_file['name']);
// Move file without creating a new 'file' entity.
file_unmanaged_move($uploaded_file['tmppath'], $file_uri);
// @todo: When https://www.drupal.org/node/2245927 is resolved,
// use a helper to save file to file_managed table
$saved_files[] = $file_uri;
// create XML files for workflow
// remove extension from files
$withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $saved_files);
foreach($withoutExt as $withoutExt_string) {
$doc = fopen($withoutExt_string . ".xml", "w") or die("Unable to open file!");
$email_for_text = $form_state->getValue('customer_email');
$txt =
"
<phpemail>
<email>$email_for_text</email>
</phpemail>";
fwrite($doc, $txt);
fclose($doc);
}
}
if (!empty($saved_files)) {
//$form_state->setRedirect('<front>');
//drupal_set_message('Files uploaded correctly: ' . implode(', ', $saved_files) . '.', 'status');
drupal_set_message($this->t('Ihre Daten werden innerhalb von 15 Minuten an @email zurück gesendet.', array('@email' => $form_state->getValue('customer_email'))));
}
}
?>
Ich will auch keine Bilder in XML-Dateien speichern. Das ganze läuft so, dass ich mit dem Plupload widget eine oder mehrere Dateien hochlade.
Vorher lasse ich vom Benutzer die E-Mail Adresse angeben. In die XML (oder jetzt fake Text XML) wird nur die angegebene E-Mail Adresse geschrieben.
Die XML-Datei bekommt den selben Namen wie die hochgeladenen Datei. Somit habe ich zwei Dateien:
123456_sonne.jpg
123456_sonne.xml
Unser Workflow System holt die Daten dann per SFTP. Die beiden Dateien werden "verheiratet" und das System weiß welche E-Mail es anschreiben muss für Dateien.
Soweit so gut klappt es wenn ich angemeldet bin. Nur der Gast kann nichts hochladen. Wie kann ich das noch ändern?
Damit der Gast hochladen darf, muss
am 18.08.2016 - 08:36 Uhr
das Filesystem auf Public access umgestellt werden (Dateien werden durch den Webbrowser ausgeliefert).
Übrigens - das ist kein Fake-Text-XML, sondern XML ist IMMER Text.
Das ist das, was es so vielseitig macht.
Es handelt sich immer um reine Textdateien, die von jedem beliebigen System gelesen und geschrieben werden können.
Deshalb wird es gerne für den Datenaustausch benutzt, bzw. ist genau dafür vorgesehen.
XML ist, wie CSV auch, ein reines Textaustauschformat.
Durch die Tags ist jedoch eine gewisse Struktur möglich, die mit reinem CSV nicht darstellbar ist.
Für den Interprozessualen Austausch versuche ich möglichst auf JSON zu setzen, da dies erheblich kompakter und entsprechend schneller transportiert werden kann, und von Programmsystemen erheblich schneller zu verarbeiten ist.
Grüße
Ronald
Download Methode ist öffentlich
am 18.08.2016 - 11:35 Uhr
Hallo,
in der Konfiguration war das schon so eingestellt auf "Öffentlich zugängliche Dateien werden durch den Webserver ausgeliefert.".
Oder muss man noch was in der settings.php zusätzlich ändern? Mit der Einstellung kann ich gerade als Gast nichts hochladen.