8f8ae039d458ebf4556640a32abd53d3e874b7a5
16
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
77661bf0b6 |
Datapath stories, grid repairs, menu v2 pure, hero placeholders, fec test
Batch of 2026-10-28/29 plus 2026-11-03: - NEW vitec:import-datapath-stories: 22 story packages from the agency dump (docx + Links/ assets) as usecase records with content, quotes, images, customer logos, download cards; --repair-quotes normalizes attribution lines; asset backfill for existing stories - /products grid incident repaired (fix_products_grid, fix_graphics_grid, check_grid_page): containers unhidden, 46 duplicate cards soft-deleted, section order restored; BuildProductPortfolio and ImportProductCategoryPages now GUARD against re-runs on pages that already carry vitec_cols_% containers - ' double-encoding fixed: render-pipeline importers write literal apostrophes (ENT_NOQUOTES), fix_double_entities literalizes existing rows - ticket quick wins (ticket_quickwins_20261028), broadcast market page cleanup, AttachCardImages market-card handling, SubmarketWorkbook META REPAIR, story content/video fixes (fix_story_*) - ProvideProductCatalog: transitional v1 fields removed (categories uid/link, legacyGroupFields, item products teaser) - pure v2 shape (ticket 0024-FE); search renderer keeps its teaser - BuildProductOverviews: heroes get the numbered placeholder background (placeholders/pages/<uid>-01.png, wide grey fallback) - backfill on existing pages with empty hero_bgimage, attached at creation for new pages; existing references always win (ticket 0026-FE); 40 placeholder PNGs shipped to fileadmin (not tracked) - AttachPageMedia: --depth=3 with sysfolders as pass-through parents for the overview pages' -08 menu tiles - NEW migrations/fec_isolation_test.sh: two-user live test proving fe_comment ticket isolation (backend verified tight, cross-user sighting traced to the FE page-JSON cache, ticket 0027-BE) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
e2d4367d7a |
Products run: missing records, asset re-run, audit page, category pages
- new vitec:create-missing-products: MGW Diamond TOUGH, MGW Pico TOUGH, MGW Pico+ TOUGH and X-View Integrated Displays as visible records (teaser drafts, pid and sys_category assignments copied from the sibling product; titles equal the Dropbox folder names so the image importer matches immediately). IQS4 stays out - its delivery folder is empty, question to Joe - asset re-run via vitec:import-product-images after re-staging the Dropbox delivery (the misfiled Diamond-OG banner corrected into the OG inbox folder again): new photos for 95-Series, Avedia chassis, SFF PRISM and the new TOUGH/X-View records - new migrations/build_product_audit.php: generates the internal product-asset audit at /product-audit/ (same basic auth, same-origin thumbnails) - one row per record with thumbnail, detail link, badges for hero/photos/texts/resources/datasheets/solutions, flags, stats and client-side filters; re-run any time - new vitec:import-product-category-pages: builds the nine /products/<category> pages (frontend layout 9, hero/main/preFooter) from the agency "Product Category Pages" workbooks - intro paragraphs, Why-VITEC / product / solution cards, the comparison rows as ONE text element with a plain table (no comparison CType exists; FE styles it), prefooter banner to /contact, full page properties, page sorting per sitemap 3.1-3.9; the empty shells #455 and #457 are reused. Product card links resolve record-first (exact title, stripped parenthesis, family alias, unique slug prefix); ProductFamilyAliases gains ten category-level family labels. Solution cards tolerate US/UK spelling (center/centre, visualization/ visualisation). Applied and verified live (nine routes, links, tables, meta) - known gaps reported, queued for Joe: IQS4, Media Players (93/94), Chassis Systems, Express Backplanes, Accessories & Cables, PCIe Encoders, VMS Plugins & Integrations; the Vision family card awaits a flagship decision Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
6b0b2a3511 |
Engagament rename; redirects installed, CLI-queued and backfilled
- new generic vitec:rename-page --page=<uid|slug> --title="...": renames a page, recalculates its own slug from the parent slug plus the new title and cascades every descendant slug - the gap a backend rename leaves open. Used to fix the "Engagament" page (#465): title, own slug and five child slugs in one run, verified live (zero occurrences left in the JSON) - SubsolutionWorkbookImporter::norm() tolerates the engagament spelling: the 39 delivered workbook metas carry the old page title, re-imports keep matching (verified) - typo3/cms-redirects installed - it had NEVER been installed, so every "redirect follows" of the 10-23 renames was wishful thinking and all old URLs answered 404. Backend slug changes now auto-create redirects - EXT:redirects' auto-creation does not fire for CLI DataHandler runs, so vitec:rename-page, vitec:normalize-slugs and vitec:align-market-pages now queue their 301 sys_redirect rows themselves in the same DataHandler run - new one-off vitec:backfill-redirects: the 28 paths vacated on 2026-10-23/26, reconstructed from the command protocols, guarded against existing redirects and live slugs; applied and verified. Note the headless semantics: a redirect arrives as the JSON envelope {"redirectUrl": ..., "statusCode": 301} with HTTP 200 - the front end must act on redirectUrl (briefing updated) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
303defe24d |
Markets branch: 11-market tree, sub-market import, hero pipeline
Structure per the agency agreement (Joe/Christina, confirmed 2026-10-23): /markets -> eleven market hero pages -> their sub-market pages; the use-case level stays sections on the sub-market pages. - new vitec:align-market-pages: renames 8 main market pages onto the agency names (slug change -> EXT:redirects), creates the 3 new markets, hides the dropped "Security & Surveillance" (records/stories untouched), reports unknown children. A child-slug pass realigns every child to <parent-slug>/<slugified-title> (DataHandler does not cascade slug changes; this also repaired the third embedded-slash slug, rtcc-/-rtic). --publish unhides the tree (dev convenience; element shells stay hidden) - sub-market import: all 24 agency workbooks applied (4 existing pages, 20 created) - their Meta sheets were clones of Corporate Environments (record_uid 32) and were repaired beforehand (market/sub-market set, record_uid 0; the record taxonomy alignment is a separate step) - SubmarketWorkbookImporter: page-properties parity (og/twitter titles and descriptions, canonical, abstract from the intro copy) and a placeholder upgrade pass - pages created in the same run only get the generic grey (their uid is still NEW), the re-run swaps it for the numbered per-page placeholder - new market hero pipeline: frontend layout 23 "Market Hero Page" (zones hero=colPos1, main=colPos0), Import\MarketHeroPageImporter + vitec:import-market-hero-workbooks (inbox migrations/markethero_xlsx_in, gitignored). Hero H1 travels on the introparagraph header (markethero has no headline field), the hero CTA anchors #submarkets, sub-market cards link their child page via t3://page, customerlogos and usecaselist ship hidden until filled editorially, prefooter ctabanner; full page-properties set with 11 curated keyword sets - applied end to end and live-verified (layout 23 heroes with linked cards, layout 21 sub pages with all six colPos groups, clean slugs) - spec v1.25 Open: market RECORD taxonomy (story badges / Solr facets still use the old 9 mains), featured product "ISR Video Mission Commander" has no record, the /markets main page workbook (template 2) is a separate flow. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
3e2ebf3823 |
Solution group pages: layout 22 + Template-06 workbook import
- new frontend layout 22 "Solution Group Page" (provider LAYOUT_MAP, TCA layout item, locallang_pages.xlf; zones hero=colPos1, main=colPos0 like layout 5 so the front end reuses its components) - new pipeline Import\SolutionGroupPageImporter + vitec:import-solution-group-workbooks (inbox migrations/solutiongroups_xlsx_in/, gitignored): reads the agency "Template 06" group workbooks by column-A label scan, resolves the group via "Hero H1" -> is_group record -> detail_page (pages must exist), cursor-based slotNext() allows repeated CTypes per column - element plan per page: markethero (+#capabilities CTA anchor) + hero intro paragraph; intro + supporting 50/50; challenges header + 4 text_only cards; capabilities header + 4 alternating horizontal cards (bullets as <ul>); usecaselist shipped HIDDEN (an empty selection would list ALL stories - editors pick, then unhide); marketinsights; prefooter ctabanner. Page properties as on the sub-solution pages, 8 curated keyword sets - 56 numbered grey placeholders for pages 459-466 (7 slots per page) - applied to all 8 group pages, live-verified on 459/465; the solutions branch is now content-complete (groups + 39 details) - spec v1.24 (revision row, head/footer) Found on the way: the "Engagament" typo lives in page 465's title AND slug; the record is spelled correctly. Fix needs coordination with the sub-solution workbook metas - own task, not done here. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
d115ffb144 |
Sub-solutions filled from Joe's 39 workbooks; dummy assets wired
- 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> |
||
|
|
8e67f5db23 |
Sub-solution workbook pipeline on layout 5, fix element order in both importers
- New, deliberately separate pipeline for sub-solutions (markets and solutions must never break each other): generator vitec:generate-subsolution-workbooks (list from the page tree below /solutions, 39 workbooks, every sub-solution matched to its record), SubsolutionWorkbookImporter + CLI vitec:import-subsolution-workbooks, and a "Sub-Solutions" tab in the VITEC Import module with its own inbox migrations/subsolutions_xlsx_in/ - Targets the existing template 5 "Solution Detail" without changing it: hero element in colPos 1, the remaining sections in fixed order in colPos 0, found again by CType on re-import; existing empty sub-solution pages are switched to layout 5, missing ones created hidden; detail_page set on the solution record - Workbook per the Figma "07 Solution Detail page": hero without video teaser, intro with headline and without learn-more/portfolio, extended icon list, own page-layout reference image - Shared content elements: market hero/intro/insights relabelled "Market/Solution", market intro gains the optional intro_headline field (new column, requires extension:setup) - Fix: DataHandler puts every NEW record with a positive pid at the top of its column, so pages built in one run came out reversed. Both importers now track the page order per colPos and write tt_content.sorting explicitly after the DataHandler run; re-applying repairs pages imported earlier (verified on the control-room sub-solution and sub-market page 443) - migrations/fill_test_subsolution.php: realistic test content from vitec.com copy and images for the control-room sub-solution - Docs section 5z |
||
|
|
3d5459b8d2 |
Sub-market workbook import as a backend module tab
- Extract the complete import logic (label-scan reading, page find-or-create, slot filling, content-idempotent image attach) from ImportSubmarketWorkbooksCommand into the shared service SubmarketWorkbookImporter; the CLI command and the new controller are thin shells around importFile(), so both entry points cannot drift. CLI regression verified: identical dry-run report for the reference workbook (12 elements, page 443) - New "Sub-Markets" tab in the VITEC Import module (SubmarketImportController + Import/Submarkets.html): upload multiple filled workbooks into the SAME inbox the CLI uses (migrations/submarkets_xlsx_in/), per-file checkboxes, dry-run and apply buttons, result cards with the familiar report and a direct link into the page module; backend dry-run verified against the CLI - Submitted filenames are whitelisted against the actual directory listing (no path traversal); uploads restricted to sanitized .xlsx basenames - Routes submarkets/submarket_upload/submarket_process in Modules.php, Sub-Markets tab link in the sibling module views, ok/danger badge colors in backend-import.css - Docs section 5y (incl. operations note: apply in small batches in the module, mass runs via CLI - image downloads run inside the web request) |
||
|
|
3df66b1353 |
Product texts: mapping completed; product model: solutions + resources
Two work packages, one deploy.
Workbook field mapping completed (2026-09-18)
- highlights <- g:Technical Highlight (new spec-row component of the
full agency delivery; composeGroup() is generic, no change needed)
- applications <- g:Why Choose Card (benefit cards as one block)
- seometa <- new composed source x:seometa (Introduction body trimmed
at a word boundary to ~155 chars - the SEO sheet ships no meta
description, a trimmed intro beats an empty tag)
- teaser stays the hero one-liner, settling the varchar(255) question
- fix: "Save mapping" now merges over the stored mapping instead of
overwriting it - an empty dropdown no longer wipes a stored selector
Product model: solutions relation and Resources tab (2026-09-24)
- closes the gaps the full workbook walkthrough exposed (rows the
import deliberately skips because the model had no place for them)
- solutions: MM multi select to tx_vitec_domain_model_solution
(tx_vitec_product_solution_mm, relatedprodukt pattern), emitted by
both product renderers as solution cards in the shared shape
- Resources tab: inline child table tx_vitec_product_resource - per
entry a type (documentation/support/datasheet), editable card title
and text, an icon (free text with a value-picker seed set) and one
link (page/url/file/record via the link wizard, so the Download tab
works too). Deliberately no Extbase model: only the UserFunc path
reads the rows.
- JSON `resources` (detail payload only, like heroimage): list envelope
{layout, items[]}; a card whose link is empty or unresolvable is not
emitted; layout switches to carousel above three cards
- spec raised to v1.18 (7.15 member table, revision row; the footer had
been stuck at v1.15 since 1.16/1.17)
Requires on the server:
vendor/bin/typo3 database:updateschema "*.add,*.change"
vendor/bin/typo3 cache:flush
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
||
|
|
5499ca54af |
Align product records with sitemap V2; product family model; CLI workbook import
- vitec:migrate-product-structure: exact V2 titles, Milestone typo fix (incl. slug), QTX100 stray VSN category removed, Aligo record moved to its own category with slug /product/aligo, new Aligo Workstation record takes over /product/aligo-workstation - product families (sitemap column K) are ordinary content pages now: vitec:remove-family-records deletes the interim landing records again, reset_subproduct_flags.php clears the misused subproduct flag (the list renderer has always excluded subproduct=1) - vitec:import-product-workbook: non-interactive counterpart of the module import (same reader, mapping and DataHandler path); Arqa imported, Aligo re-applied with the corrected capabilities markup - ProductXlsxReader: new :copy cell selector (Body Copy with CTA fallback) absorbs the agency's column drift; default teaser mapping uses it - ProductListJsonRenderer: selected categories now match their whole subtree, results ordered by category tree position, sheet order within a category - read-only diagnostics: check_product_structure.php, check_productlist_ces.php |
||
|
|
7833e1b668 | Product import | ||
|
|
7442d10e68 |
SEO record links; story markets repair; story page titles
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
|
||
|
|
7bd1161abf |
Product text import from agency XLSX workbooks
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 |
||
|
|
4ef3ad0026 | Backend Modul Worpress Import added | ||
|
|
1011162bb1 |
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. The module ships its own CSS (backend-import.css, loaded only by this module) using the frontend button palette from _vitec.scss: orange #f47937 for primary actions, navy #26358c for secondary actions and structure. The stray <h2>Hi</h2> debug leftover in the shared backend layout is removed (also affects the OG Image module). A fourth tab "SEO Research" handles the recurring keyword-research CSV. It is deliberately not an import mask - the file carries research only (no meta title/description yet). Each upload is persisted as a delivery (tx_vitec_seo_research, never deleted) and evaluated: diff against the previous delivery keyed by URL, a structure check of the CSV tree against TYPO3 (pages by slug path; market/solution/product rows against the domain tables, matched by slug then normalized title), and the three work lists from the SEO flags (quick wins by GSC impressions, shared terms grouped by keyword, already ranking). CsvReader now deduplicates repeated header names, which that CSV has. New CLI command vitec:create-markets: creates the market records the structure check reports as missing, sourced from the stored delivery and matched through the same SeoResearchService - what the module lists is what the command creates. Each market gets a sys_category of the same title, found anywhere under the auto-detected market category root or created; sub-market categories are created under the parent market's category, so the category tree carries the hierarchy the flat market model cannot. Idempotent, dry-run first. New CLI commands vitec:create-markets and vitec:market-dummy-image. create-markets creates the market records the structure check reports as missing (root detection three-staged: option, auto-detect, find or create a "Markets" category). market-dummy-image assigns a shared placeholder (white logo on brand navy, fileadmin/placeholders/) to every market without an image - one sys_file for all, replacing the file restyles every placeholder at once. Both idempotent. Deliberately out of v1: import log with three-way compare (protection against overwriting manual edits), images/relations, multiple saved mappings per model. |
||
|
|
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> |