Kev's keyword CSV and TYPO3 hold the same solutions under slightly
different names, so the structure check filed them as missing/extra.
Matching is now slug -> normalized title -> record alias, using the
per-model alias store the import tabs got on 2026-08-18
(tx_vitec_import_mapping.record_aliases, key = lowercased CSV name).
One link therefore serves the import union list, the structure check
and vitec:create-markets (same service - linked rows are no longer
proposed as new records).
- every "Missing in TYPO3" row carries a select of all records the
direct match did not claim; "Save record links" persists per model
- alias-matched rows show under "Both" with a "linked" badge and the
same select; option 0 removes the link
- SeoResearchService::recordsCheck() additionally returns `linkable`
(the select options) and flags alias matches with via=link
- new backend POST route seo_aliases
Success stories: --markets-only repair mode
- /success-stories emitted empty `markets` for all 48 stories - a data
problem (code and TCA untouched since 17.08.); read-only diagnosis
script migrations/check_usecase_markets.php added
- vitec:import-success-stories --markets-only re-derives each story's
industries from the export exactly like the full import and rewrites
ONLY the markets MM relation of the existing record via DataHandler;
nothing else is touched, no usecase created or deleted, unresolved
stories keep their current relations
- decision: industries are translated onto the nine main markets of
the current taxonomy (INDUSTRY_TO_MARKET) instead of recreating the
seven deleted industry markets; the repair mode never creates
market records (root cause: those industry markets were deleted
after the 07.08. taxonomy import, orphaning all story relations)
- ensureMarkets() gained a $create flag for reuse by the full import
Story detail pages: real page title
- every story page answered with the generic page title "Story"; same
defect and same fix as the product pages on 21.08.: new
UsecasePageTitleProvider (singleton), registered as vitecUsecase in
config.pageTitleProviders, fed from UsecaseShowJsonRenderer with
seo_title falling back to title
Requires on the server:
vendor/bin/typo3 cache:flush
107 lines
3.9 KiB
PHP
107 lines
3.9 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'],
|
|
],
|
|
'seo_aliases' => [
|
|
'target' => ImportController::class . '::seoAliasesAction',
|
|
'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'],
|
|
],
|
|
],
|
|
],
|
|
];
|