Development Import Export

From Cloudrexx Development Wiki
Jump to: navigation, search

Die Import/Export Klassen (/lib/importexport/) können Universell eingesetzt werden. Dieser Text zeigt wie.

Import

Als erstes muss die Import Klasse eingebunden werden und ein Objekt davon erstellt werden:

require_once ASCMS_LIBRARY_PATH . "/importexport/import.class.php"; 
$importlib = new Import();

Der Importvorgang erfolgt nun in 3 Schritten:

  1. Auswahl der Datei, Angabe von Optionen (Typ der zu importierenden Datei [csv, excel]). Die Datei wird beim Abschicken des Formulars hochgeladen. (Fileselect)
  2. Die Datei wird in den tmp Ordner verschoben und ein erstes mal geparst. Dabei werden die Feldnamen herausgelesen. Erledigt wird dies von einer weiteren Klasse. Danach wird das Formular zum zuweisen der Felder angezeigt. Die Optionen von Punkt 1 werden per hidden Felder weitergegeben. (Fieldselect)
  3. Nun wird die Datei ein zweites mal geparst und die Daten werden herausgelesen. Aufgrund der Zuweisungsangaben (Punkt 2) des Users wird ein array mit den Daten zurück gegeben. Die Datei wird gelöscht, die Arbeit der Importklasse ist erledigt.

Entsprechend dieser drei Schritte ist nun folgendes zu tun: (Ein gutes Beispiel befindet sich in der Datei modules/memberdir/admin.class.php, _import() Methode)

If Verzweigungen

Im code, wo die Import Klasse verwendet werden soll, müssen einige if-Verzweigungen gemacht werden. Hier ein Beispiel:

if (isset($_POST['import_cancel'])) {
    // Abbrechen. Siehe Abbrechen 
} elseif ($_POST['fieldsSelected']) { 
      // Speichern der Daten. Siehe Final weiter unten. 
} elseif ($_FILES['importfile']['size'] == 0) { 
     // Dateiauswahldialog. Siehe Fileselect 
} else { 
     // Felderzuweisungsdialog. Siehe Fieldselect 
}

Fileselect

Beim Importlib Objekt muss die entsprechende Methode aufgerufen werden:

$importlib->initFileSelectTemplate($this->_objTpl);

Übergeben werden muss das Template Objekt. Die Variable wird per Referenz übergeben.

Die Methode zeigt nun das Standard Fileselect-Formular an. Falls noch weitere Optionen benötigt werden, können die wie folgt hinzugefügt werden:

$this->_objTpl->setVariable(array(
    'IMPORT_ACTION'      => '?cmd=memberdir&act=import',
    'IMPORT_ADD_NAME'    => 'Kategorie',
    'IMPORT_ADD_VALUE'   => $this->_getCategoryMenu(),
    'IMPORT_ROWCLASS'    => 'row2',
    'TXT_HELP'           => 'Wählen Sie hier eine Datei aus, deren Inhalt importiert werden soll:'
)); 
$this->_objTpl->parse("additional");

Der TXT_HELP Platzhalter ist für die Anzeige eines Hilfe-Texts.

Fieldselect

Auch hier muss eine Methode des Importlib Objekts aufgerufen werden, mit dem Templateobjekt als Parameter:

$importlib->initFieldSelectTemplate($this->_objTpl, $given_fields);

Der zweite Parameter ist ein Array mit den 'gegebenen' Werten, also den Werten die in der Rechten Spalte angezeigt werden bei der Feldauswahl. Das Array muss folgende Struktur haben:

Array
(
    [Key] => Value,
    [2] => "Beispiel"
)

Falls noch Optionen vom Fileselect (additional options) durchgereicht werden müssen, können auch noch zusätzliche hidden-input-Tags geparst werden:

$this->_objTpl->setVariable(array(
    'IMPORT_HIDDEN_NAME'    => 'category',
    'IMPORT_HIDDEN_VALUE'   => 5,
));

Final

Am Ende muss noch die Methode getFinalData aufgerufen werden:

$data = $importlib->getFinalData($fields);

Übergeben wird ein Array mit den Feldnamen.

Array
(
    [Key] => Value,
    [2] => "Beispiel"
)

Man erhält nun ein Array mit den Daten. Das Array hat folgende Struktur:

Array
(
    [0] => Array
        (
            [key1] => Wert1
            [feldname1] => Wert1
            [key2] => Wert2
            [feldname] => Wert2
        )
    [1] => Array
        (
            [1] => Astalavista
            [Firmenname] => Astalavista
            [2] => Schmid
            [Kontaktperson] => Schmid
        )
)

Nun müssen die Daten nur noch gespeichert werden ;)

Abbrechen

Damit der Benutzer den Vorgang auch abbrechen kann, muss noch die Cancel Methode implementiert werden. Anschliessend empfiehlt es sich, eine Weiterleitung zu machen.

$importlib->cancel(); 
header("Location: index.php?cmd=memberdir&act=import");
exit;

Export

Noch nicht implementiert

Datenklassen

Um verschiedene Dateiformate wie excel, csv etc. zu unterstützen, gibt es die Datenklassen. Jede dieser ist schlussendlich für das Herauslesen und Speichern von Daten im entsprechenden Format zuständig.

Import

Für den Import wird die Datenklasse instanziert. Anschliessend wird die Methode parse() aufgerufen. Die Methode kennt zwei Parameter:

  • string $file Enthält den vollständigen Pfad zur Datei die importiert werden soll
  • int $looplimit (default: -1) Ist das Limit für Datensätze. Wenn es -1 ist, werden alle Datensätze berücksichtigt

Dank dem $looplimit können Schlaufen wie erfolgt erstellt werden:

while (!feof($handle) && $limit != 0) { 
    ... 
    $limit--; 
}

Die Methode muss anschliessend ein Array zurück geben mit folgendem Format:

Array
(
    [fieldnames] => Array
    (
        [0] => Name
	[1] => Vorname
	[2] => test
    )
    [data] => Array
    (
        [0] => Array
        (
            [0] => Wert1
            [1] => Wert1.2
            [2] => Wert1.3
        )
    )
)