[{"data":1,"prerenderedAt":2966},["ShallowReactive",2],{"navigation":3,"\u002Fapi\u002Fdynamic-pages":358,"\u002Fapi\u002Fdynamic-pages-surround":2961},[4,14,36,69,140,341],{"title":5,"path":6,"stem":7,"children":8},"Introduction","\u002Fgetting-started","1.getting-started\u002F1.index",[9,10],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":15,"path":16,"stem":17,"children":18,"page":35},"Guides","\u002Fguides","2.guides",[19,23,27,31],{"title":20,"path":21,"stem":22},"Your First Layout","\u002Fguides\u002Fyour-first-layout","2.guides\u002F1.your-first-layout",{"title":24,"path":25,"stem":26},"Your First Page Template","\u002Fguides\u002Fyour-first-page-template","2.guides\u002F2.your-first-page-template",{"title":28,"path":29,"stem":30},"Your First Component","\u002Fguides\u002Fyour-first-component","2.guides\u002F3.your-first-component",{"title":32,"path":33,"stem":34},"Alternative UI Variants","\u002Fguides\u002Falternative-ui-variants","2.guides\u002F4.alternative-ui-variants",false,{"title":37,"path":38,"stem":39,"children":40,"page":35},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[41,45,49,53,57,61,65],{"title":42,"path":43,"stem":44},"How It All Works","\u002Fcore-concepts\u002Farchitecture","3.core-concepts\u002F1.architecture",{"title":46,"path":47,"stem":48},"The Data Model","\u002Fcore-concepts\u002Fthe-data-model","3.core-concepts\u002F2.the-data-model",{"title":50,"path":51,"stem":52},"Layouts & Pages","\u002Fcore-concepts\u002Flayouts-and-pages","3.core-concepts\u002F3.layouts-and-pages",{"title":54,"path":55,"stem":56},"Dynamic Pages","\u002Fcore-concepts\u002Fdynamic-pages","3.core-concepts\u002F4.dynamic-pages",{"title":58,"path":59,"stem":60},"Components","\u002Fcore-concepts\u002Fcomponents","3.core-concepts\u002F5.components",{"title":62,"path":63,"stem":64},"Draft & Publish Workflow","\u002Fcore-concepts\u002Fdraft-and-publish","3.core-concepts\u002F6.draft-and-publish",{"title":66,"path":67,"stem":68},"The Admin Panel","\u002Fcore-concepts\u002Fadmin-panel","3.core-concepts\u002F7.admin-panel",{"title":70,"path":71,"stem":72,"children":73,"page":35},"Api","\u002Fapi","4.api",[74,78,116,120,124,128,132,136],{"title":75,"path":76,"stem":77},"Bundle Setup","\u002Fapi\u002Fbundle-setup","4.api\u002F1.bundle-setup",{"title":58,"path":79,"stem":80,"children":81,"page":35},"\u002Fapi\u002Fcomponents","4.api\u002F2.components",[82,86,103],{"title":83,"path":84,"stem":85},"Creating Components","\u002Fapi\u002Fcomponents\u002Fcreating-components","4.api\u002F2.components\u002F1.creating-components",{"title":87,"path":88,"stem":89,"children":90,"page":35},"Annotations","\u002Fapi\u002Fcomponents\u002Fannotations","4.api\u002F2.components\u002F2.annotations",[91,95,99],{"title":92,"path":93,"stem":94},"Publishable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fpublishable","4.api\u002F2.components\u002F2.annotations\u002F1.publishable",{"title":96,"path":97,"stem":98},"Uploadable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable","4.api\u002F2.components\u002F2.annotations\u002F2.uploadable",{"title":100,"path":101,"stem":102},"Timestamped","\u002Fapi\u002Fcomponents\u002Fannotations\u002Ftimestamped","4.api\u002F2.components\u002F2.annotations\u002F3.timestamped",{"title":104,"path":105,"stem":106,"children":107,"page":35},"Built Ins","\u002Fapi\u002Fcomponents\u002Fbuilt-ins","4.api\u002F2.components\u002F3.built-ins",[108,112],{"title":109,"path":110,"stem":111},"Collection Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fcollection-component","4.api\u002F2.components\u002F3.built-ins\u002F1.collection-component",{"title":113,"path":114,"stem":115},"Form Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fform-component","4.api\u002F2.components\u002F3.built-ins\u002F2.form-component",{"title":117,"path":118,"stem":119},"Dynamic & Nested Pages","\u002Fapi\u002Fdynamic-pages","4.api\u002F3.dynamic-pages",{"title":121,"path":122,"stem":123},"Users & Security","\u002Fapi\u002Fusers-and-security","4.api\u002F4.users-and-security",{"title":125,"path":126,"stem":127},"Data Fixtures","\u002Fapi\u002Fdata-fixtures","4.api\u002F5.data-fixtures",{"title":129,"path":130,"stem":131},"Configuration Reference","\u002Fapi\u002Fconfiguration","4.api\u002F6.configuration",{"title":133,"path":134,"stem":135},"Console Commands","\u002Fapi\u002Fconsole-commands","4.api\u002F7.console-commands",{"title":137,"path":138,"stem":139},"Debugging & Profiler","\u002Fapi\u002Fdebugging","4.api\u002F8.debugging",{"title":141,"path":142,"stem":143,"children":144,"page":35},"Nuxt Module","\u002Fnuxt-module","5.nuxt-module",[145,149,162,182,207,211,295,320,324],{"title":146,"path":147,"stem":148},"Module Setup","\u002Fnuxt-module\u002Fmodule-setup","5.nuxt-module\u002F1.module-setup",{"title":150,"path":151,"stem":152,"children":153,"page":35},"Configuration","\u002Fnuxt-module\u002Fconfiguration","5.nuxt-module\u002F2.configuration",[154,158],{"title":155,"path":156,"stem":157},"Nuxt Config","\u002Fnuxt-module\u002Fconfiguration\u002Fnuxt-config","5.nuxt-module\u002F2.configuration\u002F1.nuxt-config",{"title":159,"path":160,"stem":161},"Site Config & SEO","\u002Fnuxt-module\u002Fconfiguration\u002Fsite-config-and-seo","5.nuxt-module\u002F2.configuration\u002F2.site-config-and-seo",{"title":163,"path":164,"stem":165,"children":166,"page":35},"Building Your Ui","\u002Fnuxt-module\u002Fbuilding-your-ui","5.nuxt-module\u002F3.building-your-ui",[167,171,175,178],{"title":168,"path":169,"stem":170},"Layouts","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-layouts","5.nuxt-module\u002F3.building-your-ui\u002F1.creating-layouts",{"title":172,"path":173,"stem":174},"Page Templates","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-page-templates","5.nuxt-module\u002F3.building-your-ui\u002F2.creating-page-templates",{"title":83,"path":176,"stem":177},"\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-components","5.nuxt-module\u002F3.building-your-ui\u002F3.creating-components",{"title":179,"path":180,"stem":181},"CLI Generator","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcwa-cli","5.nuxt-module\u002F3.building-your-ui\u002F4.cwa-cli",{"title":183,"path":184,"stem":185,"children":186,"page":35},"Cwa Components","\u002Fnuxt-module\u002Fcwa-components","5.nuxt-module\u002F4.cwa-components",[187,191,195,199,203],{"title":188,"path":189,"stem":190},"\u003CCwaComponentGroup \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-component-group","5.nuxt-module\u002F4.cwa-components\u002F1.cwa-component-group",{"title":192,"path":193,"stem":194},"\u003CCwaPage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-page","5.nuxt-module\u002F4.cwa-components\u002F2.cwa-page",{"title":196,"path":197,"stem":198},"\u003CCwaLink \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-link","5.nuxt-module\u002F4.cwa-components\u002F3.cwa-link",{"title":200,"path":201,"stem":202},"\u003CCwaImage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-image","5.nuxt-module\u002F4.cwa-components\u002F4.cwa-image",{"title":204,"path":205,"stem":206},"\u003CCwaDefaultLayout \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-default-layout","5.nuxt-module\u002F4.cwa-components\u002F5.cwa-default-layout",{"title":208,"path":209,"stem":210},"The useCwa() API","\u002Fnuxt-module\u002Fcwa-api","5.nuxt-module\u002F5.cwa-api",{"title":212,"path":213,"stem":214,"children":215,"page":35},"Composables","\u002Fnuxt-module\u002Fcomposables","5.nuxt-module\u002F6.composables",[216,224,261,278],{"title":217,"path":218,"stem":219,"children":220,"page":35},"Layout","\u002Fnuxt-module\u002Fcomposables\u002Flayout","5.nuxt-module\u002F6.composables\u002F0.layout",[221],{"title":217,"path":222,"stem":223},"\u002Fnuxt-module\u002Fcomposables\u002Flayout\u002Fuse-cwa-layout","5.nuxt-module\u002F6.composables\u002F0.layout\u002F1.use-cwa-layout",{"title":225,"path":226,"stem":227,"children":228,"page":35},"Component","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent","5.nuxt-module\u002F6.composables\u002F1.component",[229,233,237,241,245,249,253,257],{"title":230,"path":231,"stem":232},"Component (recommended)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-component","5.nuxt-module\u002F6.composables\u002F1.component\u002F0.use-cwa-component",{"title":234,"path":235,"stem":236},"Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F1.use-cwa-resource",{"title":238,"path":239,"stem":240},"Collection Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F2.use-cwa-collection-resource",{"title":242,"path":243,"stem":244},"Image Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-image-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F3.use-cwa-image-resource",{"title":246,"path":247,"stem":248},"Form","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form","5.nuxt-module\u002F6.composables\u002F1.component\u002F4.use-cwa-form",{"title":250,"path":251,"stem":252},"Form Input","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-input","5.nuxt-module\u002F6.composables\u002F1.component\u002F5.use-cwa-form-input",{"title":254,"path":255,"stem":256},"Form Repeated","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-repeated","5.nuxt-module\u002F6.composables\u002F1.component\u002F6.use-cwa-form-repeated",{"title":258,"path":259,"stem":260},"Form Collection","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-collection","5.nuxt-module\u002F6.composables\u002F1.component\u002F7.use-cwa-form-collection",{"title":262,"path":263,"stem":264,"children":265,"page":35},"Admin Manager","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager","5.nuxt-module\u002F6.composables\u002F2.admin-manager",[266,270,274],{"title":267,"path":268,"stem":269},"Manager Tab","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-manager-tab","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F1.use-cwa-resource-manager-tab",{"title":271,"path":272,"stem":273},"Resource Model","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-model","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F2.use-cwa-resource-model",{"title":275,"path":276,"stem":277},"Resource Upload","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-upload","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F3.use-cwa-resource-upload",{"title":279,"path":280,"stem":281,"children":282,"page":35},"Utilities","\u002Fnuxt-module\u002Fcomposables\u002Futilities","5.nuxt-module\u002F6.composables\u002F3.utilities",[283,287,291],{"title":284,"path":285,"stem":286},"Resource Endpoint","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-endpoint","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F1.use-cwa-resource-endpoint",{"title":288,"path":289,"stem":290},"Query Model","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-query-bound-model","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F2.use-query-bound-model",{"title":292,"path":293,"stem":294},"Resource Route","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-route","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F3.use-cwa-resource-route",{"title":296,"path":297,"stem":298,"children":299,"page":35},"Component Helpers","\u002Fnuxt-module\u002Fcomponent-helpers","5.nuxt-module\u002F7.component-helpers",[300,304,308,312,316],{"title":301,"path":302,"stem":303},"Images & Media","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fimages-and-uploads","5.nuxt-module\u002F7.component-helpers\u002F1.images-and-uploads",{"title":305,"path":306,"stem":307},"Collections & Pagination","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fcollections-and-pagination","5.nuxt-module\u002F7.component-helpers\u002F2.collections-and-pagination",{"title":309,"path":310,"stem":311},"HTML Content","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fhtml-content","5.nuxt-module\u002F7.component-helpers\u002F3.html-content",{"title":313,"path":314,"stem":315},"Real-Time Updates","\u002Fnuxt-module\u002Fcomponent-helpers\u002Freal-time-updates","5.nuxt-module\u002F7.component-helpers\u002F4.real-time-updates",{"title":317,"path":318,"stem":319},"Forms","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fforms","5.nuxt-module\u002F7.component-helpers\u002F5.forms",{"title":321,"path":322,"stem":323},"Authentication","\u002Fnuxt-module\u002Fauthentication","5.nuxt-module\u002F8.authentication",{"title":325,"path":326,"stem":327,"children":328,"page":35},"Cwa Layer","\u002Fnuxt-module\u002Fcwa-layer","5.nuxt-module\u002F9.cwa-layer",[329,333,337],{"title":330,"path":331,"stem":332},"Overview","\u002Fnuxt-module\u002Fcwa-layer\u002Foverview","5.nuxt-module\u002F9.cwa-layer\u002F1.overview",{"title":334,"path":335,"stem":336},"Auth Pages","\u002Fnuxt-module\u002Fcwa-layer\u002Fauth-pages","5.nuxt-module\u002F9.cwa-layer\u002F2.auth-pages",{"title":338,"path":339,"stem":340},"Admin Panel","\u002Fnuxt-module\u002Fcwa-layer\u002Fadmin-panel","5.nuxt-module\u002F9.cwa-layer\u002F3.admin-panel",{"title":342,"path":343,"stem":344,"children":345,"page":35},"Deployment","\u002Fdeployment","6.deployment",[346,350,354],{"title":347,"path":348,"stem":349},"Docker","\u002Fdeployment\u002Fdocker","6.deployment\u002F1.docker",{"title":351,"path":352,"stem":353},"Kubernetes & Helm","\u002Fdeployment\u002Fkubernetes","6.deployment\u002F2.kubernetes",{"title":355,"path":356,"stem":357},"CI\u002FCD","\u002Fdeployment\u002Fci-cd","6.deployment\u002F3.ci-cd",{"id":359,"title":117,"badge":360,"body":361,"description":2956,"extension":2957,"links":360,"meta":2958,"navigation":470,"path":118,"seo":2959,"stem":119,"__hash__":2960},"docs\u002F4.api\u002F3.dynamic-pages.md",null,{"type":362,"value":363,"toc":2935},"minimark",[364,369,378,381,384,399,402,406,425,891,895,1004,1020,1024,1030,1038,1042,1085,1089,1095,1098,1268,1285,1298,1302,1309,1452,1456,1459,1605,1614,1618,1644,1655,1704,1707,1711,1729,1732,1737,1748,1793,1803,1808,1812,1830,2034,2037,2191,2194,2275,2279,2285,2339,2350,2354,2369,2439,2442,2466,2472,2476,2483,2489,2492,2709,2715,2719,2730,2814,2820,2824,2838,2846,2919,2928,2931],[365,366,368],"h2",{"id":367},"static-pages","Static Pages",[370,371,372,373,377],"p",{},"A ",[374,375,376],"strong",{},"static page"," is a one-to-one relationship: one Route, one Page, one Layout. The content regions are fixed to that page.",[379,380],"diagram-static-page",{},[365,382,54],{"id":383},"dynamic-pages",[370,385,372,386,389,390,394,395,398],{},[374,387,388],{},"dynamic page"," maps many URLs to different ",[391,392,393],"code",{},"PageData"," records, all rendering through one shared Page template. This is how a blog works — one ",[391,396,397],{},"BlogDetail"," template serves every article, each with its own URL, title, meta tags, and content.",[400,401],"diagram-dynamic-page",{},[365,403,405],{"id":404},"creating-a-pagedata-entity","Creating a PageData Entity",[370,407,408,409,412,413,416,417,420,421,424],{},"Extend ",[391,410,411],{},"AbstractPageData",". It inherits from ",[391,414,415],{},"AbstractPage",", which provides ",[391,418,419],{},"title"," and ",[391,422,423],{},"metaDescription"," used by the SEO system:",[426,427,432],"pre",{"className":428,"code":429,"language":430,"meta":431,"style":431},"language-php shiki shiki-themes github-light github-dark material-theme-palenight","\u002F\u002F src\u002FEntity\u002FBlogArticleData.php\nnamespace App\\Entity;\n\nuse ApiPlatform\\Metadata\\ApiFilter;\nuse ApiPlatform\\Metadata\\ApiResource;\nuse ApiPlatform\\Filter\\OrderFilter;\nuse ApiPlatform\\Filter\\SearchFilter;\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Silverback\\ApiComponentsBundle\\Annotation as Silverback;\nuse Silverback\\ApiComponentsBundle\\Entity\\Core\\AbstractPageData;\n\n#[ORM\\Entity]\n#[ApiResource(\n    mercure: true,\n    order: ['createdAt' => 'DESC'],\n    paginationItemsPerPage: 12\n)]\n#[ApiFilter(SearchFilter::class, properties: ['title' => 'ipartial'])]\n#[ApiFilter(OrderFilter::class, properties: ['title', 'createdAt'])]\nclass BlogArticleData extends AbstractPageData\n{\n    public ?string $headline = null;\n    public ?string $body = null;\n}\n","php","",[391,433,434,443,465,472,495,513,532,550,576,600,626,631,647,657,672,708,720,728,777,818,833,839,865,885],{"__ignoreMap":431},[435,436,439],"span",{"class":437,"line":438},"line",1,[435,440,442],{"class":441},"sTBSN","\u002F\u002F src\u002FEntity\u002FBlogArticleData.php\n",[435,444,446,450,454,458,461],{"class":437,"line":445},2,[435,447,449],{"class":448},"stmX-","namespace",[435,451,453],{"class":452},"sRCss"," App",[435,455,457],{"class":456},"sn4go","\\",[435,459,460],{"class":452},"Entity",[435,462,464],{"class":463},"sOvfz",";\n",[435,466,468],{"class":437,"line":467},3,[435,469,471],{"emptyLinePlaceholder":470},true,"\n",[435,473,475,478,482,485,488,490,493],{"class":437,"line":474},4,[435,476,477],{"class":448},"use",[435,479,481],{"class":480},"sc2zw"," ApiPlatform",[435,483,457],{"class":484},"sBtbT",[435,486,487],{"class":480},"Metadata",[435,489,457],{"class":484},[435,491,492],{"class":480},"ApiFilter",[435,494,464],{"class":463},[435,496,498,500,502,504,506,508,511],{"class":437,"line":497},5,[435,499,477],{"class":448},[435,501,481],{"class":480},[435,503,457],{"class":484},[435,505,487],{"class":480},[435,507,457],{"class":484},[435,509,510],{"class":480},"ApiResource",[435,512,464],{"class":463},[435,514,516,518,520,522,525,527,530],{"class":437,"line":515},6,[435,517,477],{"class":448},[435,519,481],{"class":480},[435,521,457],{"class":484},[435,523,524],{"class":480},"Filter",[435,526,457],{"class":484},[435,528,529],{"class":480},"OrderFilter",[435,531,464],{"class":463},[435,533,535,537,539,541,543,545,548],{"class":437,"line":534},7,[435,536,477],{"class":448},[435,538,481],{"class":480},[435,540,457],{"class":484},[435,542,524],{"class":480},[435,544,457],{"class":484},[435,546,547],{"class":480},"SearchFilter",[435,549,464],{"class":463},[435,551,553,555,558,560,563,565,568,571,574],{"class":437,"line":552},8,[435,554,477],{"class":448},[435,556,557],{"class":480}," Doctrine",[435,559,457],{"class":484},[435,561,562],{"class":480},"ORM",[435,564,457],{"class":484},[435,566,567],{"class":480},"Mapping",[435,569,570],{"class":448}," as",[435,572,573],{"class":452}," ORM",[435,575,464],{"class":463},[435,577,579,581,584,586,589,591,594,596,598],{"class":437,"line":578},9,[435,580,477],{"class":448},[435,582,583],{"class":480}," Silverback",[435,585,457],{"class":484},[435,587,588],{"class":480},"ApiComponentsBundle",[435,590,457],{"class":484},[435,592,593],{"class":480},"Annotation",[435,595,570],{"class":448},[435,597,583],{"class":452},[435,599,464],{"class":463},[435,601,603,605,607,609,611,613,615,617,620,622,624],{"class":437,"line":602},10,[435,604,477],{"class":448},[435,606,583],{"class":480},[435,608,457],{"class":484},[435,610,588],{"class":480},[435,612,457],{"class":484},[435,614,460],{"class":480},[435,616,457],{"class":484},[435,618,619],{"class":480},"Core",[435,621,457],{"class":484},[435,623,411],{"class":480},[435,625,464],{"class":463},[435,627,629],{"class":437,"line":628},11,[435,630,471],{"emptyLinePlaceholder":470},[435,632,634,638,640,642,644],{"class":437,"line":633},12,[435,635,637],{"class":636},"sPB8G","#[",[435,639,562],{"class":480},[435,641,457],{"class":484},[435,643,460],{"class":480},[435,645,646],{"class":636},"]\n",[435,648,650,652,654],{"class":437,"line":649},13,[435,651,637],{"class":636},[435,653,510],{"class":480},[435,655,656],{"class":463},"(\n",[435,658,660,663,666,669],{"class":437,"line":659},14,[435,661,662],{"class":452},"    mercure",[435,664,665],{"class":463},":",[435,667,668],{"class":484}," true",[435,670,671],{"class":463},",\n",[435,673,675,678,680,683,687,691,693,697,700,703,705],{"class":437,"line":674},15,[435,676,677],{"class":452},"    order",[435,679,665],{"class":463},[435,681,682],{"class":463}," [",[435,684,686],{"class":685},"seSrl","'",[435,688,690],{"class":689},"sLL54","createdAt",[435,692,686],{"class":685},[435,694,696],{"class":695},"sVlFx"," =>",[435,698,699],{"class":685}," '",[435,701,702],{"class":689},"DESC",[435,704,686],{"class":685},[435,706,707],{"class":463},"],\n",[435,709,711,714,716],{"class":437,"line":710},16,[435,712,713],{"class":452},"    paginationItemsPerPage",[435,715,665],{"class":463},[435,717,719],{"class":718},"scSvc"," 12\n",[435,721,723,726],{"class":437,"line":722},17,[435,724,725],{"class":463},")",[435,727,646],{"class":636},[435,729,731,733,735,738,741,744,747,750,753,755,757,759,761,763,765,767,770,772,775],{"class":437,"line":730},18,[435,732,637],{"class":636},[435,734,492],{"class":480},[435,736,737],{"class":463},"(",[435,739,547],{"class":740},"sbW4m",[435,742,743],{"class":695},"::",[435,745,746],{"class":448},"class",[435,748,749],{"class":463},",",[435,751,752],{"class":452}," properties",[435,754,665],{"class":463},[435,756,682],{"class":463},[435,758,686],{"class":685},[435,760,419],{"class":689},[435,762,686],{"class":685},[435,764,696],{"class":695},[435,766,699],{"class":685},[435,768,769],{"class":689},"ipartial",[435,771,686],{"class":685},[435,773,774],{"class":463},"])",[435,776,646],{"class":636},[435,778,780,782,784,786,788,790,792,794,796,798,800,802,804,806,808,810,812,814,816],{"class":437,"line":779},19,[435,781,637],{"class":636},[435,783,492],{"class":480},[435,785,737],{"class":463},[435,787,529],{"class":740},[435,789,743],{"class":695},[435,791,746],{"class":448},[435,793,749],{"class":463},[435,795,752],{"class":452},[435,797,665],{"class":463},[435,799,682],{"class":463},[435,801,686],{"class":685},[435,803,419],{"class":689},[435,805,686],{"class":685},[435,807,749],{"class":463},[435,809,699],{"class":685},[435,811,690],{"class":689},[435,813,686],{"class":685},[435,815,774],{"class":463},[435,817,646],{"class":636},[435,819,821,824,827,830],{"class":437,"line":820},20,[435,822,746],{"class":823},"swB56",[435,825,826],{"class":452}," BlogArticleData",[435,828,829],{"class":823}," extends",[435,831,832],{"class":452}," AbstractPageData\n",[435,834,836],{"class":437,"line":835},21,[435,837,838],{"class":463},"{\n",[435,840,842,845,848,851,854,857,860,863],{"class":437,"line":841},22,[435,843,844],{"class":823},"    public",[435,846,847],{"class":695}," ?",[435,849,850],{"class":448},"string",[435,852,853],{"class":463}," $",[435,855,856],{"class":636},"headline ",[435,858,859],{"class":695},"=",[435,861,862],{"class":484}," null",[435,864,464],{"class":463},[435,866,868,870,872,874,876,879,881,883],{"class":437,"line":867},23,[435,869,844],{"class":823},[435,871,847],{"class":695},[435,873,850],{"class":448},[435,875,853],{"class":463},[435,877,878],{"class":636},"body ",[435,880,859],{"class":695},[435,882,862],{"class":484},[435,884,464],{"class":463},[435,886,888],{"class":437,"line":887},24,[435,889,890],{"class":463},"}\n",[365,892,894],{"id":893},"what-abstractpagedata-provides","What AbstractPageData Provides",[896,897,898,914],"table",{},[899,900,901],"thead",{},[902,903,904,908,911],"tr",{},[905,906,907],"th",{},"Property",[905,909,910],{},"Source",[905,912,913],{},"Purpose",[915,916,917,935,948,962,976,990],"tbody",{},[902,918,919,924,928],{},[920,921,922],"td",{},[391,923,419],{},[920,925,926],{},[391,927,415],{},[920,929,930,931,934],{},"Required. Overrides the page template's ",[391,932,933],{},"\u003Ctitle>"," for this record",[902,936,937,941,945],{},[920,938,939],{},[391,940,423],{},[920,942,943],{},[391,944,415],{},[920,946,947],{},"Per-record meta description",[902,949,950,955,959],{},[920,951,952],{},[391,953,954],{},"page",[920,956,957],{},[391,958,411],{},[920,960,961],{},"ManyToOne → the Page template (required)",[902,963,964,969,973],{},[920,965,966],{},[391,967,968],{},"route",[920,970,971],{},[391,972,415],{},[920,974,975],{},"The Route pointing to this record",[902,977,978,983,987],{},[920,979,980],{},[391,981,982],{},"parentPage",[920,984,985],{},[391,986,415],{},[920,988,989],{},"Optional. The parent Page this record lives under (for nested hierarchies)",[902,991,992,997,1001],{},[920,993,994],{},[391,995,996],{},"parentPageData",[920,998,999],{},[391,1000,415],{},[920,1002,1003],{},"Optional. The parent PageData this record lives under",[370,1005,1006,1008,1009,1012,1013,1016,1017,1019],{},[391,1007,419],{}," is required (",[391,1010,1011],{},"nullable: false"," is set via ",[391,1014,1015],{},"#[AttributeOverride]"," in ",[391,1018,411],{},").",[365,1021,1023],{"id":1022},"url-prefix-convention","URL Prefix Convention",[370,1025,1026,1027,665],{},"All PageData endpoints are prefixed with ",[391,1028,1029],{},"\u002Fpage_data\u002F",[426,1031,1036],{"className":1032,"code":1034,"language":1035},[1033],"language-text","GET    \u002Fpage_data\u002Fblog_articles        # collection (with pagination, filtering)\nPOST   \u002Fpage_data\u002Fblog_articles        # create a new article\nGET    \u002Fpage_data\u002Fblog_articles\u002F{id}   # single article\nPATCH  \u002Fpage_data\u002Fblog_articles\u002F{id}   # update\nDELETE \u002Fpage_data\u002Fblog_articles\u002F{id}   # delete\n","text",[391,1037,1034],{"__ignoreMap":431},[365,1039,1041],{"id":1040},"setting-up-in-the-admin","Setting Up in the Admin",[1043,1044,1045,1067,1079],"ol",{},[1046,1047,1048,1051,1052,1055,1056,1059,1060,1063,1064,1066],"li",{},[374,1049,1050],{},"Create the Page template"," — in ",[391,1053,1054],{},"\u002F_cwa\u002Fpages",", create a Page with ",[391,1057,1058],{},"isTemplate: true",", set ",[391,1061,1062],{},"uiComponent"," to your Vue component name (e.g. ",[391,1065,397],{},"), and assign a Layout",[1046,1068,1069,1051,1072,1075,1076,1078],{},[374,1070,1071],{},"Create PageData records",[391,1073,1074],{},"\u002F_cwa\u002Fdata\u002FBlogArticleData",", create articles. Each article has a ",[391,1077,419],{}," (required for SEO) and your custom fields",[1046,1080,1081,1082],{},"Routes must be created explicitly (via the admin or REST API), or auto-generated by the fixture scaffold — see ",[1083,1084,125],"a",{"href":126},[365,1086,1088],{"id":1087},"component-positions-from-pagedata","Component Positions from PageData",[370,1090,1091,1092,665],{},"You can link a component group position to a field on the PageData record. This is how a page template's \"hero image\" slot gets its data from ",[391,1093,1094],{},"blogArticle.image",[370,1096,1097],{},"In your fixture:",[426,1099,1101],{"className":428,"code":1100,"language":430,"meta":431,"style":431},"$cwa->page('blog-detail', 'BlogDetail', 'main', null, null, true)\n    ->group('content', function (GroupBuilder $group) {\n        $group->pageDataPosition(BlogArticleData::class, 'htmlContent');  \u002F\u002F links to BlogArticleData::$htmlContent\n        $group->pageDataPosition(BlogArticleData::class, 'image');        \u002F\u002F links to BlogArticleData::$image\n    });\n",[391,1102,1103,1158,1195,1231,1263],{"__ignoreMap":431},[435,1104,1105,1108,1111,1114,1117,1119,1121,1124,1126,1128,1130,1132,1134,1136,1138,1141,1143,1145,1147,1149,1151,1153,1155],{"class":437,"line":438},[435,1106,1107],{"class":463},"$",[435,1109,1110],{"class":636},"cwa",[435,1112,1113],{"class":695},"->",[435,1115,954],{"class":1116},"sKpYG",[435,1118,737],{"class":463},[435,1120,686],{"class":685},[435,1122,1123],{"class":689},"blog-detail",[435,1125,686],{"class":685},[435,1127,749],{"class":463},[435,1129,699],{"class":685},[435,1131,397],{"class":689},[435,1133,686],{"class":685},[435,1135,749],{"class":463},[435,1137,699],{"class":685},[435,1139,1140],{"class":689},"main",[435,1142,686],{"class":685},[435,1144,749],{"class":463},[435,1146,862],{"class":484},[435,1148,749],{"class":463},[435,1150,862],{"class":484},[435,1152,749],{"class":463},[435,1154,668],{"class":484},[435,1156,1157],{"class":463},")\n",[435,1159,1160,1163,1166,1168,1170,1173,1175,1177,1180,1183,1186,1188,1190,1192],{"class":437,"line":445},[435,1161,1162],{"class":695},"    ->",[435,1164,1165],{"class":1116},"group",[435,1167,737],{"class":463},[435,1169,686],{"class":685},[435,1171,1172],{"class":689},"content",[435,1174,686],{"class":685},[435,1176,749],{"class":463},[435,1178,1179],{"class":823}," function",[435,1181,1182],{"class":463}," (",[435,1184,1185],{"class":740},"GroupBuilder",[435,1187,853],{"class":463},[435,1189,1165],{"class":636},[435,1191,725],{"class":463},[435,1193,1194],{"class":463}," {\n",[435,1196,1197,1200,1202,1204,1207,1209,1212,1214,1216,1218,1220,1223,1225,1228],{"class":437,"line":467},[435,1198,1199],{"class":463},"        $",[435,1201,1165],{"class":636},[435,1203,1113],{"class":695},[435,1205,1206],{"class":1116},"pageDataPosition",[435,1208,737],{"class":463},[435,1210,1211],{"class":740},"BlogArticleData",[435,1213,743],{"class":695},[435,1215,746],{"class":448},[435,1217,749],{"class":463},[435,1219,699],{"class":685},[435,1221,1222],{"class":689},"htmlContent",[435,1224,686],{"class":685},[435,1226,1227],{"class":463},");",[435,1229,1230],{"class":441},"  \u002F\u002F links to BlogArticleData::$htmlContent\n",[435,1232,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1256,1258,1260],{"class":437,"line":474},[435,1234,1199],{"class":463},[435,1236,1165],{"class":636},[435,1238,1113],{"class":695},[435,1240,1206],{"class":1116},[435,1242,737],{"class":463},[435,1244,1211],{"class":740},[435,1246,743],{"class":695},[435,1248,746],{"class":448},[435,1250,749],{"class":463},[435,1252,699],{"class":685},[435,1254,1255],{"class":689},"image",[435,1257,686],{"class":685},[435,1259,1227],{"class":463},[435,1261,1262],{"class":441},"        \u002F\u002F links to BlogArticleData::$image\n",[435,1264,1265],{"class":437,"line":497},[435,1266,1267],{"class":463},"    });\n",[370,1269,1270,1273,1274,1276,1277,1280,1281,1284],{},[391,1271,1272],{},"pageDataPosition()"," takes the FQCN of the ",[391,1275,411],{}," subclass as its first argument, then the property name. At render time the ",[391,1278,1279],{},"ComponentPosition"," resolves to the component held in that field on the current PageData record. The API validates on write that the class is a known PageData resource, the property is component-typed, and (if ",[391,1282,1283],{},"allowedComponents"," is set on the group) the resolved type is permitted.",[1286,1287,1289],"callout",{"color":1288},"warning",[370,1290,1291,420,1294,1297],{},[391,1292,1293],{},"pageDataClass",[391,1295,1296],{},"pageDataProperty"," must always be set together. Sending one without the other returns a 422.",[365,1299,1301],{"id":1300},"combining-with-publishable","Combining with Publishable",[370,1303,1304,1305,1308],{},"Add ",[391,1306,1307],{},"#[Silverback\\Publishable]"," to your PageData class to give articles a draft\u002Fpublish workflow. Draft articles are only visible to admins:",[426,1310,1312],{"className":428,"code":1311,"language":430,"meta":431,"style":431},"#[Silverback\\Publishable]\n#[Silverback\\Timestamped]\n#[ORM\\Entity]\n#[ApiResource(mercure: true, order: ['createdAt' => 'DESC'])]\nclass BlogArticleData extends AbstractPageData\n{\n    use PublishableTrait;\n    use TimestampedTrait;\n\n    public ?string $headline = null;\n}\n",[391,1313,1314,1327,1339,1351,1393,1403,1407,1417,1426,1430,1448],{"__ignoreMap":431},[435,1315,1316,1318,1321,1323,1325],{"class":437,"line":438},[435,1317,637],{"class":636},[435,1319,1320],{"class":480},"Silverback",[435,1322,457],{"class":484},[435,1324,92],{"class":480},[435,1326,646],{"class":636},[435,1328,1329,1331,1333,1335,1337],{"class":437,"line":445},[435,1330,637],{"class":636},[435,1332,1320],{"class":480},[435,1334,457],{"class":484},[435,1336,100],{"class":480},[435,1338,646],{"class":636},[435,1340,1341,1343,1345,1347,1349],{"class":437,"line":467},[435,1342,637],{"class":636},[435,1344,562],{"class":480},[435,1346,457],{"class":484},[435,1348,460],{"class":480},[435,1350,646],{"class":636},[435,1352,1353,1355,1357,1359,1362,1364,1366,1368,1371,1373,1375,1377,1379,1381,1383,1385,1387,1389,1391],{"class":437,"line":474},[435,1354,637],{"class":636},[435,1356,510],{"class":480},[435,1358,737],{"class":463},[435,1360,1361],{"class":452},"mercure",[435,1363,665],{"class":463},[435,1365,668],{"class":484},[435,1367,749],{"class":463},[435,1369,1370],{"class":452}," order",[435,1372,665],{"class":463},[435,1374,682],{"class":463},[435,1376,686],{"class":685},[435,1378,690],{"class":689},[435,1380,686],{"class":685},[435,1382,696],{"class":695},[435,1384,699],{"class":685},[435,1386,702],{"class":689},[435,1388,686],{"class":685},[435,1390,774],{"class":463},[435,1392,646],{"class":636},[435,1394,1395,1397,1399,1401],{"class":437,"line":497},[435,1396,746],{"class":823},[435,1398,826],{"class":452},[435,1400,829],{"class":823},[435,1402,832],{"class":452},[435,1404,1405],{"class":437,"line":515},[435,1406,838],{"class":463},[435,1408,1409,1412,1415],{"class":437,"line":534},[435,1410,1411],{"class":448},"    use",[435,1413,1414],{"class":480}," PublishableTrait",[435,1416,464],{"class":463},[435,1418,1419,1421,1424],{"class":437,"line":552},[435,1420,1411],{"class":448},[435,1422,1423],{"class":480}," TimestampedTrait",[435,1425,464],{"class":463},[435,1427,1428],{"class":437,"line":578},[435,1429,471],{"emptyLinePlaceholder":470},[435,1431,1432,1434,1436,1438,1440,1442,1444,1446],{"class":437,"line":602},[435,1433,844],{"class":823},[435,1435,847],{"class":695},[435,1437,850],{"class":448},[435,1439,853],{"class":463},[435,1441,856],{"class":636},[435,1443,859],{"class":695},[435,1445,862],{"class":484},[435,1447,464],{"class":463},[435,1449,1450],{"class":437,"line":628},[435,1451,890],{"class":463},[365,1453,1455],{"id":1454},"accessing-pagedata-on-the-front-end","Accessing PageData on the Front-End",[370,1457,1458],{},"In your page template Vue component:",[426,1460,1464],{"className":1461,"code":1462,"language":1463,"meta":431,"style":431},"language-ts shiki shiki-themes github-light github-dark material-theme-palenight","const cwa = useCwa()\n\n\u002F\u002F The current page data resource (populated by middleware)\nconst pageData = computed(() => cwa.resources.pageData.value)\nconst pageDataIri = computed(() => cwa.resources.pageDataIri.value)\n\n\u002F\u002F Access your custom fields\nconst headline = computed(() => pageData.value?.data?.headline)\n","ts",[391,1465,1466,1483,1487,1492,1529,1561,1565,1570],{"__ignoreMap":431},[435,1467,1468,1471,1474,1477,1480],{"class":437,"line":438},[435,1469,1470],{"class":823},"const",[435,1472,1473],{"class":480}," cwa",[435,1475,1476],{"class":695}," =",[435,1478,1479],{"class":1116}," useCwa",[435,1481,1482],{"class":636},"()\n",[435,1484,1485],{"class":437,"line":445},[435,1486,471],{"emptyLinePlaceholder":470},[435,1488,1489],{"class":437,"line":467},[435,1490,1491],{"class":441},"\u002F\u002F The current page data resource (populated by middleware)\n",[435,1493,1494,1496,1499,1501,1504,1506,1509,1511,1513,1516,1519,1521,1524,1526],{"class":437,"line":474},[435,1495,1470],{"class":823},[435,1497,1498],{"class":480}," pageData",[435,1500,1476],{"class":695},[435,1502,1503],{"class":1116}," computed",[435,1505,737],{"class":636},[435,1507,1508],{"class":463},"()",[435,1510,696],{"class":823},[435,1512,1473],{"class":636},[435,1514,1515],{"class":463},".",[435,1517,1518],{"class":636},"resources",[435,1520,1515],{"class":463},[435,1522,1523],{"class":636},"pageData",[435,1525,1515],{"class":463},[435,1527,1528],{"class":636},"value)\n",[435,1530,1531,1533,1536,1538,1540,1542,1544,1546,1548,1550,1552,1554,1557,1559],{"class":437,"line":497},[435,1532,1470],{"class":823},[435,1534,1535],{"class":480}," pageDataIri",[435,1537,1476],{"class":695},[435,1539,1503],{"class":1116},[435,1541,737],{"class":636},[435,1543,1508],{"class":463},[435,1545,696],{"class":823},[435,1547,1473],{"class":636},[435,1549,1515],{"class":463},[435,1551,1518],{"class":636},[435,1553,1515],{"class":463},[435,1555,1556],{"class":636},"pageDataIri",[435,1558,1515],{"class":463},[435,1560,1528],{"class":636},[435,1562,1563],{"class":437,"line":515},[435,1564,471],{"emptyLinePlaceholder":470},[435,1566,1567],{"class":437,"line":534},[435,1568,1569],{"class":441},"\u002F\u002F Access your custom fields\n",[435,1571,1572,1574,1577,1579,1581,1583,1585,1587,1589,1591,1594,1597,1600,1602],{"class":437,"line":552},[435,1573,1470],{"class":823},[435,1575,1576],{"class":480}," headline",[435,1578,1476],{"class":695},[435,1580,1503],{"class":1116},[435,1582,737],{"class":636},[435,1584,1508],{"class":463},[435,1586,696],{"class":823},[435,1588,1498],{"class":636},[435,1590,1515],{"class":463},[435,1592,1593],{"class":636},"value",[435,1595,1596],{"class":463},"?.",[435,1598,1599],{"class":636},"data",[435,1601,1596],{"class":463},[435,1603,1604],{"class":636},"headline)\n",[370,1606,1607,420,1610,1613],{},[391,1608,1609],{},"pageData.value?.data?.title",[391,1611,1612],{},"pageData.value?.data?.metaDescription"," are automatically applied as SEO meta tags by the module middleware.",[365,1615,1617],{"id":1616},"route-generation","Route Generation",[370,1619,1620,1621,1624,1625,1628,1629,1632,1633,1635,1636,1639,1640,1643],{},"Route auto-generation from the title slug is a ",[374,1622,1623],{},"fixture\u002Fscaffold feature only"," — it is handled by ",[391,1626,1627],{},"CwaFixtureBuilder"," via ",[391,1630,1631],{},"RouteGenerator::create()"," at fixture time. When you create a ",[391,1634,393],{}," record directly via the REST API or admin panel, no route is created automatically; you must create a ",[391,1637,1638],{},"Route"," explicitly via ",[391,1641,1642],{},"POST \u002Froutes"," or use the admin UI.",[370,1645,1646,1647,1650,1651,1654],{},"In fixtures, a blog article titled \"My First Post\" gets the route ",[391,1648,1649],{},"\u002Fmy-first-post"," (or ",[391,1652,1653],{},"\u002Fparent-path\u002Fmy-first-post"," when nested) unless you set one explicitly:",[426,1656,1658],{"className":428,"code":1657,"language":430,"meta":431,"style":431},"$cwa->pageData($article, 'blog-detail', '\u002Fblog\u002Fcustom-path', 'blog_article_custom')\n",[391,1659,1660],{"__ignoreMap":431},[435,1661,1662,1664,1666,1668,1670,1673,1676,1678,1680,1682,1684,1686,1688,1691,1693,1695,1697,1700,1702],{"class":437,"line":438},[435,1663,1107],{"class":463},[435,1665,1110],{"class":636},[435,1667,1113],{"class":695},[435,1669,1523],{"class":1116},[435,1671,1672],{"class":463},"($",[435,1674,1675],{"class":636},"article",[435,1677,749],{"class":463},[435,1679,699],{"class":685},[435,1681,1123],{"class":689},[435,1683,686],{"class":685},[435,1685,749],{"class":463},[435,1687,699],{"class":685},[435,1689,1690],{"class":689},"\u002Fblog\u002Fcustom-path",[435,1692,686],{"class":685},[435,1694,749],{"class":463},[435,1696,699],{"class":685},[435,1698,1699],{"class":689},"blog_article_custom",[435,1701,686],{"class":685},[435,1703,1157],{"class":463},[1705,1706],"hr",{},[365,1708,1710],{"id":1709},"nested-pages","Nested Pages",[370,1712,1713,1714,1717,1718,1721,1722,1725,1726,1728],{},"Some content naturally lives at more than one level — an event site might have ",[391,1715,1716],{},"\u002Fevents",", ",[391,1719,1720],{},"\u002Fevents\u002F2024",", and ",[391,1723,1724],{},"\u002Fevents\u002F2024\u002Fconference",". CWA handles this with a parent-child hierarchy on the PHP entities, automatic route path prefixing, and the ",[391,1727,192],{}," component on the front end that renders the next depth level.",[1730,1731],"diagram-nested-pages",{},[1733,1734,1736],"h3",{"id":1735},"the-php-fields","The PHP Fields",[370,1738,1739,1740,420,1742,1744,1745,1747],{},"Both ",[391,1741,415],{},[391,1743,411],{}," (which extends ",[391,1746,415],{},") carry two optional parent references:",[896,1749,1750,1763],{},[899,1751,1752],{},[902,1753,1754,1757,1760],{},[905,1755,1756],{},"Field",[905,1758,1759],{},"Type",[905,1761,1762],{},"Use",[915,1764,1765,1779],{},[902,1766,1767,1771,1776],{},[920,1768,1769],{},[391,1770,982],{},[920,1772,1773],{},[391,1774,1775],{},"?Page",[920,1777,1778],{},"This record is a child of a static Page",[902,1780,1781,1785,1790],{},[920,1782,1783],{},[391,1784,996],{},[920,1786,1787],{},[391,1788,1789],{},"?AbstractPageData",[920,1791,1792],{},"This record is a child of a dynamic PageData record",[370,1794,1795,1796,1799,1800,1802],{},"Set one or the other — not both. A child can be either a ",[391,1797,1798],{},"Page"," or a ",[391,1801,393],{}," record; the parent can be either type too.",[370,1804,1805,1806,1515],{},"You don't need to declare these fields in your entity classes — they are inherited from ",[391,1807,415],{},[1733,1809,1811],{"id":1810},"setting-up-hierarchy-in-fixtures","Setting up Hierarchy in Fixtures",[370,1813,1814,1815,1818,1819,1822,1823,1826,1827,1829],{},"Use ",[391,1816,1817],{},"->nested()"," on a ",[391,1820,1821],{},"PageBuilder"," or ",[391,1824,1825],{},"PageDataBuilder",". The closure receives a ",[391,1828,1627],{}," scoped to that parent — anything created inside automatically becomes a child:",[426,1831,1833],{"className":428,"code":1832,"language":430,"meta":431,"style":431},"\u002F\u002F Static parent at \u002Fevents, children are EventYear pages\n$cwa->page('event-list', 'EventList', 'main', '\u002Fevents')\n    ->nested(function (CwaFixtureBuilder $cwa) {\n        \u002F\u002F Title \"2024\" + parent path \u002Fevents → route auto-generated as \u002Fevents\u002F2024\n        $cwa->page('event-year-2024', 'EventYear', 'main')\n            ->title('2024');\n\n        $cwa->page('event-year-2025', 'EventYear', 'main')\n            ->title('2025');\n    });\n",[391,1834,1835,1840,1886,1910,1915,1953,1972,1976,2013,2030],{"__ignoreMap":431},[435,1836,1837],{"class":437,"line":438},[435,1838,1839],{"class":441},"\u002F\u002F Static parent at \u002Fevents, children are EventYear pages\n",[435,1841,1842,1844,1846,1848,1850,1852,1854,1857,1859,1861,1863,1866,1868,1870,1872,1874,1876,1878,1880,1882,1884],{"class":437,"line":445},[435,1843,1107],{"class":463},[435,1845,1110],{"class":636},[435,1847,1113],{"class":695},[435,1849,954],{"class":1116},[435,1851,737],{"class":463},[435,1853,686],{"class":685},[435,1855,1856],{"class":689},"event-list",[435,1858,686],{"class":685},[435,1860,749],{"class":463},[435,1862,699],{"class":685},[435,1864,1865],{"class":689},"EventList",[435,1867,686],{"class":685},[435,1869,749],{"class":463},[435,1871,699],{"class":685},[435,1873,1140],{"class":689},[435,1875,686],{"class":685},[435,1877,749],{"class":463},[435,1879,699],{"class":685},[435,1881,1716],{"class":689},[435,1883,686],{"class":685},[435,1885,1157],{"class":463},[435,1887,1888,1890,1893,1895,1898,1900,1902,1904,1906,1908],{"class":437,"line":467},[435,1889,1162],{"class":695},[435,1891,1892],{"class":1116},"nested",[435,1894,737],{"class":463},[435,1896,1897],{"class":823},"function",[435,1899,1182],{"class":463},[435,1901,1627],{"class":740},[435,1903,853],{"class":463},[435,1905,1110],{"class":636},[435,1907,725],{"class":463},[435,1909,1194],{"class":463},[435,1911,1912],{"class":437,"line":474},[435,1913,1914],{"class":441},"        \u002F\u002F Title \"2024\" + parent path \u002Fevents → route auto-generated as \u002Fevents\u002F2024\n",[435,1916,1917,1919,1921,1923,1925,1927,1929,1932,1934,1936,1938,1941,1943,1945,1947,1949,1951],{"class":437,"line":497},[435,1918,1199],{"class":463},[435,1920,1110],{"class":636},[435,1922,1113],{"class":695},[435,1924,954],{"class":1116},[435,1926,737],{"class":463},[435,1928,686],{"class":685},[435,1930,1931],{"class":689},"event-year-2024",[435,1933,686],{"class":685},[435,1935,749],{"class":463},[435,1937,699],{"class":685},[435,1939,1940],{"class":689},"EventYear",[435,1942,686],{"class":685},[435,1944,749],{"class":463},[435,1946,699],{"class":685},[435,1948,1140],{"class":689},[435,1950,686],{"class":685},[435,1952,1157],{"class":463},[435,1954,1955,1958,1960,1962,1964,1967,1969],{"class":437,"line":515},[435,1956,1957],{"class":695},"            ->",[435,1959,419],{"class":1116},[435,1961,737],{"class":463},[435,1963,686],{"class":685},[435,1965,1966],{"class":689},"2024",[435,1968,686],{"class":685},[435,1970,1971],{"class":463},");\n",[435,1973,1974],{"class":437,"line":534},[435,1975,471],{"emptyLinePlaceholder":470},[435,1977,1978,1980,1982,1984,1986,1988,1990,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011],{"class":437,"line":552},[435,1979,1199],{"class":463},[435,1981,1110],{"class":636},[435,1983,1113],{"class":695},[435,1985,954],{"class":1116},[435,1987,737],{"class":463},[435,1989,686],{"class":685},[435,1991,1992],{"class":689},"event-year-2025",[435,1994,686],{"class":685},[435,1996,749],{"class":463},[435,1998,699],{"class":685},[435,2000,1940],{"class":689},[435,2002,686],{"class":685},[435,2004,749],{"class":463},[435,2006,699],{"class":685},[435,2008,1140],{"class":689},[435,2010,686],{"class":685},[435,2012,1157],{"class":463},[435,2014,2015,2017,2019,2021,2023,2026,2028],{"class":437,"line":578},[435,2016,1957],{"class":695},[435,2018,419],{"class":1116},[435,2020,737],{"class":463},[435,2022,686],{"class":685},[435,2024,2025],{"class":689},"2025",[435,2027,686],{"class":685},[435,2029,1971],{"class":463},[435,2031,2032],{"class":437,"line":602},[435,2033,1267],{"class":463},[370,2035,2036],{},"Dynamic children (PageData records) work the same way:",[426,2038,2040],{"className":428,"code":2039,"language":430,"meta":431,"style":431},"\u002F\u002F Static listing page at \u002Fblog, children are BlogArticleData records\n$cwa->page('blog-listing', 'BlogListing', 'main', '\u002Fblog')\n    ->nested(function (CwaFixtureBuilder $cwa) use ($article1, $article2) {\n        \u002F\u002F Each pageData gets its route auto-prefixed to \u002Fblog\u002F\u003Ctitle-slug>\n        $cwa->pageData($article1, 'blog-detail');\n        $cwa->pageData($article2, 'blog-detail');\n    });\n",[391,2041,2042,2047,2094,2134,2139,2163,2187],{"__ignoreMap":431},[435,2043,2044],{"class":437,"line":438},[435,2045,2046],{"class":441},"\u002F\u002F Static listing page at \u002Fblog, children are BlogArticleData records\n",[435,2048,2049,2051,2053,2055,2057,2059,2061,2064,2066,2068,2070,2073,2075,2077,2079,2081,2083,2085,2087,2090,2092],{"class":437,"line":445},[435,2050,1107],{"class":463},[435,2052,1110],{"class":636},[435,2054,1113],{"class":695},[435,2056,954],{"class":1116},[435,2058,737],{"class":463},[435,2060,686],{"class":685},[435,2062,2063],{"class":689},"blog-listing",[435,2065,686],{"class":685},[435,2067,749],{"class":463},[435,2069,699],{"class":685},[435,2071,2072],{"class":689},"BlogListing",[435,2074,686],{"class":685},[435,2076,749],{"class":463},[435,2078,699],{"class":685},[435,2080,1140],{"class":689},[435,2082,686],{"class":685},[435,2084,749],{"class":463},[435,2086,699],{"class":685},[435,2088,2089],{"class":689},"\u002Fblog",[435,2091,686],{"class":685},[435,2093,1157],{"class":463},[435,2095,2096,2098,2100,2102,2104,2106,2108,2110,2112,2114,2117,2120,2123,2125,2127,2130,2132],{"class":437,"line":467},[435,2097,1162],{"class":695},[435,2099,1892],{"class":1116},[435,2101,737],{"class":463},[435,2103,1897],{"class":823},[435,2105,1182],{"class":463},[435,2107,1627],{"class":740},[435,2109,853],{"class":463},[435,2111,1110],{"class":636},[435,2113,725],{"class":463},[435,2115,2116],{"class":448}," use",[435,2118,2119],{"class":463}," ($",[435,2121,2122],{"class":636},"article1",[435,2124,749],{"class":463},[435,2126,853],{"class":463},[435,2128,2129],{"class":636},"article2",[435,2131,725],{"class":463},[435,2133,1194],{"class":463},[435,2135,2136],{"class":437,"line":474},[435,2137,2138],{"class":441},"        \u002F\u002F Each pageData gets its route auto-prefixed to \u002Fblog\u002F\u003Ctitle-slug>\n",[435,2140,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161],{"class":437,"line":497},[435,2142,1199],{"class":463},[435,2144,1110],{"class":636},[435,2146,1113],{"class":695},[435,2148,1523],{"class":1116},[435,2150,1672],{"class":463},[435,2152,2122],{"class":636},[435,2154,749],{"class":463},[435,2156,699],{"class":685},[435,2158,1123],{"class":689},[435,2160,686],{"class":685},[435,2162,1971],{"class":463},[435,2164,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185],{"class":437,"line":515},[435,2166,1199],{"class":463},[435,2168,1110],{"class":636},[435,2170,1113],{"class":695},[435,2172,1523],{"class":1116},[435,2174,1672],{"class":463},[435,2176,2129],{"class":636},[435,2178,749],{"class":463},[435,2180,699],{"class":685},[435,2182,1123],{"class":689},[435,2184,686],{"class":685},[435,2186,1971],{"class":463},[435,2188,2189],{"class":437,"line":534},[435,2190,1267],{"class":463},[370,2192,2193],{},"You can also set the fields directly on the entity, useful when building relationships outside of the fixture scaffold:",[426,2195,2197],{"className":428,"code":2196,"language":430,"meta":431,"style":431},"\u002F\u002F Child Page under a parent Page\n$childPage->setParentPage($parentPage);\n\n\u002F\u002F Child PageData under a parent Page\n$childPageData->setParentPage($parentPage);\n\n\u002F\u002F Child PageData under a parent PageData (e.g. blog post under a category)\n$childPageData->setParentPageData($parentCategoryData);\n",[391,2198,2199,2204,2222,2226,2231,2248,2252,2257],{"__ignoreMap":431},[435,2200,2201],{"class":437,"line":438},[435,2202,2203],{"class":441},"\u002F\u002F Child Page under a parent Page\n",[435,2205,2206,2208,2211,2213,2216,2218,2220],{"class":437,"line":445},[435,2207,1107],{"class":463},[435,2209,2210],{"class":636},"childPage",[435,2212,1113],{"class":695},[435,2214,2215],{"class":1116},"setParentPage",[435,2217,1672],{"class":463},[435,2219,982],{"class":636},[435,2221,1971],{"class":463},[435,2223,2224],{"class":437,"line":467},[435,2225,471],{"emptyLinePlaceholder":470},[435,2227,2228],{"class":437,"line":474},[435,2229,2230],{"class":441},"\u002F\u002F Child PageData under a parent Page\n",[435,2232,2233,2235,2238,2240,2242,2244,2246],{"class":437,"line":497},[435,2234,1107],{"class":463},[435,2236,2237],{"class":636},"childPageData",[435,2239,1113],{"class":695},[435,2241,2215],{"class":1116},[435,2243,1672],{"class":463},[435,2245,982],{"class":636},[435,2247,1971],{"class":463},[435,2249,2250],{"class":437,"line":515},[435,2251,471],{"emptyLinePlaceholder":470},[435,2253,2254],{"class":437,"line":534},[435,2255,2256],{"class":441},"\u002F\u002F Child PageData under a parent PageData (e.g. blog post under a category)\n",[435,2258,2259,2261,2263,2265,2268,2270,2273],{"class":437,"line":552},[435,2260,1107],{"class":463},[435,2262,2237],{"class":636},[435,2264,1113],{"class":695},[435,2266,2267],{"class":1116},"setParentPageData",[435,2269,1672],{"class":463},[435,2271,2272],{"class":636},"parentCategoryData",[435,2274,1971],{"class":463},[1733,2276,2278],{"id":2277},"route-auto-prefixing","Route Auto-Prefixing",[370,2280,2281,2284],{},[391,2282,2283],{},"RouteGenerator"," reads the parent's route path and prepends it to the child's generated slug. This cascades through any number of levels:",[896,2286,2287,2302],{},[899,2288,2289],{},[902,2290,2291,2293,2296,2299],{},[905,2292,460],{},[905,2294,2295],{},"Parent path",[905,2297,2298],{},"Title",[905,2300,2301],{},"Generated route",[915,2303,2304,2320],{},[902,2305,2306,2308,2312,2316],{},[920,2307,1940],{},[920,2309,2310],{},[391,2311,1716],{},[920,2313,2314],{},[391,2315,1966],{},[920,2317,2318],{},[391,2319,1720],{},[902,2321,2322,2325,2329,2334],{},[920,2323,2324],{},"ConferenceData",[920,2326,2327],{},[391,2328,1720],{},[920,2330,2331],{},[391,2332,2333],{},"Spring Conference",[920,2335,2336],{},[391,2337,2338],{},"\u002Fevents\u002F2024\u002Fspring-conference",[370,2340,2341,2342,2345,2346,2349],{},"An explicit ",[391,2343,2344],{},"route:"," on the child still gets prefixed — only the top-level ",[391,2347,2348],{},"\u002F"," is preserved as-is. If you need a child at a completely custom path, set its route explicitly after the parent path has been established.",[1733,2351,2353],{"id":2352},"cascading-route-changes","Cascading Route Changes",[370,2355,2356,2357,2360,2361,2364,2365,2368],{},"When an admin renames a parent route, ",[391,2358,2359],{},"PATCH \u002F_\u002Froutes\u002F\u002Fevents"," with ",[391,2362,2363],{},"cascadeChildPaths: true"," updates the entire subtree and creates ",[391,2366,2367],{},"301"," redirects from every old path:",[426,2370,2374],{"className":2371,"code":2372,"language":2373,"meta":431,"style":431},"language-json shiki shiki-themes github-light github-dark material-theme-palenight","PATCH \u002F_\u002Froutes\u002F\u002Fevents\nContent-Type: application\u002Fmerge-patch+json\n\n{\n  \"path\": \"\u002Fhappenings\",\n  \"cascadeChildPaths\": true\n}\n","json",[391,2375,2376,2384,2389,2393,2397,2421,2435],{"__ignoreMap":431},[435,2377,2378,2381],{"class":437,"line":438},[435,2379,2380],{"class":636},"PATCH \u002F_\u002Froutes",[435,2382,2383],{"class":441},"\u002F\u002Fevents\n",[435,2385,2386],{"class":437,"line":445},[435,2387,2388],{"class":636},"Content-Type: application\u002Fmerge-patch+json\n",[435,2390,2391],{"class":437,"line":467},[435,2392,471],{"emptyLinePlaceholder":470},[435,2394,2395],{"class":437,"line":474},[435,2396,838],{"class":463},[435,2398,2399,2402,2406,2409,2411,2414,2417,2419],{"class":437,"line":497},[435,2400,2401],{"class":484},"  \"",[435,2403,2405],{"class":2404},"sphPO","path",[435,2407,2408],{"class":484},"\"",[435,2410,665],{"class":463},[435,2412,2413],{"class":685}," \"",[435,2415,2416],{"class":689},"\u002Fhappenings",[435,2418,2408],{"class":685},[435,2420,671],{"class":463},[435,2422,2423,2425,2428,2430,2432],{"class":437,"line":515},[435,2424,2401],{"class":484},[435,2426,2427],{"class":2404},"cascadeChildPaths",[435,2429,2408],{"class":484},[435,2431,665],{"class":463},[435,2433,2434],{"class":484}," true\n",[435,2436,2437],{"class":437,"line":534},[435,2438,890],{"class":463},[370,2440,2441],{},"Result:",[2443,2444,2445,2452,2459],"ul",{},[1046,2446,2447,2449,2450],{},[391,2448,1716],{}," → redirects to ",[391,2451,2416],{},[1046,2453,2454,2449,2456],{},[391,2455,1720],{},[391,2457,2458],{},"\u002Fhappenings\u002F2024",[1046,2460,2461,2449,2463],{},[391,2462,2338],{},[391,2464,2465],{},"\u002Fhappenings\u002F2024\u002Fspring-conference",[370,2467,2468,2469,2471],{},"Without ",[391,2470,2363],{}," only the one route is updated; child paths keep their old prefixes and become orphaned.",[1733,2473,2475],{"id":2474},"fetching-a-routes-children","Fetching a Route's Children",[370,2477,2478,2479,2482],{},"Retrieve the full child tree for a route (requires ",[391,2480,2481],{},"ROLE_ADMIN","):",[426,2484,2487],{"className":2485,"code":2486,"language":1035},[1033],"GET \u002F_\u002Froutes\u002F\u002Fevents\u002Fchildren\n",[391,2488,2486],{"__ignoreMap":431},[370,2490,2491],{},"Response:",[426,2493,2495],{"className":2371,"code":2494,"language":2373,"meta":431,"style":431},"{\n  \"children\": [\n    {\n      \"route\": \"\u002F_\u002Froutes\u002F\u002Fevents\u002F2024\",\n      \"path\": \"\u002Fevents\u002F2024\",\n      \"children\": [\n        {\n          \"route\": \"\u002F_\u002Froutes\u002F\u002Fevents\u002F2024\u002Fspring-conference\",\n          \"path\": \"\u002Fevents\u002F2024\u002Fspring-conference\",\n          \"children\": []\n        }\n      ]\n    },\n    {\n      \"route\": \"\u002F_\u002Froutes\u002F\u002Fevents\u002F2025\",\n      \"path\": \"\u002Fevents\u002F2025\",\n      \"children\": []\n    }\n  ]\n}\n",[391,2496,2497,2501,2515,2520,2540,2558,2570,2575,2595,2613,2626,2631,2636,2641,2645,2664,2683,2695,2700,2705],{"__ignoreMap":431},[435,2498,2499],{"class":437,"line":438},[435,2500,838],{"class":463},[435,2502,2503,2505,2508,2510,2512],{"class":437,"line":445},[435,2504,2401],{"class":484},[435,2506,2507],{"class":2404},"children",[435,2509,2408],{"class":484},[435,2511,665],{"class":463},[435,2513,2514],{"class":463}," [\n",[435,2516,2517],{"class":437,"line":467},[435,2518,2519],{"class":463},"    {\n",[435,2521,2522,2525,2527,2529,2531,2533,2536,2538],{"class":437,"line":474},[435,2523,2524],{"class":484},"      \"",[435,2526,968],{"class":740},[435,2528,2408],{"class":484},[435,2530,665],{"class":463},[435,2532,2413],{"class":685},[435,2534,2535],{"class":689},"\u002F_\u002Froutes\u002F\u002Fevents\u002F2024",[435,2537,2408],{"class":685},[435,2539,671],{"class":463},[435,2541,2542,2544,2546,2548,2550,2552,2554,2556],{"class":437,"line":497},[435,2543,2524],{"class":484},[435,2545,2405],{"class":740},[435,2547,2408],{"class":484},[435,2549,665],{"class":463},[435,2551,2413],{"class":685},[435,2553,1720],{"class":689},[435,2555,2408],{"class":685},[435,2557,671],{"class":463},[435,2559,2560,2562,2564,2566,2568],{"class":437,"line":515},[435,2561,2524],{"class":484},[435,2563,2507],{"class":740},[435,2565,2408],{"class":484},[435,2567,665],{"class":463},[435,2569,2514],{"class":463},[435,2571,2572],{"class":437,"line":534},[435,2573,2574],{"class":463},"        {\n",[435,2576,2577,2580,2582,2584,2586,2588,2591,2593],{"class":437,"line":552},[435,2578,2579],{"class":484},"          \"",[435,2581,968],{"class":718},[435,2583,2408],{"class":484},[435,2585,665],{"class":463},[435,2587,2413],{"class":685},[435,2589,2590],{"class":689},"\u002F_\u002Froutes\u002F\u002Fevents\u002F2024\u002Fspring-conference",[435,2592,2408],{"class":685},[435,2594,671],{"class":463},[435,2596,2597,2599,2601,2603,2605,2607,2609,2611],{"class":437,"line":578},[435,2598,2579],{"class":484},[435,2600,2405],{"class":718},[435,2602,2408],{"class":484},[435,2604,665],{"class":463},[435,2606,2413],{"class":685},[435,2608,2338],{"class":689},[435,2610,2408],{"class":685},[435,2612,671],{"class":463},[435,2614,2615,2617,2619,2621,2623],{"class":437,"line":602},[435,2616,2579],{"class":484},[435,2618,2507],{"class":718},[435,2620,2408],{"class":484},[435,2622,665],{"class":463},[435,2624,2625],{"class":463}," []\n",[435,2627,2628],{"class":437,"line":628},[435,2629,2630],{"class":463},"        }\n",[435,2632,2633],{"class":437,"line":633},[435,2634,2635],{"class":463},"      ]\n",[435,2637,2638],{"class":437,"line":649},[435,2639,2640],{"class":463},"    },\n",[435,2642,2643],{"class":437,"line":659},[435,2644,2519],{"class":463},[435,2646,2647,2649,2651,2653,2655,2657,2660,2662],{"class":437,"line":674},[435,2648,2524],{"class":484},[435,2650,968],{"class":740},[435,2652,2408],{"class":484},[435,2654,665],{"class":463},[435,2656,2413],{"class":685},[435,2658,2659],{"class":689},"\u002F_\u002Froutes\u002F\u002Fevents\u002F2025",[435,2661,2408],{"class":685},[435,2663,671],{"class":463},[435,2665,2666,2668,2670,2672,2674,2676,2679,2681],{"class":437,"line":710},[435,2667,2524],{"class":484},[435,2669,2405],{"class":740},[435,2671,2408],{"class":484},[435,2673,665],{"class":463},[435,2675,2413],{"class":685},[435,2677,2678],{"class":689},"\u002Fevents\u002F2025",[435,2680,2408],{"class":685},[435,2682,671],{"class":463},[435,2684,2685,2687,2689,2691,2693],{"class":437,"line":722},[435,2686,2524],{"class":484},[435,2688,2507],{"class":740},[435,2690,2408],{"class":484},[435,2692,665],{"class":463},[435,2694,2625],{"class":463},[435,2696,2697],{"class":437,"line":730},[435,2698,2699],{"class":463},"    }\n",[435,2701,2702],{"class":437,"line":779},[435,2703,2704],{"class":463},"  ]\n",[435,2706,2707],{"class":437,"line":820},[435,2708,890],{"class":463},[370,2710,2711,2712,2714],{},"Each node has the route IRI, the resolved path, and a recursive ",[391,2713,2507],{}," array.",[1733,2716,2718],{"id":2717},"the-resource-manifest","The Resource Manifest",[370,2720,2721,2722,2725,2726,2729],{},"When the Nuxt module resolves a nested URL, it fetches a depth-grouped manifest from ",[391,2723,2724],{},"\u002F_\u002Fresource_manifest\u002F{id}"," (accepts both the route path and the admin UUID). The ",[391,2727,2728],{},"resource_iris"," field is an array of arrays — each inner array holds the IRIs for one depth level:",[426,2731,2733],{"className":2371,"code":2732,"language":2373,"meta":431,"style":431},"{\n  \"resource_iris\": [\n    [\"\u002Fevents\", \"\u002Flayouts\u002Fprimary\"],\n    [\"\u002Fevents\u002F2024\", \"\u002Flayouts\u002Fprimary\"],\n    [\"\u002Fpage_data\u002Fevent_years\u002F456\"]\n  ]\n}\n",[391,2734,2735,2739,2751,2773,2793,2806,2810],{"__ignoreMap":431},[435,2736,2737],{"class":437,"line":438},[435,2738,838],{"class":463},[435,2740,2741,2743,2745,2747,2749],{"class":437,"line":445},[435,2742,2401],{"class":484},[435,2744,2728],{"class":2404},[435,2746,2408],{"class":484},[435,2748,665],{"class":463},[435,2750,2514],{"class":463},[435,2752,2753,2756,2758,2760,2762,2764,2766,2769,2771],{"class":437,"line":467},[435,2754,2755],{"class":463},"    [",[435,2757,2408],{"class":685},[435,2759,1716],{"class":689},[435,2761,2408],{"class":685},[435,2763,749],{"class":463},[435,2765,2413],{"class":685},[435,2767,2768],{"class":689},"\u002Flayouts\u002Fprimary",[435,2770,2408],{"class":685},[435,2772,707],{"class":463},[435,2774,2775,2777,2779,2781,2783,2785,2787,2789,2791],{"class":437,"line":474},[435,2776,2755],{"class":463},[435,2778,2408],{"class":685},[435,2780,1720],{"class":689},[435,2782,2408],{"class":685},[435,2784,749],{"class":463},[435,2786,2413],{"class":685},[435,2788,2768],{"class":689},[435,2790,2408],{"class":685},[435,2792,707],{"class":463},[435,2794,2795,2797,2799,2802,2804],{"class":437,"line":497},[435,2796,2755],{"class":463},[435,2798,2408],{"class":685},[435,2800,2801],{"class":689},"\u002Fpage_data\u002Fevent_years\u002F456",[435,2803,2408],{"class":685},[435,2805,646],{"class":463},[435,2807,2808],{"class":437,"line":515},[435,2809,2704],{"class":463},[435,2811,2812],{"class":437,"line":534},[435,2813,890],{"class":463},[370,2815,2816,2817,2819],{},"Depth 0 contains the top-level Page and Layout IRIs. Depth 1 contains the child Page or PageData IRI. Depth 2 and beyond continue the pattern. The module fetches all of these in parallel and passes the right IRI to each ",[391,2818,192],{}," level.",[1733,2821,2823],{"id":2822},"seo-titles-and-meta-descriptions-for-nested-pages","SEO Titles and Meta Descriptions for Nested Pages",[370,2825,2826,2827,2829,2830,2832,2833,420,2835,2837],{},"The module's ",[391,2828,192],{}," template sets the page ",[391,2831,933],{}," and meta description automatically from ",[391,2834,419],{},[391,2836,423],{}," fields on your Page and PageData entities. For nested routes the behaviour is:",[370,2839,2840,2842,2843,665],{},[374,2841,2298],{}," — collected from every depth level, leaf-first, joined with ",[391,2844,2845],{},"|",[896,2847,2848,2863],{},[899,2849,2850],{},[902,2851,2852,2855,2858],{},[905,2853,2854],{},"Nesting",[905,2856,2857],{},"Titles collected (leaf → root)",[905,2859,2860,2862],{},[391,2861,933],{}," output",[915,2864,2865,2880,2899],{},[902,2866,2867,2870,2875],{},[920,2868,2869],{},"Flat page",[920,2871,2872],{},[391,2873,2874],{},"\"Conference\"",[920,2876,2877],{},[391,2878,2879],{},"Conference",[902,2881,2882,2885,2894],{},[920,2883,2884],{},"Two-level",[920,2886,2887,2890,2891,2893],{},[391,2888,2889],{},"\"Programme\""," (depth 1) + ",[391,2892,2874],{}," (depth 0)",[920,2895,2896],{},[391,2897,2898],{},"Programme | Conference",[902,2900,2901,2904,2914],{},[920,2902,2903],{},"Three-level",[920,2905,2906,2909,2910,2909,2912],{},[391,2907,2908],{},"\"Talk\""," + ",[391,2911,2889],{},[391,2913,2874],{},[920,2915,2916],{},[391,2917,2918],{},"Talk | Programme | Conference",[370,2920,2921,2924,2925,2927],{},[374,2922,2923],{},"Meta description"," — the deepest depth that has a non-empty ",[391,2926,423],{}," wins. This means the most specific page data always takes precedence over the parent.",[370,2929,2930],{},"For flat (single-depth) pages this is identical to the previous behaviour — just the page or pageData title with no separator.",[2932,2933,2934],"style",{},"html pre.shiki code .sTBSN, html code.shiki .sTBSN{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .stmX-, html code.shiki .stmX-{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F78C6C}html pre.shiki code .sRCss, html code.shiki .sRCss{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#FFCB6B}html pre.shiki code .sn4go, html code.shiki .sn4go{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#89DDFF}html pre.shiki code .sOvfz, html code.shiki .sOvfz{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}html pre.shiki code .sc2zw, html code.shiki .sc2zw{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#BABED8}html pre.shiki code .sBtbT, html code.shiki .sBtbT{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#89DDFF}html pre.shiki code .sPB8G, html code.shiki .sPB8G{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#BABED8}html pre.shiki code .seSrl, html code.shiki .seSrl{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#89DDFF}html pre.shiki code .sLL54, html code.shiki .sLL54{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#C3E88D}html pre.shiki code .sVlFx, html code.shiki .sVlFx{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#89DDFF}html pre.shiki code .scSvc, html code.shiki .scSvc{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#F78C6C}html pre.shiki code .sbW4m, html code.shiki .sbW4m{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#FFCB6B}html pre.shiki code .swB56, html code.shiki .swB56{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#C792EA}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sKpYG, html code.shiki .sKpYG{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#82AAFF}html pre.shiki code .sphPO, html code.shiki .sphPO{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#C792EA}",{"title":431,"searchDepth":445,"depth":445,"links":2936},[2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947],{"id":367,"depth":445,"text":368},{"id":383,"depth":445,"text":54},{"id":404,"depth":445,"text":405},{"id":893,"depth":445,"text":894},{"id":1022,"depth":445,"text":1023},{"id":1040,"depth":445,"text":1041},{"id":1087,"depth":445,"text":1088},{"id":1300,"depth":445,"text":1301},{"id":1454,"depth":445,"text":1455},{"id":1616,"depth":445,"text":1617},{"id":1709,"depth":445,"text":1710,"children":2948},[2949,2950,2951,2952,2953,2954,2955],{"id":1735,"depth":467,"text":1736},{"id":1810,"depth":467,"text":1811},{"id":2277,"depth":467,"text":2278},{"id":2352,"depth":467,"text":2353},{"id":2474,"depth":467,"text":2475},{"id":2717,"depth":467,"text":2718},{"id":2822,"depth":467,"text":2823},"Build blogs, event listings, and multi-level page hierarchies using AbstractPageData and nested Page relationships.","md",{},{"title":117,"description":2956},"5cmJD3Mdll0j1XiEYPRkMvU5vO203d-1mjLsQNp2Hvw",[2962,2964],{"title":113,"path":114,"stem":115,"description":2963,"children":-1},"Render Symfony form types via the API, handle validation field-by-field, and process submissions with FormSuccessEvent.",{"title":121,"path":122,"stem":123,"description":2965,"children":-1},"JWT cookie authentication, the AbstractUser entity, email verification, password reset, and Symfony security configuration.",1782512897350]