- Joe's 39 "- Completed" workbooks applied to all 39 sub-solution pages (#467-#515); both workbook inboxes are now gitignored and the tracked test workbooks untracked - filled deliveries live in the Nextcloud - new Import\ProductFamilyAliases: the workbooks reference product FAMILIES in the product slots; 11 labels map to a representative product, consulted by BOTH importers after the exact title match and reported as "-> family alias" - flip-card icons: dummy SVGs fileadmin/icons/flow/<name>.svg for Joe's 10-name vocabulary, attached by the new attachIconFile() through the shared idempotent attachFalFile() (extracted from attachUrlFile); real icons later REPLACE those files in the Filelist (same sys_file uid), every card follows without a re-import - image slots: numbered grey placeholders per page and slot (fileadmin/placeholders/pages/<pid>-NN.png, the id rendered into the image; generic grey as fallback). An existing reference is never overwritten; a real URL on re-import swaps the placeholder away - page properties per sub-solution: og/twitter title + description mirror the SEO fields, canonical_link points at the page itself, abstract derived from the intro copy (~300 chars, word boundary), keywords from the curated PAGE_KEYWORDS set - spec head-matter fix rides along (version table was stuck at 1.21, real state 1.23) Open afterwards: 3 missing Datapath stories + re-apply, quotes on 16 story records (list to Joe), slug slash on page 467. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
58 lines
2.1 KiB
PHP
58 lines
2.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Evomedien\Vitec\Import;
|
|
|
|
use TYPO3\CMS\Core\Database\ConnectionPool;
|
|
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
|
|
|
/**
|
|
* Joe's solution/market workbooks fill the product slots with FAMILY labels
|
|
* ("VSN Platforms", "End Points", "OG Platform"), not record titles. One
|
|
* card renders one product record, so every family maps to its
|
|
* representative product here - an editorial mapping (Olli, 2026-10-19),
|
|
* deliberately versioned next to the importers that read the workbooks
|
|
* instead of hidden in database state. Both workbook importers consult it
|
|
* AFTER their exact title match, so a real record title always wins.
|
|
*
|
|
* Keys are normalised like the importers' norm(): lowercase, '+' -> plus,
|
|
* everything non-alphanumeric stripped. Values are product slugs - stable
|
|
* across environments, unlike uids.
|
|
*/
|
|
final class ProductFamilyAliases
|
|
{
|
|
private const MAP = [
|
|
'vsnplatforms' => 'vsn-v3',
|
|
'visionsc' => 'visionsc-uhd2',
|
|
'visionio' => 'visionio-sd14',
|
|
'wallcontrol' => 'aetria-wallcontrol',
|
|
'imagegraphics' => 'image-4k',
|
|
'xseries' => 'fx4',
|
|
'endpoints' => 'avedia-end-points',
|
|
'mgwproductfamily' => 'mgw-ace-encoder',
|
|
'diamondip' => 'diamond-ip-og-ip-to-ip-encoder',
|
|
'ogplatform' => 'mgw-diamond-og-sdi-composite-blade-encoder',
|
|
'capturecards' => 'visionav-hd',
|
|
];
|
|
|
|
/**
|
|
* @return array<string,mixed>|null the aliased product row, or null when
|
|
* the label is no known family
|
|
*/
|
|
public static function resolve(string $normalisedLabel): ?array
|
|
{
|
|
$slug = self::MAP[$normalisedLabel] ?? null;
|
|
if ($slug === null) {
|
|
return null;
|
|
}
|
|
$row = GeneralUtility::makeInstance(ConnectionPool::class)
|
|
->getConnectionForTable('tx_vitec_domain_model_product')
|
|
->fetchAssociative(
|
|
'SELECT * FROM tx_vitec_domain_model_product WHERE deleted = 0 AND slug = ?',
|
|
[$slug]
|
|
);
|
|
return $row ?: null;
|
|
}
|
|
}
|