processFormData: Formular-Daten lokal in eine XML-Datei abspeichern

von Marco Simbürger

Es kommt immer wieder vor, dass man die Formular-Daten z.B. in eine XML-Datei lokal auf dem FTP speichern muss, da ein anderes Programm (z.B. ein CRM) diese Daten dann weiter verarbeiten will. Für eine solche Anforderung eignet sich der processFormData-HOOK ideal, da man damit auf alle Formulardaten zugreifen kann. Folgendes Script erstellt für jedes abgesendete Formular eine neue XML-Datei.

Wie man einen HOOK einrichtet, findest du hier: HOOK einrichten

Zuerst generieren wir in der Methode die XML-Datei. Da es sein kann, dass es für verschiedene Formulare, verschiedene XML-Dateien geben soll, überprüfe ich das jeweils über die formID. Diese ID kann im Contao Backend beim Formular gesetzt werden (Feld "Formular-ID" unten rechts). Die Daten speichern wir als Text (String) in eine PHP-Variable. Die entsprechenden Werte können aus dem Array $arrPost[] geholt werden. Die Bezeichnungen entsprechen den Feldnamen des Formulars. Ich empfehle, den Text an den linken Rand rauszuschieben, da sonst die Tabulator-/Leerschläge ins XML-File übernommen werden.

Ist die Variable mit den Daten gefüllt, müssen wir die Daten noch lokal auf den Server abspeichern. Zuvor sollte natürlich ein entsprechender Ordner auf dem FTP erstellt werden. Wenn die Variable $xml nicht leer ist, wird der Dateiname geneiert und der Pfad zusammengebaut. Gibt es eine Datei mit diesem Dateinamen noch nicht, wird die Datei erstellt und mit dem Inhalt aus Variable $xml beschrieben. Siehe dazu: function.file-put-contents

public function myProcessFormData($arrPost, $arrForm, $arrFiles)
{

	/* Nur wenn Formular-ID == 'form_contact' */
	if($arrForm['formID']=='form_contact'){

	/* XML-Content */
$xml = '<contacts>
<contact>
<salutation>'.$arrPost['salutation'].'</salutation>
<lastname>'.$arrPost['lastname'].'</lastname>
<firstname>'.$arrPost['firstname'].'</firstname>
<address>'.$arrPost['address'].'</address>
<zip>'.$arrPost['zip'].'</zip>
<town>'.$arrPost['town'].'</town>
<email>'.$arrPost['email'].'</email>
<message>'.$arrPost['message'].'</message>
</contact>
</contacts>';

		}

	/* XML schreiben */
	if($xml!=''){

		$filename = 'export-'.time(); //export-1420066800
		$path = 'export/'.$filename.'.xml'; //export/export-1420066800.xml

		if(!file_exists($path)){				
			file_put_contents($path, $xml); //Datei schreiben
		}
					
	}

}

 

Im obigen Beispiel verwende ich den Timestamp für die individuelle Namensgebung. Hier zusätzlich noch ein Beispiel mit fortlaufend nummerierten Text-Dateien (Nummerierung pro Tag).

$fileContent = 'bla bla'; //hier stehen die Daten für die XML-Datei drin
$folder = 'export/'; //Speicherort
$today = $this->parseDate('Ymd'); //z.B. 20150908
$nr = 0;

if($handle = opendir($folder)) { //wenn das Verzeichnis geöffnet werden kann...
while (false !== ($entry = read dir($handle))) {//Auflistung von allen Dateien im Verzeichnis

 	if ($entry != "." && $entry != "..") { // wenn der Dateiname nicht . oder .. ist	      	
        	if(substr($entry, 0, 8) == $today){ // wenn das Datum des Dateinames gleich ist wie $today (ersten 8 Zeichen des Dateinames (Ymd))
        		if(substr($entry, 8, 3) > $nr){ // wenn die Nr. der Datei nach dem Datum grösser ist...
	        		$nr = substr($entry, 8, 3); //... diese Nr. speichern (so wird die grösste vorhandene Nr. aller Dateien mit dem gleichen Datum ermittelt)
	        	}
        	}		           
        }
    }

} 

$nr++; //Nr. um 1 erhöhen
//Nullen anhängen, wenn die Nr. ein- oder zweistellig ist
if($nr < 10){
	$nr = '00'.$nr;
}
elseif($nr >= 10 && $nr < 100){
	$nr = '0'.$nr;
}

$filename = $this->parseDate('Ymd').$nr; //Dateiname zusammensetzen			
$file = $folder.$filename.'.txt'; //Pfad zusammensetzen			
if(!file_exists($file)){				
	file_put_contents($file, $fileContent); //Datei erstellen
}

Zurück

Kommentare

Einen Kommentar schreiben

Was ist die Summe aus 8 und 7?