{"id":116,"date":"2026-11-07T08:00:00","date_gmt":"2026-11-07T07:00:00","guid":{"rendered":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/"},"modified":"2026-10-16T14:00:13","modified_gmt":"2026-10-16T12:00:13","slug":"from-flux-page-templates-to-backend-layouts-and-pageview","status":"publish","type":"post","link":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/","title":{"rendered":"From flux page templates to backend layouts and PAGEVIEW"},"content":{"rendered":"<p>Hi folks,<\/p>\n<p>For many years my own site hoja.in ran on TYPO3 7.6 with flux, fluidpages and vhs. It was a one-page portfolio and flux was the hero of that time: you wrote one Fluid file, and the same file described the backend grid, the form fields and the frontend markup. When I moved the site to a fresh TYPO3 14.3 Composer project this year, I decided not to carry flux, fluidpages and vhs along. The core has everything a page template needs now: backend layouts, site sets and the <code>PAGEVIEW<\/code> content object.<\/p>\n<p>This post is about that one piece of the move: how each flux page template became a backend layout plus a PAGEVIEW template, and what I did with the values already stored on the pages.<\/p>\n<h2>Problems I faced<\/h2>\n<p>A flux page template is a normal Fluid file with a special <code>Configuration<\/code> section. Here is a shortened version of the old <code>Main.html<\/code> from my 2015 provider extension:<\/p>\n<pre><code class=\"language-html\">&lt;f:layout name=\"Page\" \/&gt;\n\n&lt;f:section name=\"Configuration\"&gt;\n    &lt;flux:form id=\"main\" \/&gt;\n    &lt;flux:grid&gt;\n        &lt;flux:grid.row&gt;\n            &lt;flux:grid.column colPos=\"0\" colspan=\"3\" name=\"main\" \/&gt;\n        &lt;\/flux:grid.row&gt;\n    &lt;\/flux:grid&gt;\n&lt;\/f:section&gt;\n\n&lt;f:section name=\"Main\"&gt;\n    &lt;v:page.menu levels=\"1\" as=\"sections\"&gt;\n        &lt;f:for each=\"{sections}\" as=\"section\"&gt;\n            &lt;section id=\"...\"&gt;\n                &lt;v:content.render pageUid=\"{section.uid}\" \/&gt;\n            &lt;\/section&gt;\n        &lt;\/f:for&gt;\n    &lt;\/v:page.menu&gt;\n&lt;\/f:section&gt;<\/code><\/pre>\n<p>Three things are hidden in there, and all three need a new home:<\/p>\n<ol>\n<li><strong>The backend grid<\/strong> (<code>flux:grid<\/code>) is what the page module showed to editors.<\/li>\n<li><strong>The template selection<\/strong> was not stored in <code>backend_layout<\/code> the normal way. Flux wrote <code>fluidpages__fluidpages<\/code> into <code>pages.backend_layout<\/code> and the real choice into its own fields <code>tx_fed_page_controller_action<\/code> and <code>tx_fed_page_controller_action_sub<\/code>, with values like <code>Harvisoft.Templates-&gt;main<\/code>.<\/li>\n<li><strong>The rendering<\/strong> used vhs ViewHelpers for menus and content.<\/li>\n<\/ol>\n<p>If you just remove flux, the page module shows an empty layout, the frontend has no template and, worse, the next database compare offers to drop the <code>tx_fed_*<\/code> columns. After that the information which page used which template is gone.<\/p>\n<h2>Solution<\/h2>\n<h3>Step 1: Make an inventory before you remove anything<\/h3>\n<p>I booted the old 7.6 site in a separate DDEV project with the live dump, so I could query it freely. One query shows which template each page really uses:<\/p>\n<pre><code class=\"language-sql\">SELECT uid, pid, title, backend_layout, backend_layout_next_level,\n       tx_fed_page_controller_action, tx_fed_page_controller_action_sub\nFROM pages\nWHERE deleted = 0 AND tx_fed_page_controller_action &lt;&gt; ''\nORDER BY uid;<\/code><\/pre>\n<p>On hoja.in the answer was short. The root page and the &#8220;About&#8221; page used <code>Harvisoft.Templates-&gt;main<\/code>, two hidden helper pages had <code>-&gt;main<\/code> or <code>-&gt;inner<\/code>, and the <code>Inner<\/code> template had an empty <code>Main<\/code> section anyway. So two flux templates became one backend layout. On a bigger site you will likely get a longer list; write down one target backend layout per template that is really used, and drop templates nobody selects.<\/p>\n<p>Check the content too. Flux stored content of nested grids with its own colPos value <code>18181<\/code> and the <code>tx_flux_parent<\/code> and <code>tx_flux_column<\/code> fields. On my site only two records lived there: a carousel that never showed up on the live site (my smoke test baseline proved it) and one text element. I did not import them. On your site this may be the biggest part of the job, so look before you plan.<\/p>\n<h3>Step 2: One backend layout per template, in the site set<\/h3>\n<p>Since TYPO3 13.1 a site set can ship its own <code>page.tsconfig<\/code>, so the backend layout lives next to the TypoScript of the same set. This is the real definition from the new sitepackage (<code>Configuration\/Sets\/Sitepackage\/page.tsconfig<\/code>), slightly shortened:<\/p>\n<pre><code class=\"language-typoscript\">mod.web_layout.BackendLayouts {\n  Default {\n    title = One-page section\n    icon = EXT:sitepackage\/Resources\/Public\/Icons\/Extension.svg\n    config {\n      backend_layout {\n        colCount = 1\n        rowCount = 1\n        rows {\n          1 {\n            columns {\n              1 {\n                name = Main content\n                colPos = 0\n                identifier = main\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>The <code>identifier<\/code> of the column is important for v14. It becomes the name of the content area in the template, so give it a short and stable name like <code>main<\/code>, <code>sidebar<\/code> or <code>stage<\/code>. Keep the colPos numbers of the old flux grid where you can, then existing content lands in the right column without any update.<\/p>\n<h3>Step 3: Let PAGEVIEW find the template<\/h3>\n<p><code>PAGEVIEW<\/code> arrived in TYPO3 13.1. It resolves the template from the backend layout of the current page: a page with the layout <code>pagets__Default<\/code> gets <code>Pages\/Default.html<\/code> from the configured path. Layouts and partials are looked up in <code>Layouts\/<\/code> and <code>Partials\/<\/code> under the same path. The TypoScript of the set is small:<\/p>\n<pre><code class=\"language-typoscript\">page = PAGE\npage {\n  10 = PAGEVIEW\n  10 {\n    paths.10 = EXT:sitepackage\/Resources\/Private\/PageView\/\n\n    dataProcessing {\n      10 = menu\n      10 {\n        entryLevel = 0\n        levels = 1\n        as = sections\n      }\n    }\n  }\n}\n\n# Content of one section page, rendered with that page record as data\nlib.sectionContent = CONTENT\nlib.sectionContent {\n  table = tt_content\n  select {\n    pidInList.field = uid\n    where = {#colPos} = 0\n    orderBy = sorting\n  }\n}<\/code><\/pre>\n<p>The menu processor replaced <code>v:page.menu<\/code>, and the small <code>CONTENT<\/code> object replaced <code>v:content.render pageUid=\"\u2026\"<\/code>, because a one-page site renders the content of its subpages. For the content of the current page, TYPO3 14.2 added the <code>{content}<\/code> variable (one object per column identifier) and the <code>f:render.contentArea<\/code> ViewHelper. The new <code>Pages\/Default.html<\/code> looks like this:<\/p>\n<pre><code class=\"language-html\">&lt;html xmlns:f=\"http:\/\/typo3.org\/ns\/TYPO3\/CMS\/Fluid\/ViewHelpers\" data-namespace-typo3-fluid=\"true\"&gt;\n&lt;f:layout name=\"Page\" \/&gt;\n\n&lt;f:section name=\"Main\"&gt;\n    &lt;f:render.contentArea contentArea=\"{content.main}\" \/&gt;\n\n    &lt;f:for each=\"{sections}\" as=\"section\"&gt;\n        &lt;section id=\"{section.title -&gt; f:replace(search: ' ', replace: '')}\"&gt;\n            &lt;f:cObject typoscriptObjectPath=\"lib.sectionContent\" data=\"{section.data}\" \/&gt;\n        &lt;\/section&gt;\n    &lt;\/f:for&gt;\n&lt;\/f:section&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>If you are still on v13, <code>{content}<\/code> and <code>f:render.contentArea<\/code> are not there yet; render the column with a <code>CONTENT<\/code> object like above. Also note that Fluid 5 in v14 prefers <code>Default.fluid.html<\/code> if both files exist, and falls back to <code>Default.html<\/code>. Pick one style per folder, or you will edit the wrong file one day. Ask me how I know \ud83d\ude42<\/p>\n<h3>Step 4: Migrate the stored values<\/h3>\n<p>Now the pages must point to the new layout. For an in-place upgrade, run this <strong>before<\/strong> you uninstall flux and before any database compare removes the <code>tx_fed_*<\/code> columns. It maps the flux selection to the new identifiers, for the page itself and for its subpages:<\/p>\n<pre><code class=\"language-sql\">UPDATE pages\nSET backend_layout = CASE tx_fed_page_controller_action\n        WHEN 'Harvisoft.Templates-&gt;main' THEN 'pagets__Default'\n        WHEN 'Harvisoft.Templates-&gt;inner' THEN 'pagets__Default'\n        ELSE backend_layout\n    END,\n    backend_layout_next_level = CASE tx_fed_page_controller_action_sub\n        WHEN 'Harvisoft.Templates-&gt;main' THEN 'pagets__Default'\n        WHEN 'Harvisoft.Templates-&gt;inner' THEN 'pagets__Default'\n        ELSE backend_layout_next_level\n    END\nWHERE backend_layout = 'fluidpages__fluidpages'\n   OR backend_layout_next_level = 'fluidpages__fluidpages';<\/code><\/pre>\n<p>Take a database dump first, and compare the counts before and after. Pages that still carry <code>fluidpages__fluidpages<\/code> afterwards need a decision by hand.<\/p>\n<p>hoja.in did not get an in-place upgrade. I imported the content into a fresh v14 database with a script, so the mapping is one line in that script: the root page gets <code>pagets__Default<\/code> in both fields and every subpage inherits it through <code>backend_layout_next_level<\/code>. Same idea, fewer moving parts.<\/p>\n<pre><code class=\"language-php\">'backend_layout' =&gt; (int)$p['uid'] === ROOT_PAGE ? 'pagets__Default' : '',\n'backend_layout_next_level' =&gt; (int)$p['uid'] === ROOT_PAGE ? 'pagets__Default' : '',<\/code><\/pre>\n<h3>Step 5: Check it with real pages<\/h3>\n<p>Open the page module for a few pages of each old template and see if the columns and content are where editors expect them. Then compare the frontend with the old site. For hoja.in I compared status codes, titles and sizes of all section pages against a baseline captured from the 7.6 copy; that is a separate post. The custom field <code>tx_templates_hide_from_scrollmenu<\/code> from the old <code>ext_tables.sql<\/code> also moved, now as <code>tx_sitepackage_hide_from_scrollmenu<\/code> in a TCA override, without any SQL file, because v13 creates columns from TCA.<\/p>\n<h2>What I would tell my 2015 self<\/h2>\n<p>Flux was a smart idea when backend layouts were clumsy. Today the core split is cleaner: the backend layout says which columns exist, PAGEVIEW picks the template by the layout name, and the template only renders. The migration itself is not hard. The real work is the inventory in step 1 and the nested flux content. Do those first and the rest is a one-evening job.<\/p>\n<p>If this post helped you to get rid of your last flux page, I will be really happy. Cheers!<\/p>\n<h2>Further reading<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.typo3.org\/c\/typo3\/cms-core\/main\/en-us\/Changelog\/13.1\/Feature-103504-NewContentObjectPageView.html\">Feature #103504: New ContentObject PAGEVIEW<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/c\/typo3\/cms-core\/main\/en-us\/Changelog\/14.2\/Feature-108726-IntroduceFluidRenderContentAreaViewHelper.html\">Feature #108726: f:render.contentArea ViewHelper<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/m\/typo3\/reference-coreapi\/main\/en-us\/ApiOverview\/BackendLayout\/Index.html\">Backend layouts in the TYPO3 core API reference<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/c\/typo3\/cms-core\/main\/en-us\/Changelog\/13.1\/Feature-103522-PageTSconfigProviderForSitesAndSets.html\">Feature #103522: Page TSconfig provider for sites and sets<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>How I replaced the flux page templates of hoja.in with core backend layouts and PAGEVIEW in TYPO3 v14, including the backend_layout values stored on existing pages.<\/p>\n","protected":false},"author":1,"featured_media":117,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[13,28,5,24,25],"class_list":["post-116","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-typo3","tag-fluid","tag-site-sets","tag-typo3","tag-typo3-v14","tag-upgrades"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Flux page templates to backend layouts and PAGEVIEW<\/title>\n<meta name=\"description\" content=\"Map each flux page template to a backend layout in page TSconfig, render it with PAGEVIEW in TYPO3 v14 and migrate the backend_layout values on old pages.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flux page templates to backend layouts and PAGEVIEW\" \/>\n<meta property=\"og:description\" content=\"Map each flux page template to a backend layout in page TSconfig, render it with PAGEVIEW in TYPO3 v14 and migrate the backend_layout values on old pages.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/\" \/>\n<meta property=\"og:site_name\" content=\"Hoja Mustaffa Abdul Latheef \u2013 Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-07T07:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/from-flux-page-templates-to-backend-layouts-and-pageview.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Hoja Mustaffa Abdul Latheef\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@hojaonline\" \/>\n<meta name=\"twitter:site\" content=\"@hojaonline\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hoja Mustaffa Abdul Latheef\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/\"},\"author\":{\"name\":\"Hoja Mustaffa Abdul Latheef\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"headline\":\"From flux page templates to backend layouts and PAGEVIEW\",\"datePublished\":\"2026-11-07T07:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/\"},\"wordCount\":996,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/from-flux-page-templates-to-backend-layouts-and-pageview.jpg\",\"keywords\":[\"fluid\",\"Site sets\",\"TYPO3\",\"TYPO3 v14\",\"Upgrades\"],\"articleSection\":[\"TYPO3\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/\",\"name\":\"Flux page templates to backend layouts and PAGEVIEW\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/from-flux-page-templates-to-backend-layouts-and-pageview.jpg\",\"datePublished\":\"2026-11-07T07:00:00+00:00\",\"description\":\"Map each flux page template to a backend layout in page TSconfig, render it with PAGEVIEW in TYPO3 v14 and migrate the backend_layout values on old pages.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/from-flux-page-templates-to-backend-layouts-and-pageview.jpg\",\"contentUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/from-flux-page-templates-to-backend-layouts-and-pageview.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Goodbye flux, hello PAGEVIEW\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/from-flux-page-templates-to-backend-layouts-and-pageview\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"From flux page templates to backend layouts and PAGEVIEW\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\",\"name\":\"Hoja Mustaffa Abdul Latheef \u2013 Blog\",\"description\":\"Notes from daily work with TYPO3, PHP and AI-assisted engineering\",\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/hoja.in\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\",\"name\":\"Hoja Mustaffa Abdul Latheef\",\"logo\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/image\\\/\"},\"description\":\"Senior TYPO3 Developer at jweiland.net, TYPO3 CMS Certified Developer. I write about TYPO3 upgrades, extension development, PHP and AI-assisted engineering with Claude Code.\",\"sameAs\":[\"https:\\\/\\\/hoja.in\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Flux page templates to backend layouts and PAGEVIEW","description":"Map each flux page template to a backend layout in page TSconfig, render it with PAGEVIEW in TYPO3 v14 and migrate the backend_layout values on old pages.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/","og_locale":"en_US","og_type":"article","og_title":"Flux page templates to backend layouts and PAGEVIEW","og_description":"Map each flux page template to a backend layout in page TSconfig, render it with PAGEVIEW in TYPO3 v14 and migrate the backend_layout values on old pages.","og_url":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/","og_site_name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","article_published_time":"2026-11-07T07:00:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/from-flux-page-templates-to-backend-layouts-and-pageview.jpg","type":"image\/jpeg"}],"author":"Hoja Mustaffa Abdul Latheef","twitter_card":"summary_large_image","twitter_creator":"@hojaonline","twitter_site":"@hojaonline","twitter_misc":{"Written by":"Hoja Mustaffa Abdul Latheef","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/#article","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/"},"author":{"name":"Hoja Mustaffa Abdul Latheef","@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"headline":"From flux page templates to backend layouts and PAGEVIEW","datePublished":"2026-11-07T07:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/"},"wordCount":996,"commentCount":0,"publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"image":{"@id":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/from-flux-page-templates-to-backend-layouts-and-pageview.jpg","keywords":["fluid","Site sets","TYPO3","TYPO3 v14","Upgrades"],"articleSection":["TYPO3"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/","url":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/","name":"Flux page templates to backend layouts and PAGEVIEW","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/#primaryimage"},"image":{"@id":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/from-flux-page-templates-to-backend-layouts-and-pageview.jpg","datePublished":"2026-11-07T07:00:00+00:00","description":"Map each flux page template to a backend layout in page TSconfig, render it with PAGEVIEW in TYPO3 v14 and migrate the backend_layout values on old pages.","breadcrumb":{"@id":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/#primaryimage","url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/from-flux-page-templates-to-backend-layouts-and-pageview.jpg","contentUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/from-flux-page-templates-to-backend-layouts-and-pageview.jpg","width":1200,"height":630,"caption":"Goodbye flux, hello PAGEVIEW"},{"@type":"BreadcrumbList","@id":"https:\/\/hoja.in\/blog\/from-flux-page-templates-to-backend-layouts-and-pageview\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hoja.in\/blog\/"},{"@type":"ListItem","position":2,"name":"From flux page templates to backend layouts and PAGEVIEW"}]},{"@type":"WebSite","@id":"https:\/\/hoja.in\/blog\/#website","url":"https:\/\/hoja.in\/blog\/","name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","description":"Notes from daily work with TYPO3, PHP and AI-assisted engineering","publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hoja.in\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b","name":"Hoja Mustaffa Abdul Latheef","logo":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/image\/"},"description":"Senior TYPO3 Developer at jweiland.net, TYPO3 CMS Certified Developer. I write about TYPO3 upgrades, extension development, PHP and AI-assisted engineering with Claude Code.","sameAs":["https:\/\/hoja.in\/"]}]}},"_links":{"self":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/comments?post=116"}],"version-history":[{"count":1,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/116\/revisions"}],"predecessor-version":[{"id":181,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/116\/revisions\/181"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media\/117"}],"wp:attachment":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media?parent=116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/categories?post=116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/tags?post=116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}