Files
VITEC-website/packages/vitec/Configuration/Backend/Modules.php
Oliver Rasche 10c0328bf2 Backend module: CSV import for the VITEC domain models
New "VITEC Import" module under Web: one import page per domain model
(v1: Market, Solution, Product - registry-driven, adding a model is one
config entry). Workflow: upload a CSV (delimiter and encoding are
auto-detected, including German-Excel semicolon/Windows-1252), map CSV
columns to DB fields, persist the mapping per model together with the
identity field used for matching (new table tx_vitec_import_mapping,
no TCA - pure tool configuration), review a unified list of CSV rows
matched against the DB records (new / update with differing fields /
unchanged / db-only), then apply the checked rows through DataHandler.

Each importable row carries an editable JSON payload textarea - what
is written is the textarea content, not the raw CSV, so editors can
fix values right in the review step. The parsed CSV travels through
the form as a hidden JSON field: no session state, no temp files.
Importable fields are derived from TCA at runtime (scalar types only;
files, categories and other relations are excluded - a flat CSV
cannot carry them). Payloads are whitelisted against that field list
on apply; new records require a storage pid (prefilled from existing
records). BE user permissions apply via DataHandler.

Deliberately out of v1: import log with three-way compare (protection
against overwriting manual edits), images/relations, multiple saved
mappings per model.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 12:53:21 +02:00

58 lines
2.0 KiB
PHP

<?php
declare(strict_types=1);
use Evomedien\Vitec\Controller\Backend\ImportController;
use Evomedien\Vitec\Controller\OgImageController;
return [
'web_vitecimport' => [
'parent' => 'web',
'position' => ['after' => 'web_info'],
'access' => 'user',
'workspaces' => 'live',
'path' => '/module/web/vitec-import',
'labels' => [
'title' => 'VITEC Import',
'shortDescription' => 'CSV import for the VITEC domain models',
],
'extensionName' => 'Vitec',
'iconIdentifier' => 'vitec-import',
'routes' => [
'_default' => [
'target' => ImportController::class . '::indexAction',
],
'process' => [
'target' => ImportController::class . '::processAction',
'methods' => ['POST'],
],
],
],
'web_vitecogimage' => [
'parent' => 'web',
'position' => ['after' => 'web_info'],
'access' => 'user',
'workspaces' => 'live',
'path' => '/module/web/vitec-ogimage',
'labels' => [
'title' => 'LLL:EXT:vitec/Resources/Private/Language/locallang_ogimage.xlf:mlang_tabs_tab',
'shortDescription' => 'LLL:EXT:vitec/Resources/Private/Language/locallang_ogimage.xlf:mlang_labels_tabdescr',
],
'extensionName' => 'Vitec',
'iconIdentifier' => 'vitec-ogimage',
'routes' => [
'_default' => [
'target' => OgImageController::class . '::indexAction',
],
'generate' => [
'target' => OgImageController::class . '::generateAction',
'methods' => ['POST'],
],
'preview' => [
'target' => OgImageController::class . '::previewAction',
'methods' => ['POST'],
],
],
],
];