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