Success-story migration + new plugins + JSON/UX polish

- Success Stories: full migration from old site (48/48, audited),
  markets n:n, quotation content block, columns content block,
  pretty SEO detail URLs via SuccessStoryPathRewrite middleware,
  list/detail split (list page 4 / story page), detailUrl/backUrl
- New plugins: VITEC Locations (grid/list/map + RTE map text),
  VITEC Customer Logos (color/bw logic, only-show-selected),
  VITEC Card (one plugin for product/story/market/solution
  with reloading FlexForm + custom backend preview renderer)
- Eventlist: layout dropdown (list/grid/teaserbar) in settings
- Hero section CB: Images/Video tabs, background video + overlay
- Product JSON: full category rootline (parents), fixed missing
  ConnectionPool import (all-products crash), category tree map
- Backend preview CSS: container-query responsive (narrow columns)
- Docs: ISO architecture spec, root + extension READMEs

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
khaccountandClaude Fable 5 committed 2026-07-24 09:53:33 +02:00
1 parent aafcb5dcb6
commit eae40f4286
110 files changed
+8502 -279

No files matched your search

+73
View File
@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Customer Logos Settings</sheetTitle>
<type>array</type>
<el>
<settings.layout>
<label>Layout</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<label>List</label>
<value>list</value>
</numIndex>
<numIndex index="1">
<label>Grid</label>
<value>grid</value>
</numIndex>
<numIndex index="2">
<label>Carousel</label>
<value>carousel</value>
</numIndex>
<numIndex index="3">
<label>Marquee (scrolling ticker)</label>
<value>marquee</value>
</numIndex>
</items>
<default>grid</default>
</config>
</settings.layout>
<settings.customers>
<label>Highlighted Customers</label>
<description>Empty = all logos black &amp; white. Selected customers are shown in color, in front of the remaining (b/w) logos.</description>
<config>
<type>select</type>
<renderType>selectMultipleSideBySide</renderType>
<foreign_table>tx_vitec_domain_model_customer</foreign_table>
<foreign_table_where>AND tx_vitec_domain_model_customer.hidden = 0 AND tx_vitec_domain_model_customer.deleted = 0 ORDER BY tx_vitec_domain_model_customer.title</foreign_table_where>
<size>8</size>
<minitems>0</minitems>
<maxitems>999</maxitems>
</config>
</settings.customers>
<settings.onlySelected>
<label>Only show selected</label>
<description>Show only the highlighted customers — the remaining (b/w) logos are omitted entirely.</description>
<config>
<type>check</type>
<default>0</default>
</config>
</settings.onlySelected>
<settings.debug>
<label>Allow Debug Output</label>
<config>
<type>check</type>
<default>0</default>
</config>
</settings.debug>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -9,6 +9,29 @@
<sheetTitle>Event List Settings</sheetTitle>
<type>array</type>
<el>
<settings.layout>
<label>Layout</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<label>List View</label>
<value>list</value>
</numIndex>
<numIndex index="1">
<label>Grid View</label>
<value>grid</value>
</numIndex>
<numIndex index="2">
<label>Teaser Bar</label>
<value>teaserbar</value>
</numIndex>
</items>
<default>list</default>
</config>
</settings.layout>
<settings.daysinadvance>
<label>Days in advance (0 = no limit)</label>
<description>Only show upcoming events starting within the next N days, e.g. 60.</description>
+57
View File
@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Locations Settings</sheetTitle>
<type>array</type>
<el>
<settings.variant>
<label>Display Variant</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<label>Grid</label>
<value>grid</value>
</numIndex>
<numIndex index="1">
<label>List</label>
<value>list</value>
</numIndex>
<numIndex index="2">
<label>Map</label>
<value>map</value>
</numIndex>
</items>
<default>grid</default>
</config>
</settings.variant>
<settings.maptext>
<label>Map Text</label>
<description>Rich text shown alongside the map (Map variant only).</description>
<displayCond>FIELD:settings.variant:=:map</displayCond>
<config>
<type>text</type>
<rows>8</rows>
<enableRichtext>1</enableRichtext>
</config>
</settings.maptext>
<settings.debug>
<label>Allow Debug Output</label>
<config>
<type>check</type>
<default>0</default>
</config>
</settings.debug>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
+146
View File
@@ -0,0 +1,146 @@
<?xml version="1.0" encoding="UTF-8"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Card Settings</sheetTitle>
<type>array</type>
<el>
<settings.modelType>
<label>Card Type</label>
<onChange>reload</onChange>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<label>Product</label>
<value>product</value>
</numIndex>
<numIndex index="1">
<label>Success Story</label>
<value>story</value>
</numIndex>
<numIndex index="2">
<label>Market</label>
<value>market</value>
</numIndex>
<numIndex index="3">
<label>Solution</label>
<value>solution</value>
</numIndex>
</items>
<default>product</default>
</config>
</settings.modelType>
<settings.product>
<label>Product</label>
<displayCond>FIELD:settings.modelType:=:product</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<label>— please choose —</label>
<value>0</value>
</numIndex>
</items>
<foreign_table>tx_vitec_domain_model_product</foreign_table>
<foreign_table_where>AND tx_vitec_domain_model_product.hidden = 0 AND tx_vitec_domain_model_product.deleted = 0 ORDER BY tx_vitec_domain_model_product.title</foreign_table_where>
</config>
</settings.product>
<settings.story>
<label>Success Story</label>
<displayCond>FIELD:settings.modelType:=:story</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<label>— please choose —</label>
<value>0</value>
</numIndex>
</items>
<foreign_table>tx_vitec_domain_model_usecase</foreign_table>
<foreign_table_where>AND tx_vitec_domain_model_usecase.hidden = 0 AND tx_vitec_domain_model_usecase.deleted = 0 ORDER BY tx_vitec_domain_model_usecase.title</foreign_table_where>
</config>
</settings.story>
<settings.market>
<label>Market</label>
<displayCond>FIELD:settings.modelType:=:market</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<label>— please choose —</label>
<value>0</value>
</numIndex>
</items>
<foreign_table>tx_vitec_domain_model_market</foreign_table>
<foreign_table_where>AND tx_vitec_domain_model_market.hidden = 0 AND tx_vitec_domain_model_market.deleted = 0 ORDER BY tx_vitec_domain_model_market.title</foreign_table_where>
</config>
</settings.market>
<settings.solution>
<label>Solution</label>
<displayCond>FIELD:settings.modelType:=:solution</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<label>— please choose —</label>
<value>0</value>
</numIndex>
</items>
<foreign_table>tx_vitec_domain_model_solution</foreign_table>
<foreign_table_where>AND tx_vitec_domain_model_solution.hidden = 0 AND tx_vitec_domain_model_solution.deleted = 0 ORDER BY tx_vitec_domain_model_solution.title</foreign_table_where>
</config>
</settings.solution>
<settings.layout>
<label>Layout</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<label>Vertical (image top)</label>
<value>vertical</value>
</numIndex>
<numIndex index="1">
<label>Horizontal (image left)</label>
<value>horizontal</value>
</numIndex>
<numIndex index="2">
<label>Image Overlay</label>
<value>overlay</value>
</numIndex>
<numIndex index="3">
<label>Compact</label>
<value>compact</value>
</numIndex>
</items>
<default>vertical</default>
</config>
</settings.layout>
<settings.debug>
<label>Allow Debug Output</label>
<config>
<type>check</type>
<default>0</default>
</config>
</settings.debug>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -8,6 +8,17 @@
</sheetTitle>
<type>array</type>
<el>
<settings.backPid>
<label>Back to List View (page)</label>
<description>Page that holds the Success Story list plugin. Used to build the back link in the JSON output.</description>
<config>
<type>group</type>
<allowed>pages</allowed>
<size>1</size>
<maxitems>1</maxitems>
</config>
</settings.backPid>
<settings.debug>
<label>Allow Debug Output.</label>
<config>
@@ -19,20 +30,6 @@
</items>
</config>
</settings.debug>
<settings.usecase>
<label>
Usecase
</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_vitec_domain_model_usecase</foreign_table>
<foreign_table_where>AND tx_vitec_domain_model_usecase.hidden = 0 AND tx_vitec_domain_model_usecase.deleted = 0 ORDER BY tx_vitec_domain_model_usecase.title</foreign_table_where>
<size>1</size>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.usecase>
<settings.layout>
<label>
Layout
@@ -6,6 +6,17 @@
<sheetTitle>Usecase List</sheetTitle>
<type>array</type>
<el>
<settings.singlePid>
<label>Single PID (detail page)</label>
<description>Page that holds the "Show single VITEC Success Story" plugin. Used to build the detail links in the JSON output.</description>
<config>
<type>group</type>
<allowed>pages</allowed>
<size>1</size>
<maxitems>1</maxitems>
</config>
</settings.singlePid>
<settings.debug>
<label>Allow Debug Output.</label>
<config>