Exporte

Standard-Grid-Exporte

In Konquadrat sind in jedem Objekt-Grid standardmäßig zwei Exporte möglich: 

Die Grid-Exporte sind Tasks. Das bedeutet dass sie vom Backend aus über mehrere Requests laufen (mehr dazu hier).Aufgrund der Skript-Laufzeit, des Speicherverbrauch, der Möglichkeit den Fortschritt anzuzeigen sind Grid-Exporte in zwei Schritte aufgeteilt:

  1. Daten lesen und in einem DataWrapper zwischenspeichern. Dieser Schritt wird in eins durchgeführt und läuft in einer Transaktion ab, so dass die Daten einen eindeutigen Stand haben.
  2. DataWrapper stückchenweise auslesen (wie groß die Stücke sind wird vom Export definiert) und Datei generieren. Dieser Schritt kann/wird häufiger ausgeführt und die Datei wird nach jedem Durchlauf bereits einmal unvollständig generiert.

Eigene Grid-Exporte

Es ist möglich in einem Grid andere Exporte zur Verfügung zu stellen. Hierfür gibt es im XML den Tag "exports".

Die Standard-Exporte werden hierbei überschrieben, falls diese also weiterhin möglich sein sollen, müssen sie mit hinterlegt werden (siehe Beispiel).

Beispiel:

<grid>
    <!-- ... -->
    <exports>
        <export type="XlsExport">
            <texts>
                <text>Excel</text>
            </texts>
        </export>
        <export type="TxtExport">
            <texts>
                <text>TXT/CSV</text>
            </texts>
        </export>
        <export type="PdfExport">
            <texts>
                <text>Namensschild</text>
            </texts>
        </export>        
    </exports>
</grid>

In diesem Beispiel wird ein Objekt vom Typ "PdfExport" verwendet um den Export zu erstellen. Eigene Export-Objekte müssen das ObjectTemplate GridExportTpl implementieren. In dem Trait von einem Export-Objekt müssen folgende Methoden definiert werden: 

PHP
/**
 * Diese Methode generiert die Export-Datei.
 * Die Daten sind in diesem Moment bereits komplett gelesen.
 * Läuft in einer Transaktion ab. 
 * Falls eine Exception geworfen wird, wird die Transaktion zurückgedreht.
 */
public function _process(): void
{
    // beispiel: vereinfachter CSV-Export
    if ($this->get('TaskStatus') === $this->STATUS_READ_DATA) {
        $this->set('TaskStatus', $this->STATUS_WRITING_FILE);
    }

    if ($this->get('TaskStatus') === $this->STATUS_WRITING_FILE) {
        $params = JsonHelper::decode($this->Params, true);
        $runtimeParams = JsonHelper::decode($this->RuntimeParams, true);
        $dataPath = $this->konquadrat->getDataDirectory() . $this->get('RawData');
        $data = new DataWrapper($dataPath, DataWrapper::MODE_READ);

        if (!isset($runtimeParams['txtFile'])) {
            $out = \fopen('php://memory', 'rb+');
            $runtimeParams['row'] = 0;

            // headline
            $headRowContent = array_values($params['columns']);
            \fputcsv($out, $headRowContent, $params['delimiter'], $params['enclosure']);
        } else {
            $out = \fopen($runtimeParams['txtFile'], 'ab');
        }

        $i = 0;
        $data->jumpToOffset($runtimeParams['row']);
        $interrupted = false;

        while (($dataRow = $data->current()) !== false) {
            if ($i > 20000) {
                $interrupted = true;
                break;
            }
            $i++;
            $runtimeParams['row']++;

            $rowContent = [];
            foreach ($params['columns'] as $column) {
                $rowContent[] = $dataRow[$column];
            }
            \fputcsv($out, $rowContent, $params['delimiter'], $params['enclosure']);
            unset($rowContent);

            $data->next();
        }

        if (!isset($runtimeParams['txtFile'])) {
            \rewind($out);
            $content = '';
            while (($buffer = \fgets($out, 4096)) !== false) {
                $content .= $buffer;
            }
            \fclose($out);

            $resultField = $this->getFieldResult();
            $runtimeParams['txtFile'] = $resultField->setFile($params['gridId'] . '.txt', 'text/csv', $content);
        }

        $this->getField('RuntimeParams')->setValue(JsonHelper::encode($runtimeParams));

        if (!$interrupted) {
            $this->set('TaskStatus', $this->STATUS_FINISHED);
        }
    }
}

/**
 * Muss existieren!!
 */
public function setParams($params): void
{
    if ($this->isSettingData) {
        $this->getField('Params')->setValue($params);
        return;
    }

    // hier können die Rechte überprüft werden z.B. mit:
    /*$permissionControl = $this->sessionContext->getPermissionControl();
    if ($permissionControl instanceof PermissionControl) {
        $permissionControl->requirePermission($this->getPermissionResource(), $this::ACTION_WRITE);
    }*/

    if (\is_string($params)) {
        $params = JsonHelper::decode($params, true);
    }

    if (!\is_array($params)) {
        throw new Exception('Invalid params.');
    }

    // hier params überprüfen falls nötig

    $params = $this->prepareParamsForGridExport($params);
    $params = JsonHelper::encode($params);
    /**
      * @var AbstractObject $this
     */
    $this->getField('Params')->setValue($params);
}

/**
 * OPTIONAL
 *
 * Falls ein nicht leerer String zurückgegeben wird, wird im Backend versucht
 * den String als Javascript-Array zu interpretieren, wovon jeder Array-Eintrag
 * eine ExtJS-Komponente ist (http://docs.sencha.com/extjs/5.1.2/api/) und
 * dem ExportWindow hinzugefügt wird. Ausgefüllte Formularfelder werden
 * der setParams()-Methode mitgegeben.
 */
public static function getGuiFormConfig(LanguageManager $languageManager): string;