Exporte
Table of Contents
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:
- 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.
- 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:
/**
* 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;
