Dieser Editor bringt die Möglichkeit, den Strict-Editor anhand einer Datenquelle zu dynamisieren. Die Datenquelle wird immer in einen JSON-Struktur konvertiert wird und diese Struktur wird verwendet wird um den Editor zu befüllen.
Ein einfaches Fallbeispiel:
Die Abteilung Buchhaltung soll neue Visitenkarten bekommen. Mit dem Editor ist dem Abteilungsleiter nun möglich ein Datenquelle (in diesem Fall eine Excel-Tabelle) hoch zu laden und die jeweiligen Spalten den Print-Template-Feldern zuzuweisen. Daraus wird dann für jeden Mitarbeiter in der Datenquelle eine individuelle Visitenkarte erstellt die aber dem gleichen Template folgt. Der Abteilungsleiter hat nun zusätzlich die Möglichkeit die einzelnen Visitenkarten der Mitarbeiter zu überprüfen und gegebenenfalls Änderungen direkt beim betroffenen Mitarbeiter vorzunehmen.
(Bilderstecke gif)
Einrichten des Editors
- Über den Einrichtungsassistent presetCmsSeiteJsonXlsxEditor.json einrichten lassen
- Unter shop / Artikel-Vorlagen einen neue Vorlage anlegen
- Dort die folgenden Einstellungen vornehmen und die gewünschten Print-Templates verknüpfen
Einstellung des Print-Templates
Es gilt zu beachten, dass das Eingabeformat des Print-Templates richtig gewählt sein muss. Für den Xlsx-Editor muss das Eingabeformat "XLSX" sein.
Somit kann das Print-Template nicht für andere Editoren verwendet werden.
Erstellen eines Datenquellen-Plugins
Namespace Beispiel xlsx-Upload: w2p_in/xlsx
Plugin w2p_in/store
Dieses Plugin kümmert sich um die Speicherung der ausgelesenen Daten und ist die Schnittstelle zwischen Editor und den verschiedenen Datenquellen. Diese Aspekte sollten immer über dieses Plugin abgearbeitet werden.
Allgemeiner Ablauf für ein Datenquellen-Plugin
- Upload/Auswahl der Datenquelle. Siehe hier.
- Die Datenquelle auslesen und mit w2p_in/store im JSON-Dokument speichern. Siehe hier.
Upload/Auswahl der Datenquelle
/** * Hooks to w2p/xlsx.source/plugin * Used to register plugin as an xlsx editor source plugin. * * @plugin w2p/xlsx * @filename source/plugin * @priority 2 * * @return array * @grantAccessPlugin */ public function plugin() { return [ [ 'label' => i18n\translator::__( 'w2p_in/xlsx', 'XLSX/XLS Datei' ), 'request' => 'w2p_in/xlsx.form' ] ]; }
Konvertieren der Datenquelle und das Ergebnis in die Datenbank schreiben
/** * Is called on sourceSubmit. * Converts uploaded file to xlsx editor structure and saves it to a json document. * * @plugin w2p/xlsx * @filename hook/source/submit * @priority 2 * * @param int $source * @param bool $isSourceXLSX * @param int $documentID * * @return array * @grantAccessRoute */ public function submit($source, $isSourceXLSX, $documentID) { $serve = []; if($isSourceXLSX): // calls the convert logic if is responsible Plugin $serve[] = $this ->getAppFactory(lib\execute\submit::class) ->execute($source, $documentID) ; endif; return $serve; }
use brandbox\w2p_in\store; ... public function execute($sourceFilePath, $documentID) { //Example Code //Get the data rows from the data source (e.q. xlxs-File) $fileRows = $this->getRowsFromDataSource($sourceFilePath); $headerCells = $this->getHeaderCells($fileRows); /** var store\lib\common\writerStructure $structureWriter **/ $structureWriter = $this ->getAppFactory(store\engine::class) ->getWriterStructure() ; // set the header. Needed for the mapping step from datasource to w2pPrintTemplateFields $structureWriter->setHeader($headerCells); $isFirst = true; $fileRows->resetStart(); foreach($fileRows as $fileRow): if($isFirst): $isFirst = false; continue; endif; $fileCells = $fileRow->getCellIterator(); $rowEmpty = true; $cells = []; foreach($fileCells as $fileCell): // collect rows and manipulate values if necessary $sanitizedValue = $this->sanitize($fileCell->getValue()); if('' !== $sanitizedValue): $rowEmpty = false; endif; $cell = $this ->getAppFactory(store\engine::class) ->mapToCell( $fileCell->getCoordinate(), $sanitizedValue ) ; $cells[] = $cell; endforeach; if(!$rowEmpty): // Add row to structure $structureWriter->addRow($cells); endif; endforeach; // let the store plugin write the structure to the database return $structureWriter->write($documentID); }