VITEC Import module: Products tab is now a searchable/sortable product overview. "Edit Product" opens an XLSX upload with per-field source mapping (component + cell), old/new preview and checkbox apply via DataHandler; the mapping and manual matches are persisted and preselect the next workbook. Category workbooks are detected and rejected. - new: ProductXlsxReader (PhpSpreadsheet), ProductTextImportController, Products/ProductTexts templates, 4 module routes - related products: per-pair card text in new side table tx_vitec_product_related_text (survives MM rewrites), emitted as `cardtext` in the product JSON; missing MM relations added add-only - card copy read from Body Copy (D) with fallback to CTA/Card Copy (E) - the workbooks fill either depending on row type - product detail page <title> now uses seotitle with title fallback (provider made singleton and fed from the JSON renderer) - per-user recent-search badges; last loaded workbook stored per product (tx_vitec_product_workbook), Edit Product reopens on it - composer: add phpoffice/phpspreadsheet ^5.9 - diagnostics: migrations/check_workbook.php
103 lines
3.8 KiB
PHP
103 lines
3.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use Evomedien\Vitec\Controller\Backend\ImportController;
|
|
use Evomedien\Vitec\Controller\Backend\ProductTextImportController;
|
|
use Evomedien\Vitec\Controller\Backend\WordPressImportController;
|
|
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'],
|
|
],
|
|
'seo' => [
|
|
'target' => ImportController::class . '::seoAction',
|
|
],
|
|
'seo_upload' => [
|
|
'target' => ImportController::class . '::seoUploadAction',
|
|
'methods' => ['POST'],
|
|
],
|
|
'products' => [
|
|
'target' => ProductTextImportController::class . '::productsAction',
|
|
],
|
|
'product_edit' => [
|
|
'target' => ProductTextImportController::class . '::productEditAction',
|
|
],
|
|
'product_preview' => [
|
|
'target' => ProductTextImportController::class . '::productPreviewAction',
|
|
'methods' => ['POST'],
|
|
],
|
|
'product_apply' => [
|
|
'target' => ProductTextImportController::class . '::productApplyAction',
|
|
'methods' => ['POST'],
|
|
],
|
|
],
|
|
],
|
|
'web_vitecwpimport' => [
|
|
'parent' => 'web',
|
|
'position' => ['after' => 'web_vitecimport'],
|
|
'access' => 'user',
|
|
'workspaces' => 'live',
|
|
'path' => '/module/web/vitec-wp-import',
|
|
'labels' => [
|
|
'title' => 'WordPress Import',
|
|
'shortDescription' => 'Imports WordPress blog posts as news records',
|
|
],
|
|
'extensionName' => 'Vitec',
|
|
'iconIdentifier' => 'vitec-wpimport',
|
|
'routes' => [
|
|
'_default' => [
|
|
'target' => WordPressImportController::class . '::indexAction',
|
|
],
|
|
'import' => [
|
|
'target' => WordPressImportController::class . '::importAction',
|
|
'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'],
|
|
],
|
|
],
|
|
],
|
|
];
|