Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Module › Modul-Entwicklung ›

XML erstellen von hochgeladenen Dateien

Eingetragen von congomonster (24)
am 16.08.2016 - 11:12 Uhr in
  • Modul-Entwicklung
  • Drupal 8.x oder neuer

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");
           
            }

    }

?>

‹ [gelöst] Erstes eigenes Modul Drupal 8 Plupload Datei hochladen ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

wo ist die Klasse DOMDocument deklariert?

Eingetragen von ronald (3857)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hi, das PHP DOM Modul ist auf

Eingetragen von Hyp1 (1463)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Klasse nicht erstellt

Eingetragen von congomonster (24)
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 :(

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo, schea mal in

Eingetragen von Hyp1 (1463)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

ich sehe das wie Robert

Eingetragen von ronald (3857)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Läuft halbwegs....

Eingetragen von congomonster (24)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Damit der Gast hochladen darf, muss

Eingetragen von ronald (3857)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Download Methode ist öffentlich

Eingetragen von congomonster (24)
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.

AnhangGröße
Dateisystem_Drupal8.jpg 50.19 KB
  • 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 5 Tagen
  • Hey danke
    vor 1 Woche 6 Tagen
  • Update: jetzt gibt's ein
    vor 2 Wochen 6 Stunden
  • Hallo, im Prinzip habe ich
    vor 2 Wochen 4 Tagen
  • Da scheint die Terminologie
    vor 2 Wochen 4 Tagen
  • Kannst doch auch alles direkt
    vor 3 Wochen 2 Tagen
  • In der entsprechenden View
    vor 3 Wochen 2 Tagen
  • Dazu müsstest Du vermutlich
    vor 3 Wochen 2 Tagen
  • gelöst
    vor 5 Wochen 5 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 5 Wochen 6 Tagen

Statistik

Beiträge im Forum: 250233
Registrierte User: 20452

Neue User:

  • ByteScrapers
  • Mroppoofpaync
  • 4aficiona2

» 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 33 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