Preparation for TYPO3 14, which drops list_type. The plugins are registered as CTypes named like their former list_type values (epproducts_product_detail etc.); the form keeps the fields of the "list" type, with the plugin options in place of the plugin selector. As content element types they show the E&P logo of the extension manager (icon ep-products-plugin) instead of the generic plugin icon. The upgrade wizard epProductsPluginListTypeToCType moves the elements and the tt_content:list_type permissions of backend groups. Until it has run, list_type elements render through the new types (alias block in ext_localconf.php), so the deploy alone changes nothing. Retired plugins stay "list" elements. The content-only page type, the content manifest and the two container columns limited to "list" now treat the epproducts_* types as plugins. Crawl of 1,912 URLs identical for old code and new code before and after the wizard; rehearsed again on the prod dump of 2026-11-01 (1,924 URLs, API snapshot identical). Rollout and rollback SQL: .ddev/plans/PLUGINS-CTYPE-ROLLOUT.md. Co-Authored-By: Claude Opus 5.5 <[email protected]>
64 lines
2.7 KiB
Plaintext
64 lines
2.7 KiB
Plaintext
# Chatbot content feed: the main content of a page, without header, navigation, footer or
|
|
# assets. Fetched by MyE&P for pages the content manifest reports as changed; protected by
|
|
# EP\EpProducts\Middleware\ContentPageTypeGuardMiddleware. See
|
|
# .ddev/plans/CHATBOT-MCP-01-TYPO3-CONTENT-FEED.md §6.
|
|
|
|
# Plugins (the booking widget on product detail pages), forms, sub-page menus and teaser cards
|
|
# are left out: MyE&P has trip data first-hand, and the pages and records the cards link to are
|
|
# in the feed in their own right. The filter applies to top-level elements only; a plugin nested
|
|
# in a grid or container element is still rendered by its parent. The ep_products plugins are content
|
|
# element types of their own (epproducts_*); "list" in the setting covers the retired plugins.
|
|
lib.contentOnly < lib.dynamicContent
|
|
lib.contentOnly.20.select.where = colPos={register:colPos} AND CType NOT IN ({$plugin.tx_eptheme.settings.contentOnlyExcludedCTypes}) AND CType NOT LIKE 'epproducts_%'
|
|
|
|
tx_eptheme_content_only = PAGE
|
|
tx_eptheme_content_only {
|
|
typeNum = 1730
|
|
config {
|
|
disableAllHeaderCode = 1
|
|
disablePrefixComment = 1
|
|
additionalHeaders.10.header = Content-Type: text/html; charset=utf-8
|
|
additionalHeaders.20.header = X-Robots-Tag: noindex, nofollow, noarchive
|
|
admPanel = 0
|
|
debug = 0
|
|
# Never written to disk: the type is key-protected, and a static file would be served
|
|
# by .htaccess without that check ever running.
|
|
tx_staticfilecache.disableCache = 1
|
|
# Same reason for shared caches between us and the consumer: the TYPO3 page cache is
|
|
# fine (the guard runs before it), a proxy storing a keyed response is not.
|
|
sendCacheHeaders = 0
|
|
additionalHeaders.30.header = Cache-Control: private, no-store
|
|
}
|
|
|
|
10 = COA
|
|
10 {
|
|
wrap = <article>|</article>
|
|
|
|
10 = TEXT
|
|
10.field = title
|
|
10.htmlSpecialChars = 1
|
|
10.wrap = <h1>|</h1>
|
|
|
|
# Page templates without a sidebar render colPos 0; the sidebar layouts render 3 (header),
|
|
# 4 (content) and 2 (sidebar). colPos 1 holds teaser groups and is left out. The page
|
|
# templates pass colPos in as data; here there is no template, so each copy sets it.
|
|
# These must be copies (<), not references (=<): removing colPos.cObject on a reference
|
|
# leaves the referenced cObject in place, and every column silently renders colPos 0.
|
|
20 < lib.contentOnly
|
|
20.5.colPos.cObject >
|
|
20.5.colPos = 3
|
|
|
|
30 < lib.contentOnly
|
|
30.5.colPos.cObject >
|
|
30.5.colPos = 0
|
|
|
|
40 < lib.contentOnly
|
|
40.5.colPos.cObject >
|
|
40.5.colPos = 4
|
|
|
|
50 < lib.contentOnly
|
|
50.5.colPos.cObject >
|
|
50.5.colPos = 2
|
|
}
|
|
}
|