[{"data":1,"prerenderedAt":2024},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Fyour-first-dynamic-page":604,"\u002Fguides\u002Fyour-first-dynamic-page-surround":2019},[4,24,67,93,236,533],{"title":5,"path":6,"stem":7,"children":8,"collapsed":23},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11,15,19],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":16,"path":17,"stem":18},"Key Ideas","\u002Fgetting-started\u002Fkey-ideas","1.getting-started\u002F3.key-ideas",{"title":20,"path":21,"stem":22},"Releases","\u002Fgetting-started\u002Freleases","1.getting-started\u002F4.releases",true,{"title":25,"path":26,"stem":27,"children":28,"collapsed":23},"Core Concepts","\u002Fcore-concepts","2.core-concepts\u002F0.index",[29,31,35,39,43,47,51,55,59,63],{"title":30,"path":26,"stem":27},"Overview",{"title":32,"path":33,"stem":34},"How It All Works","\u002Fcore-concepts\u002Farchitecture","2.core-concepts\u002F1.architecture",{"title":36,"path":37,"stem":38},"The Data Model","\u002Fcore-concepts\u002Fthe-data-model","2.core-concepts\u002F2.the-data-model",{"title":40,"path":41,"stem":42},"Layouts & Pages","\u002Fcore-concepts\u002Flayouts-and-pages","2.core-concepts\u002F3.layouts-and-pages",{"title":44,"path":45,"stem":46},"Dynamic Pages","\u002Fcore-concepts\u002Fdynamic-pages","2.core-concepts\u002F4.dynamic-pages",{"title":48,"path":49,"stem":50},"Components","\u002Fcore-concepts\u002Fcomponents","2.core-concepts\u002F5.components",{"title":52,"path":53,"stem":54},"Draft & Publish Workflow","\u002Fcore-concepts\u002Fdraft-and-publish","2.core-concepts\u002F6.draft-and-publish",{"title":56,"path":57,"stem":58},"The Admin Panel","\u002Fcore-concepts\u002Fadmin-panel","2.core-concepts\u002F7.admin-panel",{"title":60,"path":61,"stem":62},"Caching","\u002Fcore-concepts\u002Fcaching","2.core-concepts\u002F8.caching",{"title":64,"path":65,"stem":66},"Glossary","\u002Fcore-concepts\u002Fglossary","2.core-concepts\u002F9.glossary",{"title":68,"path":69,"stem":70,"children":71,"collapsed":23},"Guides","\u002Fguides","3.guides\u002F0.index",[72,73,77,81,85,89],{"title":30,"path":69,"stem":70},{"title":74,"path":75,"stem":76},"Your First Layout","\u002Fguides\u002Fyour-first-layout","3.guides\u002F1.your-first-layout",{"title":78,"path":79,"stem":80},"Your First Page Template","\u002Fguides\u002Fyour-first-page-template","3.guides\u002F2.your-first-page-template",{"title":82,"path":83,"stem":84},"Your First Component","\u002Fguides\u002Fyour-first-component","3.guides\u002F3.your-first-component",{"title":86,"path":87,"stem":88},"Alternative UI Variants","\u002Fguides\u002Falternative-ui-variants","3.guides\u002F4.alternative-ui-variants",{"title":90,"path":91,"stem":92},"Your First Dynamic Page","\u002Fguides\u002Fyour-first-dynamic-page","3.guides\u002F5.your-first-dynamic-page",{"title":94,"path":95,"stem":96,"children":97,"collapsed":23},"API Bundle (Back-End)","\u002Fapi","4.api\u002F0.index",[98,99,103,107,129,175,179,183,212,216,220,224,228,232],{"title":30,"path":95,"stem":96},{"title":100,"path":101,"stem":102},"Bundle Setup","\u002Fapi\u002Fbundle-setup","4.api\u002F02.bundle-setup",{"title":104,"path":105,"stem":106},"Configuration Reference","\u002Fapi\u002Fconfiguration","4.api\u002F03.configuration",{"title":108,"path":109,"stem":110,"children":111,"page":128},"Users","\u002Fapi\u002Fusers","4.api\u002F04.users",[112,116,120,124],{"title":113,"path":114,"stem":115},"Authentication","\u002Fapi\u002Fusers\u002Fauthentication","4.api\u002F04.users\u002F1.authentication",{"title":117,"path":118,"stem":119},"User Emails","\u002Fapi\u002Fusers\u002Fuser-emails","4.api\u002F04.users\u002F2.user-emails",{"title":121,"path":122,"stem":123},"Access Control","\u002Fapi\u002Fusers\u002Faccess-control","4.api\u002F04.users\u002F3.access-control",{"title":125,"path":126,"stem":127},"Sites with Non-Admin Users","\u002Fapi\u002Fusers\u002Fnon-admin-users","4.api\u002F04.users\u002F4.non-admin-users",false,{"title":48,"path":130,"stem":131,"children":132,"page":128},"\u002Fapi\u002Fcomponents","4.api\u002F05.components",[133,137,158,171],{"title":134,"path":135,"stem":136},"Creating Components","\u002Fapi\u002Fcomponents\u002Fcreating-components","4.api\u002F05.components\u002F1.creating-components",{"title":138,"path":139,"stem":140,"children":141,"page":128},"Annotations","\u002Fapi\u002Fcomponents\u002Fannotations","4.api\u002F05.components\u002F2.annotations",[142,146,150,154],{"title":143,"path":144,"stem":145},"Publishable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fpublishable","4.api\u002F05.components\u002F2.annotations\u002F1.publishable",{"title":147,"path":148,"stem":149},"Uploadable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable","4.api\u002F05.components\u002F2.annotations\u002F2.uploadable",{"title":151,"path":152,"stem":153},"Timestamped","\u002Fapi\u002Fcomponents\u002Fannotations\u002Ftimestamped","4.api\u002F05.components\u002F2.annotations\u002F3.timestamped",{"title":155,"path":156,"stem":157},"Explicit Allow Only","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fexplicit-allow-only","4.api\u002F05.components\u002F2.annotations\u002F4.explicit-allow-only",{"title":159,"path":160,"stem":161,"children":162,"page":128},"Built Ins","\u002Fapi\u002Fcomponents\u002Fbuilt-ins","4.api\u002F05.components\u002F3.built-ins",[163,167],{"title":164,"path":165,"stem":166},"Collection Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fcollection-component","4.api\u002F05.components\u002F3.built-ins\u002F1.collection-component",{"title":168,"path":169,"stem":170},"Form Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fform-component","4.api\u002F05.components\u002F3.built-ins\u002F2.form-component",{"title":172,"path":173,"stem":174},"Groups & Positions","\u002Fapi\u002Fcomponents\u002Fcomponent-groups","4.api\u002F05.components\u002F4.component-groups",{"title":176,"path":177,"stem":178},"Page Data & Nested Pages","\u002Fapi\u002Fdynamic-pages","4.api\u002F06.dynamic-pages",{"title":180,"path":181,"stem":182},"Routes","\u002Fapi\u002Froutes","4.api\u002F07.routes",{"title":184,"path":185,"stem":186,"children":187,"page":128},"Data Fixtures","\u002Fapi\u002Fdata-fixtures","4.api\u002F08.data-fixtures",[188,192,196,200,204,208],{"title":189,"path":190,"stem":191},"Getting Started with Fixtures","\u002Fapi\u002Fdata-fixtures\u002Fgetting-started","4.api\u002F08.data-fixtures\u002F1.getting-started",{"title":193,"path":194,"stem":195},"Writing a Scaffold","\u002Fapi\u002Fdata-fixtures\u002Fwriting-a-scaffold","4.api\u002F08.data-fixtures\u002F2.writing-a-scaffold",{"title":197,"path":198,"stem":199},"Builder Reference","\u002Fapi\u002Fdata-fixtures\u002Fbuilder-reference","4.api\u002F08.data-fixtures\u002F3.builder-reference",{"title":201,"path":202,"stem":203},"Seeding Content","\u002Fapi\u002Fdata-fixtures\u002Fseeding-content","4.api\u002F08.data-fixtures\u002F4.seeding-content",{"title":205,"path":206,"stem":207},"Appending & Multiple Scaffolds","\u002Fapi\u002Fdata-fixtures\u002Fappending","4.api\u002F08.data-fixtures\u002F5.appending",{"title":209,"path":210,"stem":211},"Generating Fixtures","\u002Fapi\u002Fdata-fixtures\u002Fgenerating-fixtures","4.api\u002F08.data-fixtures\u002F6.generating-fixtures",{"title":213,"path":214,"stem":215},"Real-Time (Mercure)","\u002Fapi\u002Freal-time","4.api\u002F09.real-time",{"title":217,"path":218,"stem":219},"Versions & Conflicts","\u002Fapi\u002Fversions-and-conflicts","4.api\u002F09.versions-and-conflicts",{"title":221,"path":222,"stem":223},"HTTP Caching","\u002Fapi\u002Fhttp-caching","4.api\u002F10.http-caching",{"title":225,"path":226,"stem":227},"Orphaned Data","\u002Fapi\u002Forphaned-data","4.api\u002F11.orphaned-data",{"title":229,"path":230,"stem":231},"Console Commands","\u002Fapi\u002Fconsole-commands","4.api\u002F12.console-commands",{"title":233,"path":234,"stem":235},"Debugging & Errors","\u002Fapi\u002Fdebugging","4.api\u002F13.debugging",{"title":237,"path":238,"stem":239,"children":240,"collapsed":23},"Nuxt Module (Front-End)","\u002Fnuxt-module","5.nuxt-module\u002F0.index",[241,242,246,259,279,308,329,460,494,497,525,529],{"title":30,"path":238,"stem":239},{"title":243,"path":244,"stem":245},"Module Setup","\u002Fnuxt-module\u002Fmodule-setup","5.nuxt-module\u002F01.module-setup",{"title":247,"path":248,"stem":249,"children":250,"page":128},"Configuration","\u002Fnuxt-module\u002Fconfiguration","5.nuxt-module\u002F02.configuration",[251,255],{"title":252,"path":253,"stem":254},"Nuxt Config","\u002Fnuxt-module\u002Fconfiguration\u002Fnuxt-config","5.nuxt-module\u002F02.configuration\u002F1.nuxt-config",{"title":256,"path":257,"stem":258},"Site Config & SEO","\u002Fnuxt-module\u002Fconfiguration\u002Fsite-config-and-seo","5.nuxt-module\u002F02.configuration\u002F2.site-config-and-seo",{"title":260,"path":261,"stem":262,"children":263,"page":128},"Building Your Ui","\u002Fnuxt-module\u002Fbuilding-your-ui","5.nuxt-module\u002F03.building-your-ui",[264,268,272,275],{"title":265,"path":266,"stem":267},"Layouts","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-layouts","5.nuxt-module\u002F03.building-your-ui\u002F1.creating-layouts",{"title":269,"path":270,"stem":271},"Page Templates","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-page-templates","5.nuxt-module\u002F03.building-your-ui\u002F2.creating-page-templates",{"title":48,"path":273,"stem":274},"\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-components","5.nuxt-module\u002F03.building-your-ui\u002F3.creating-components",{"title":276,"path":277,"stem":278},"CLI Generator","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcwa-cli","5.nuxt-module\u002F03.building-your-ui\u002F4.cwa-cli",{"title":280,"path":281,"stem":282,"children":283,"page":128},"Component Helpers","\u002Fnuxt-module\u002Fcomponent-helpers","5.nuxt-module\u002F04.component-helpers",[284,288,292,296,300,304],{"title":285,"path":286,"stem":287},"Images & Media","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fimages-and-uploads","5.nuxt-module\u002F04.component-helpers\u002F1.images-and-uploads",{"title":289,"path":290,"stem":291},"Collections & Pagination","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fcollections-and-pagination","5.nuxt-module\u002F04.component-helpers\u002F2.collections-and-pagination",{"title":293,"path":294,"stem":295},"HTML Content","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fhtml-content","5.nuxt-module\u002F04.component-helpers\u002F3.html-content",{"title":297,"path":298,"stem":299},"Rich-Text Editor","\u002Fnuxt-module\u002Fcomponent-helpers\u002Frich-text-editor","5.nuxt-module\u002F04.component-helpers\u002F4.rich-text-editor",{"title":301,"path":302,"stem":303},"Real-Time Updates","\u002Fnuxt-module\u002Fcomponent-helpers\u002Freal-time-updates","5.nuxt-module\u002F04.component-helpers\u002F5.real-time-updates",{"title":305,"path":306,"stem":307},"Forms","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fforms","5.nuxt-module\u002F04.component-helpers\u002F6.forms",{"title":309,"path":310,"stem":311,"children":312,"page":128},"Cwa Components","\u002Fnuxt-module\u002Fcwa-components","5.nuxt-module\u002F05.cwa-components",[313,317,321,325],{"title":314,"path":315,"stem":316},"\u003CCwaComponentGroup \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-component-group","5.nuxt-module\u002F05.cwa-components\u002F1.cwa-component-group",{"title":318,"path":319,"stem":320},"\u003CCwaPage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-page","5.nuxt-module\u002F05.cwa-components\u002F2.cwa-page",{"title":322,"path":323,"stem":324},"\u003CCwaLink \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-link","5.nuxt-module\u002F05.cwa-components\u002F3.cwa-link",{"title":326,"path":327,"stem":328},"\u003CCwaDefaultLayout \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-default-layout","5.nuxt-module\u002F05.cwa-components\u002F5.cwa-default-layout",{"title":330,"path":331,"stem":332,"children":333,"page":128},"Composables","\u002Fnuxt-module\u002Fcomposables","5.nuxt-module\u002F06.composables",[334,337,345,370,390,415,435],{"title":30,"path":335,"stem":336},"\u002Fnuxt-module\u002Fcomposables\u002Foverview","5.nuxt-module\u002F06.composables\u002F0.overview",{"title":338,"path":339,"stem":340,"children":341,"page":128},"Layout","\u002Fnuxt-module\u002Fcomposables\u002Flayout","5.nuxt-module\u002F06.composables\u002F1.layout",[342],{"title":338,"path":343,"stem":344},"\u002Fnuxt-module\u002Fcomposables\u002Flayout\u002Fuse-cwa-layout","5.nuxt-module\u002F06.composables\u002F1.layout\u002F1.use-cwa-layout",{"title":346,"path":347,"stem":348,"children":349,"page":128},"Component","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent","5.nuxt-module\u002F06.composables\u002F2.component",[350,354,358,362,366],{"title":351,"path":352,"stem":353},"Component (recommended)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-component","5.nuxt-module\u002F06.composables\u002F2.component\u002F1.use-cwa-component",{"title":355,"path":356,"stem":357},"Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-resource","5.nuxt-module\u002F06.composables\u002F2.component\u002F2.use-cwa-resource",{"title":359,"path":360,"stem":361},"File Field","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-file-field","5.nuxt-module\u002F06.composables\u002F2.component\u002F3.use-cwa-file-field",{"title":363,"path":364,"stem":365},"Collection Pagination","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-pagination","5.nuxt-module\u002F06.composables\u002F2.component\u002F4.use-cwa-collection-pagination",{"title":367,"path":368,"stem":369},"Collection Resource (deprecated)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-resource","5.nuxt-module\u002F06.composables\u002F2.component\u002F9.use-cwa-collection-resource",{"title":371,"path":372,"stem":373,"children":374,"page":128},"Form","\u002Fnuxt-module\u002Fcomposables\u002Fform","5.nuxt-module\u002F06.composables\u002F3.form",[375,378,382,386],{"title":371,"path":376,"stem":377},"\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form","5.nuxt-module\u002F06.composables\u002F3.form\u002F1.use-cwa-form",{"title":379,"path":380,"stem":381},"Form Input","\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form-input","5.nuxt-module\u002F06.composables\u002F3.form\u002F2.use-cwa-form-input",{"title":383,"path":384,"stem":385},"Form Repeated","\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form-repeated","5.nuxt-module\u002F06.composables\u002F3.form\u002F3.use-cwa-form-repeated",{"title":387,"path":388,"stem":389},"Form Collection","\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form-collection","5.nuxt-module\u002F06.composables\u002F3.form\u002F4.use-cwa-form-collection",{"title":391,"path":392,"stem":393,"children":394,"page":128},"Admin Manager","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager","5.nuxt-module\u002F06.composables\u002F4.admin-manager",[395,399,403,407,411],{"title":396,"path":397,"stem":398},"Manager Tab","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-manager-tab","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F1.use-cwa-resource-manager-tab",{"title":400,"path":401,"stem":402},"Resource Model","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-model","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F2.use-cwa-resource-model",{"title":404,"path":405,"stem":406},"Resource Upload","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-upload","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F3.use-cwa-resource-upload",{"title":408,"path":409,"stem":410},"Remote Changes","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fon-remote-change","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F4.on-remote-change",{"title":412,"path":413,"stem":414},"Real-Time Events","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-realtime","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F5.use-cwa-realtime",{"title":416,"path":417,"stem":418,"children":419,"page":128},"Utilities","\u002Fnuxt-module\u002Fcomposables\u002Futilities","5.nuxt-module\u002F06.composables\u002F5.utilities",[420,424,428,432],{"title":421,"path":422,"stem":423},"Resource Endpoint","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-endpoint","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F1.use-cwa-resource-endpoint",{"title":425,"path":426,"stem":427},"Query Model","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-query-bound-model","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F2.use-query-bound-model",{"title":429,"path":430,"stem":431},"Resource Route","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-route","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F3.use-cwa-resource-route",{"title":293,"path":433,"stem":434},"\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-html-content","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F4.use-html-content",{"title":436,"path":437,"stem":438,"children":439,"page":128},"Auth","\u002Fnuxt-module\u002Fcomposables\u002Fauth","5.nuxt-module\u002F06.composables\u002F6.auth",[440,444,448,452,456],{"title":441,"path":442,"stem":443},"Login","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-login","5.nuxt-module\u002F06.composables\u002F6.auth\u002F1.use-login",{"title":445,"path":446,"stem":447},"Forgot Password","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-forgot-password","5.nuxt-module\u002F06.composables\u002F6.auth\u002F2.use-forgot-password",{"title":449,"path":450,"stem":451},"Reset Password","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-reset-password","5.nuxt-module\u002F06.composables\u002F6.auth\u002F3.use-reset-password",{"title":453,"path":454,"stem":455},"Verify Email","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-verify-email","5.nuxt-module\u002F06.composables\u002F6.auth\u002F4.use-verify-email",{"title":457,"path":458,"stem":459},"Resend Verify Email","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-resend-verify-email","5.nuxt-module\u002F06.composables\u002F6.auth\u002F5.use-resend-verify-email",{"title":461,"path":462,"stem":463,"children":464,"page":128},"Cwa Api","\u002Fnuxt-module\u002Fcwa-api","5.nuxt-module\u002F07.cwa-api",[465,468,472,476,479,482,486,490],{"title":30,"path":466,"stem":467},"\u002Fnuxt-module\u002Fcwa-api\u002Foverview","5.nuxt-module\u002F07.cwa-api\u002F1.overview",{"title":469,"path":470,"stem":471},"Resources","\u002Fnuxt-module\u002Fcwa-api\u002Fresources","5.nuxt-module\u002F07.cwa-api\u002F2.resources",{"title":473,"path":474,"stem":475},"Resources Manager","\u002Fnuxt-module\u002Fcwa-api\u002Fresources-manager","5.nuxt-module\u002F07.cwa-api\u002F3.resources-manager",{"title":436,"path":477,"stem":478},"\u002Fnuxt-module\u002Fcwa-api\u002Fauth","5.nuxt-module\u002F07.cwa-api\u002F4.auth",{"title":305,"path":480,"stem":481},"\u002Fnuxt-module\u002Fcwa-api\u002Fforms","5.nuxt-module\u002F07.cwa-api\u002F5.forms",{"title":483,"path":484,"stem":485},"Admin","\u002Fnuxt-module\u002Fcwa-api\u002Fadmin","5.nuxt-module\u002F07.cwa-api\u002F6.admin",{"title":487,"path":488,"stem":489},"Site Config","\u002Fnuxt-module\u002Fcwa-api\u002Fsite-config","5.nuxt-module\u002F07.cwa-api\u002F7.site-config",{"title":491,"path":492,"stem":493},"Orphaned Resources","\u002Fnuxt-module\u002Fcwa-api\u002Forphaned-resources","5.nuxt-module\u002F07.cwa-api\u002F8.orphaned-resources",{"title":113,"path":495,"stem":496},"\u002Fnuxt-module\u002Fauthentication","5.nuxt-module\u002F08.authentication",{"title":498,"path":499,"stem":500,"children":501,"page":128},"Cwa Layer","\u002Fnuxt-module\u002Fcwa-layer","5.nuxt-module\u002F9.cwa-layer",[502,505,509,513,517,521],{"title":30,"path":503,"stem":504},"\u002Fnuxt-module\u002Fcwa-layer\u002Foverview","5.nuxt-module\u002F9.cwa-layer\u002F1.overview",{"title":506,"path":507,"stem":508},"Auth Pages","\u002Fnuxt-module\u002Fcwa-layer\u002Fauth-pages","5.nuxt-module\u002F9.cwa-layer\u002F2.auth-pages",{"title":510,"path":511,"stem":512},"Admin Panel","\u002Fnuxt-module\u002Fcwa-layer\u002Fadmin-panel","5.nuxt-module\u002F9.cwa-layer\u002F3.admin-panel",{"title":514,"path":515,"stem":516},"Styling","\u002Fnuxt-module\u002Fcwa-layer\u002Fstyling","5.nuxt-module\u002F9.cwa-layer\u002F4.styling",{"title":518,"path":519,"stem":520},"Date Pickers","\u002Fnuxt-module\u002Fcwa-layer\u002Fdate-pickers","5.nuxt-module\u002F9.cwa-layer\u002F5.date-pickers",{"title":522,"path":523,"stem":524},"Maintenance","\u002Fnuxt-module\u002Fcwa-layer\u002Fmaintenance","5.nuxt-module\u002F9.cwa-layer\u002F6.maintenance",{"title":526,"path":527,"stem":528},"PWA & Offline","\u002Fnuxt-module\u002Fpwa","5.nuxt-module\u002F91.pwa",{"title":530,"path":531,"stem":532},"Page Caching","\u002Fnuxt-module\u002Fpage-caching","5.nuxt-module\u002F92.page-caching",{"title":534,"path":535,"stem":536,"children":537,"collapsed":23},"Deployment & Operations","\u002Fdeployment","6.deployment\u002F0.index",[538,540,544,548,552,556,560,564,568,572,576,580,584,588,592,596,600],{"title":539,"path":535,"stem":536},"Deploying a CWA Site",{"title":541,"path":542,"stem":543},"Docker","\u002Fdeployment\u002Fdocker","6.deployment\u002F1.docker",{"title":545,"path":546,"stem":547},"Deploy to One Server","\u002Fdeployment\u002Fone-server","6.deployment\u002F1.one-server",{"title":549,"path":550,"stem":551},"Kubernetes & Helm","\u002Fdeployment\u002Fkubernetes","6.deployment\u002F2.kubernetes",{"title":553,"path":554,"stem":555},"Moving From One Server to Kubernetes","\u002Fdeployment\u002Fmoving-to-kubernetes","6.deployment\u002F2.moving-to-kubernetes",{"title":557,"path":558,"stem":559},"Scaled Mode","\u002Fdeployment\u002Fscaled-mode","6.deployment\u002F2.scaled-mode",{"title":561,"path":562,"stem":563},"CI\u002FCD","\u002Fdeployment\u002Fci-cd","6.deployment\u002F3.ci-cd",{"title":565,"path":566,"stem":567},"Migrations and Backups","\u002Fdeployment\u002Fmigrations-and-backups","6.deployment\u002F3.migrations-and-backups",{"title":569,"path":570,"stem":571},"CI\u002FCD Variables","\u002Fdeployment\u002Fvariables","6.deployment\u002F4.variables",{"title":573,"path":574,"stem":575},"Cloudflare","\u002Fdeployment\u002Fcloudflare","6.deployment\u002F5.cloudflare",{"title":577,"path":578,"stem":579},"Origin Protection","\u002Fdeployment\u002Forigin-protection","6.deployment\u002F5.origin-protection",{"title":581,"path":582,"stem":583},"Load Testing","\u002Fdeployment\u002Fload-testing","6.deployment\u002F6.load-testing",{"title":585,"path":586,"stem":587},"Performance Audit","\u002Fdeployment\u002Fperformance-audit","6.deployment\u002F6.performance-audit",{"title":589,"path":590,"stem":591},"Reading Lighthouse Scores","\u002Fdeployment\u002Freading-lighthouse-scores","6.deployment\u002F6.reading-lighthouse-scores",{"title":593,"path":594,"stem":595},"Browser Tests","\u002Fdeployment\u002Fbrowser-tests","6.deployment\u002F7.browser-tests",{"title":597,"path":598,"stem":599},"Faster Functional Tests","\u002Fdeployment\u002Ffaster-functional-tests","6.deployment\u002F7.faster-functional-tests",{"title":601,"path":602,"stem":603},"Troubleshooting","\u002Fdeployment\u002Ftroubleshooting","6.deployment\u002F7.troubleshooting",{"id":605,"title":90,"badge":606,"body":607,"description":2014,"extension":2015,"links":606,"meta":2016,"navigation":23,"path":91,"seo":2017,"stem":92,"__hash__":2018},"docs\u002F3.guides\u002F5.your-first-dynamic-page.md",null,{"type":608,"value":609,"toc":2005},"minimark",[610,623,647,682,689,694,700,707,1067,1087,1090,1132,1148,1152,1159,1267,1285,1289,1292,1316,1326,1331,1371,1401,1407,1436,1464,1473,1495,1499,1509,1914,1936,1939,1963,1979,1988,1992,2001],[611,612,613,614,618,619,622],"p",{},"Every page so far has its own URL and its own content. Repeating content, such as blog articles, events or products, works differently. Each item is a ",[615,616,617],"strong",{},"page data"," record with its own URL and fields, and they all share one ",[615,620,621],{},"template page"," for their structure.",[611,624,625,626,630,631,634,635,638,639,642,643,646],{},"This guide builds news articles. Each article has its own Quote, shown in the ",[627,628,629],"code",{},"main"," component group of the ",[627,632,633],{},"TwoColumnPageTemplate"," you built in ",[636,637,78],"a",{"href":79},". If you picked the blog feature, the template's ",[627,640,641],{},"BlogArticleData"," and ",[627,644,645],{},"BlogScaffoldPart"," are a complete working example of the same pattern.",[648,649,652],"callout",{"icon":650,"color":651},"i-heroicons-exclamation-triangle","warning",[611,653,654,657,658,662,663,666,667,670,671,673,674,677,678,681],{},[615,655,656],{},"\"Page template\" and \"template page\" are different things."," A ",[659,660,661],"em",{},"page template"," is a Vue file, such as ",[627,664,665],{},"TwoColumnPageTemplate.vue","; the admin calls it the ",[615,668,669],{},"Page UI",". A ",[659,672,621],{}," is a page record with ",[627,675,676],{},"isTemplate: true"," that many page data records share; the admin calls it a ",[615,679,680],{},"Dynamic"," page. This guide makes a template page that renders through the page template you already have.",[611,683,684],{},[685,686],"img",{"alt":687,"src":688},"Two news article pages side by side, First article and Second article, with the same landing layout and a different quote in each","\u002Fimages\u002Fdocs\u002Fguide-news-articles.webp",[690,691,693],"h2",{"id":692},"the-file","The File",[611,695,696,697,699],{},"The Vue file already exists: articles render through ",[627,698,665],{},". The new file is the PHP entity for the articles' data.",[611,701,702,703,706],{},"Create ",[627,704,705],{},"api\u002Fsrc\u002FEntity\u002FNewsArticleData.php",":",[708,709,714],"pre",{"className":710,"code":711,"language":712,"meta":713,"style":713},"language-php shiki shiki-themes github-light github-dark material-theme-palenight has-focused","\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Entity;\n\nuse ApiPlatform\\Metadata\\ApiResource;\nuse App\\Entity\\Component\\Quote;\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Silverback\\ApiComponentsBundle\\Entity\\Core\\AbstractPageData;\n\n#[ApiResource(mercure: true)]\n#[ORM\\Entity]\nclass NewsArticleData extends AbstractPageData\n{\n    #[ORM\\ManyToOne(targetEntity: Quote::class)] \u002F\u002F [!code focus]\n    #[ORM\\JoinColumn(nullable: true, onDelete: 'SET NULL')] \u002F\u002F [!code focus]\n    public ?Quote $quote = null; \u002F\u002F [!code focus]\n}\n","php","",[627,715,716,729,735,759,764,785,790,812,834,860,889,894,919,932,948,954,990,1035,1061],{"__ignoreMap":713},[717,718,721,725],"span",{"class":719,"line":720},"line",1,[717,722,724],{"class":723},"sVlFx","\u003C?",[717,726,728],{"class":727},"sc2zw","php\n",[717,730,732],{"class":719,"line":731},2,[717,733,734],{"emptyLinePlaceholder":23},"\n",[717,736,738,742,746,749,752,756],{"class":719,"line":737},3,[717,739,741],{"class":740},"sm4w6","declare",[717,743,745],{"class":744},"sOvfz","(",[717,747,748],{"class":727},"strict_types",[717,750,751],{"class":723},"=",[717,753,755],{"class":754},"scSvc","1",[717,757,758],{"class":744},");\n",[717,760,762],{"class":719,"line":761},4,[717,763,734],{"emptyLinePlaceholder":23},[717,765,767,771,775,779,782],{"class":719,"line":766},5,[717,768,770],{"class":769},"stmX-","namespace",[717,772,774],{"class":773},"sRCss"," App",[717,776,778],{"class":777},"sn4go","\\",[717,780,781],{"class":773},"Entity",[717,783,784],{"class":744},";\n",[717,786,788],{"class":719,"line":787},6,[717,789,734],{"emptyLinePlaceholder":23},[717,791,793,796,799,802,805,807,810],{"class":719,"line":792},7,[717,794,795],{"class":769},"use",[717,797,798],{"class":727}," ApiPlatform",[717,800,778],{"class":801},"sBtbT",[717,803,804],{"class":727},"Metadata",[717,806,778],{"class":801},[717,808,809],{"class":727},"ApiResource",[717,811,784],{"class":744},[717,813,815,817,819,821,823,825,827,829,832],{"class":719,"line":814},8,[717,816,795],{"class":769},[717,818,774],{"class":727},[717,820,778],{"class":801},[717,822,781],{"class":727},[717,824,778],{"class":801},[717,826,346],{"class":727},[717,828,778],{"class":801},[717,830,831],{"class":727},"Quote",[717,833,784],{"class":744},[717,835,837,839,842,844,847,849,852,855,858],{"class":719,"line":836},9,[717,838,795],{"class":769},[717,840,841],{"class":727}," Doctrine",[717,843,778],{"class":801},[717,845,846],{"class":727},"ORM",[717,848,778],{"class":801},[717,850,851],{"class":727},"Mapping",[717,853,854],{"class":769}," as",[717,856,857],{"class":773}," ORM",[717,859,784],{"class":744},[717,861,863,865,868,870,873,875,877,879,882,884,887],{"class":719,"line":862},10,[717,864,795],{"class":769},[717,866,867],{"class":727}," Silverback",[717,869,778],{"class":801},[717,871,872],{"class":727},"ApiComponentsBundle",[717,874,778],{"class":801},[717,876,781],{"class":727},[717,878,778],{"class":801},[717,880,881],{"class":727},"Core",[717,883,778],{"class":801},[717,885,886],{"class":727},"AbstractPageData",[717,888,784],{"class":744},[717,890,892],{"class":719,"line":891},11,[717,893,734],{"emptyLinePlaceholder":23},[717,895,897,901,903,905,908,910,913,916],{"class":719,"line":896},12,[717,898,900],{"class":899},"sPB8G","#[",[717,902,809],{"class":727},[717,904,745],{"class":744},[717,906,907],{"class":773},"mercure",[717,909,706],{"class":744},[717,911,912],{"class":801}," true",[717,914,915],{"class":744},")",[717,917,918],{"class":899},"]\n",[717,920,922,924,926,928,930],{"class":719,"line":921},13,[717,923,900],{"class":899},[717,925,846],{"class":727},[717,927,778],{"class":801},[717,929,781],{"class":727},[717,931,918],{"class":899},[717,933,935,939,942,945],{"class":719,"line":934},14,[717,936,938],{"class":937},"swB56","class",[717,940,941],{"class":773}," NewsArticleData",[717,943,944],{"class":937}," extends",[717,946,947],{"class":773}," AbstractPageData\n",[717,949,951],{"class":719,"line":950},15,[717,952,953],{"class":744},"{\n",[717,955,959,962,964,966,969,971,974,976,980,983,985,987],{"class":956,"line":958},[719,957],"focused",16,[717,960,961],{"class":899},"    #[",[717,963,846],{"class":727},[717,965,778],{"class":801},[717,967,968],{"class":727},"ManyToOne",[717,970,745],{"class":744},[717,972,973],{"class":773},"targetEntity",[717,975,706],{"class":744},[717,977,979],{"class":978},"sbW4m"," Quote",[717,981,982],{"class":723},"::",[717,984,938],{"class":769},[717,986,915],{"class":744},[717,988,989],{"class":899},"] ",[717,991,994,996,998,1000,1003,1005,1008,1010,1012,1015,1018,1020,1024,1028,1031,1033],{"class":992,"line":993},[719,957],17,[717,995,961],{"class":899},[717,997,846],{"class":727},[717,999,778],{"class":801},[717,1001,1002],{"class":727},"JoinColumn",[717,1004,745],{"class":744},[717,1006,1007],{"class":773},"nullable",[717,1009,706],{"class":744},[717,1011,912],{"class":801},[717,1013,1014],{"class":744},",",[717,1016,1017],{"class":773}," onDelete",[717,1019,706],{"class":744},[717,1021,1023],{"class":1022},"seSrl"," '",[717,1025,1027],{"class":1026},"sLL54","SET NULL",[717,1029,1030],{"class":1022},"'",[717,1032,915],{"class":744},[717,1034,989],{"class":899},[717,1036,1039,1042,1045,1047,1050,1053,1055,1058],{"class":1037,"line":1038},[719,957],18,[717,1040,1041],{"class":937},"    public",[717,1043,1044],{"class":723}," ?",[717,1046,831],{"class":978},[717,1048,1049],{"class":744}," $",[717,1051,1052],{"class":899},"quote ",[717,1054,751],{"class":723},[717,1056,1057],{"class":801}," null",[717,1059,1060],{"class":744},";",[717,1062,1064],{"class":719,"line":1063},19,[717,1065,1066],{"class":744},"}\n",[611,1068,1069,1071,1072,642,1075,1078,1079,1082,1083,1086],{},[627,1070,886],{}," gives each article a ",[627,1073,1074],{},"title",[627,1076,1077],{},"metaDescription",", which the module uses for the page's ",[627,1080,1081],{},"\u003Ctitle>"," and meta description. The ",[627,1084,1085],{},"quote"," field holds the component each article shows. A field like this must be typed as a component class.",[611,1088,1089],{},"Generate and run the migration from the project root:",[708,1091,1095],{"className":1092,"code":1093,"language":1094,"meta":713,"style":713},"language-bash shiki shiki-themes github-light github-dark material-theme-palenight","docker compose exec php bin\u002Fconsole doctrine:migrations:diff\ndocker compose exec php bin\u002Fconsole doctrine:migrations:migrate\n","bash",[627,1096,1097,1117],{"__ignoreMap":713},[717,1098,1099,1102,1105,1108,1111,1114],{"class":719,"line":720},[717,1100,1101],{"class":773},"docker",[717,1103,1104],{"class":1026}," compose",[717,1106,1107],{"class":1026}," exec",[717,1109,1110],{"class":1026}," php",[717,1112,1113],{"class":1026}," bin\u002Fconsole",[717,1115,1116],{"class":1026}," doctrine:migrations:diff\n",[717,1118,1119,1121,1123,1125,1127,1129],{"class":719,"line":731},[717,1120,1101],{"class":773},[717,1122,1104],{"class":1026},[717,1124,1107],{"class":1026},[717,1126,1110],{"class":1026},[717,1128,1113],{"class":1026},[717,1130,1131],{"class":1026}," doctrine:migrations:migrate\n",[611,1133,1134,1135,1138,1139,1142,1143,1147],{},"As in the last guide, review the migration in ",[627,1136,1137],{},"api\u002Fmigrations\u002F"," and delete its ",[627,1140,1141],{},"down()",": the template's migrations are upward-only (see ",[636,1144,1146],{"href":1145},"\u002Fapi\u002Fbundle-setup#database-setup","Bundle Setup › Database Setup",").",[690,1149,1151],{"id":1150},"register-in-nuxtconfig","Register in nuxt.config",[611,1153,1154,1155,1158],{},"Add a ",[627,1156,1157],{},"pageData"," entry, keyed by the class's short name:",[708,1160,1164],{"className":1161,"code":1162,"language":1163,"meta":713,"style":713},"language-ts shiki shiki-themes github-light github-dark material-theme-palenight has-focused","\u002F\u002F app\u002Fnuxt.config.ts\ncwa: {\n  pageData: {\n    NewsArticleData: { \u002F\u002F [!code focus]\n      name: 'News Articles', \u002F\u002F [!code focus]\n      properties: { \u002F\u002F [!code focus]\n        quote: 'Article Quote', \u002F\u002F [!code focus]\n      }, \u002F\u002F [!code focus]\n    }, \u002F\u002F [!code focus]\n  }\n}\n","ts",[627,1165,1166,1172,1182,1191,1202,1219,1229,1246,1252,1258,1263],{"__ignoreMap":713},[717,1167,1168],{"class":719,"line":720},[717,1169,1171],{"class":1170},"sTBSN","\u002F\u002F app\u002Fnuxt.config.ts\n",[717,1173,1174,1177,1179],{"class":719,"line":731},[717,1175,1176],{"class":773},"cwa",[717,1178,706],{"class":744},[717,1180,1181],{"class":744}," {\n",[717,1183,1184,1187,1189],{"class":719,"line":737},[717,1185,1186],{"class":773},"  pageData",[717,1188,706],{"class":744},[717,1190,1181],{"class":744},[717,1192,1194,1197,1199],{"class":1193,"line":761},[719,957],[717,1195,1196],{"class":773},"    NewsArticleData",[717,1198,706],{"class":744},[717,1200,1201],{"class":744}," {",[717,1203,1205,1208,1210,1212,1215,1217],{"class":1204,"line":766},[719,957],[717,1206,1207],{"class":773},"      name",[717,1209,706],{"class":744},[717,1211,1023],{"class":1022},[717,1213,1214],{"class":1026},"News Articles",[717,1216,1030],{"class":1022},[717,1218,1014],{"class":744},[717,1220,1222,1225,1227],{"class":1221,"line":787},[719,957],[717,1223,1224],{"class":773},"      properties",[717,1226,706],{"class":744},[717,1228,1201],{"class":744},[717,1230,1232,1235,1237,1239,1242,1244],{"class":1231,"line":792},[719,957],[717,1233,1234],{"class":773},"        quote",[717,1236,706],{"class":744},[717,1238,1023],{"class":1022},[717,1240,1241],{"class":1026},"Article Quote",[717,1243,1030],{"class":1022},[717,1245,1014],{"class":744},[717,1247,1249],{"class":1248,"line":814},[719,957],[717,1250,1251],{"class":744},"      },",[717,1253,1255],{"class":1254,"line":836},[719,957],[717,1256,1257],{"class":744},"    },",[717,1259,1260],{"class":719,"line":862},[717,1261,1262],{"class":744},"  }\n",[717,1264,1265],{"class":719,"line":891},[717,1266,1066],{"class":744},[611,1268,1269,1272,1273,1276,1277,1280,1281,1284],{},[627,1270,1271],{},"name"," is how the admin lists the type at ",[627,1274,1275],{},"\u002F_cwa\u002Fdata"," and in its selects. ",[627,1278,1279],{},"properties"," gives each component field a label. Both are optional: without them the admin shows ",[627,1282,1283],{},"NewsArticleData"," and a label made from the field name.",[690,1286,1288],{"id":1287},"create-in-the-api","Create in the API",[611,1290,1291],{},"Three records make a dynamic page work:",[1293,1294,1295,1305,1310],"ol",{},[1296,1297,1298,1299,1301,1302,1304],"li",{},"a ",[615,1300,621],{},", with a component position bound to the ",[627,1303,1085],{}," field;",[1296,1306,1298,1307,1309],{},[615,1308,617],{}," record for each article, naming the template page;",[1296,1311,1298,1312,1315],{},[615,1313,1314],{},"route"," for each article.",[611,1317,1318,1319,1322,1323,1325],{},"That position is a ",[615,1320,1321],{},"dynamic component position",". Instead of holding one component, it shows whatever component the current article holds in its ",[627,1324,1085],{}," field.",[1327,1328,1330],"h3",{"id":1329},"via-the-admin","Via the admin",[611,1332,1333,1336,1337,1340,1341,1344,1345,1348,1349,1351,1352,1355,1356,1359,1360,1362,1363,1366,1367,1370],{},[615,1334,1335],{},"The template page."," Go to ",[627,1338,1339],{},"\u002F_cwa\u002Fpages"," → ",[615,1342,1343],{},"+",". Switch the type select at the top from ",[615,1346,1347],{},"Static"," to ",[615,1350,680],{},", give it the reference ",[627,1353,1354],{},"news-template",", choose ",[615,1357,1358],{},"Two Column Page"," as the ",[615,1361,669],{}," and the ",[627,1364,1365],{},"landing"," layout, and click ",[615,1368,1369],{},"Add Now",". A template page has no route.",[611,1372,1373,1376,1377,1380,1381,1383,1384,1386,1387,1389,1390,1359,1392,642,1395,1359,1397,1400],{},[615,1374,1375],{},"The dynamic position."," Open the template page with the eye icon in its settings, and click ",[615,1378,1379],{},"Edit",". Click ",[615,1382,1343],{}," in the ",[627,1385,629],{}," group. The Add Component dialog has a ",[615,1388,680],{}," option as well as the component types: choose it, then ",[615,1391,1214],{},[615,1393,1394],{},"Data type",[615,1396,1241],{},[615,1398,1399],{},"Field",", and confirm.",[611,1402,1403],{},[685,1404],{"alt":1405,"src":1406},"The Add Component dialog on the template page, with Dynamic selected, News Articles as the Data type and Article Quote as the Field","\u002Fimages\u002Fdocs\u002Fguide-dynamic-add.webp",[611,1408,1409,1336,1412,1340,1414,1340,1416,1418,1419,1421,1422,1425,1426,1428,1429,1431,1432,1435],{},[615,1410,1411],{},"An article.",[627,1413,1275],{},[615,1415,1214],{},[615,1417,1343],{},". Give the article a title, choose ",[627,1420,1354],{}," as its ",[615,1423,1424],{},"Dynamic Page",", and click ",[615,1427,1369],{},". It opens on its ",[615,1430,180],{}," tab: create a route with the path ",[627,1433,1434],{},"news\u002Ffirst-article",".",[611,1437,1438,1441,1442,1445,1446,1448,1449,1451,1452,1455,1456,1459,1460,1463],{},[615,1439,1440],{},"Its quote."," Visit ",[627,1443,1444],{},"https:\u002F\u002Flocalhost\u002Fnews\u002Ffirst-article"," and click ",[615,1447,1379],{},". Select the dynamic position in the ",[627,1450,629],{}," group. Its ",[615,1453,1454],{},"Data Placeholder"," tab has an ",[615,1457,1458],{},"Add Quote"," button: click it, type the quote, and click ",[615,1461,1462],{},"Publish",". The quote belongs to this article; the next article you create gets its own.",[648,1465,1467],{"icon":1466},"i-heroicons-video-camera",[611,1468,1469,1470,1472],{},"VIDEO: The full loop: creating the Dynamic template page, adding the dynamic position on it, creating a News Article with the route ",[627,1471,1434],{},", then on that page adding its Quote from the Data Placeholder tab and publishing it",[648,1474,1476],{"icon":1475},"i-heroicons-information-circle",[611,1477,1478,1479,1482,1483,1486,1487,1490,1491,1494],{},"In the admin lists, ",[615,1480,1481],{},"blue"," records are static pages, ",[615,1484,1485],{},"yellow"," are template pages, and ",[615,1488,1489],{},"green"," are page data records, shown ",[615,1492,1493],{},"orange"," until they have a route. So you can see at a glance what is shared structure and what is one item of content.",[1327,1496,1498],{"id":1497},"via-fixtures","Via fixtures",[611,1500,1501,1502,1505,1506,706],{},"Add to ",[627,1503,1504],{},"build()"," in ",[627,1507,1508],{},"api\u002Fsrc\u002FDataFixtures\u002FParts\u002FLandingScaffoldPart.php",[708,1510,1512],{"className":710,"code":1511,"language":712,"meta":713,"style":713},"use App\\Entity\\Component\\Quote; \u002F\u002F [!code focus]\nuse App\\Entity\\NewsArticleData; \u002F\u002F [!code focus]\n\n\u002F\u002F ...\n\npublic function build(CwaFixtureBuilder $cwa, ScaffoldState $state): void\n{\n    \u002F\u002F ... the landing layout and page from the earlier guides\n\n    $cwa->page('news-template', 'TwoColumnPageTemplate', layout: 'landing', isTemplate: true) \u002F\u002F [!code focus]\n        ->group('main')->pageDataPosition(NewsArticleData::class, 'quote'); \u002F\u002F [!code focus]\n\n    $quote = new Quote(); \u002F\u002F [!code focus]\n    $quote->text = 'News is what somebody does not want you to print.'; \u002F\u002F [!code focus]\n    $cwa->publish($quote); \u002F\u002F [!code focus]\n\n    $article = new NewsArticleData(); \u002F\u002F [!code focus]\n    $article->setTitle('First article') \u002F\u002F [!code focus]\n        ->setMetaDescription('The first news article.'); \u002F\u002F [!code focus]\n    $article->quote = $quote; \u002F\u002F [!code focus]\n\n    $cwa->pageData($article, template: 'news-template', route: '\u002Fnews\u002Ffirst-article'); \u002F\u002F [!code focus]\n}\n",[627,1513,1514,1535,1552,1556,1561,1565,1603,1607,1612,1616,1670,1713,1717,1734,1757,1776,1780,1796,1820,1839,1859,1864,1909],{"__ignoreMap":713},[717,1515,1517,1519,1521,1523,1525,1527,1529,1531,1533],{"class":1516,"line":720},[719,957],[717,1518,795],{"class":769},[717,1520,774],{"class":727},[717,1522,778],{"class":801},[717,1524,781],{"class":727},[717,1526,778],{"class":801},[717,1528,346],{"class":727},[717,1530,778],{"class":801},[717,1532,831],{"class":727},[717,1534,1060],{"class":744},[717,1536,1538,1540,1542,1544,1546,1548,1550],{"class":1537,"line":731},[719,957],[717,1539,795],{"class":769},[717,1541,774],{"class":727},[717,1543,778],{"class":801},[717,1545,781],{"class":727},[717,1547,778],{"class":801},[717,1549,1283],{"class":727},[717,1551,1060],{"class":744},[717,1553,1554],{"class":719,"line":737},[717,1555,734],{"emptyLinePlaceholder":23},[717,1557,1558],{"class":719,"line":761},[717,1559,1560],{"class":1170},"\u002F\u002F ...\n",[717,1562,1563],{"class":719,"line":766},[717,1564,734],{"emptyLinePlaceholder":23},[717,1566,1567,1570,1573,1577,1579,1582,1584,1586,1588,1591,1593,1596,1598,1600],{"class":719,"line":787},[717,1568,1569],{"class":937},"public",[717,1571,1572],{"class":937}," function",[717,1574,1576],{"class":1575},"sKpYG"," build",[717,1578,745],{"class":744},[717,1580,1581],{"class":978},"CwaFixtureBuilder",[717,1583,1049],{"class":744},[717,1585,1176],{"class":899},[717,1587,1014],{"class":744},[717,1589,1590],{"class":978}," ScaffoldState",[717,1592,1049],{"class":744},[717,1594,1595],{"class":899},"state",[717,1597,915],{"class":744},[717,1599,706],{"class":723},[717,1601,1602],{"class":769}," void\n",[717,1604,1605],{"class":719,"line":792},[717,1606,953],{"class":744},[717,1608,1609],{"class":719,"line":814},[717,1610,1611],{"class":1170},"    \u002F\u002F ... the landing layout and page from the earlier guides\n",[717,1613,1614],{"class":719,"line":836},[717,1615,734],{"emptyLinePlaceholder":23},[717,1617,1619,1622,1624,1627,1630,1632,1634,1636,1638,1640,1642,1644,1646,1648,1651,1653,1655,1657,1659,1661,1664,1666,1668],{"class":1618,"line":862},[719,957],[717,1620,1621],{"class":744},"    $",[717,1623,1176],{"class":899},[717,1625,1626],{"class":723},"->",[717,1628,1629],{"class":1575},"page",[717,1631,745],{"class":744},[717,1633,1030],{"class":1022},[717,1635,1354],{"class":1026},[717,1637,1030],{"class":1022},[717,1639,1014],{"class":744},[717,1641,1023],{"class":1022},[717,1643,633],{"class":1026},[717,1645,1030],{"class":1022},[717,1647,1014],{"class":744},[717,1649,1650],{"class":773}," layout",[717,1652,706],{"class":744},[717,1654,1023],{"class":1022},[717,1656,1365],{"class":1026},[717,1658,1030],{"class":1022},[717,1660,1014],{"class":744},[717,1662,1663],{"class":773}," isTemplate",[717,1665,706],{"class":744},[717,1667,912],{"class":801},[717,1669,915],{"class":744},[717,1671,1673,1676,1679,1681,1683,1685,1687,1689,1691,1694,1696,1698,1700,1702,1704,1706,1708,1710],{"class":1672,"line":891},[719,957],[717,1674,1675],{"class":723},"        ->",[717,1677,1678],{"class":1575},"group",[717,1680,745],{"class":744},[717,1682,1030],{"class":1022},[717,1684,629],{"class":1026},[717,1686,1030],{"class":1022},[717,1688,915],{"class":744},[717,1690,1626],{"class":723},[717,1692,1693],{"class":1575},"pageDataPosition",[717,1695,745],{"class":744},[717,1697,1283],{"class":978},[717,1699,982],{"class":723},[717,1701,938],{"class":769},[717,1703,1014],{"class":744},[717,1705,1023],{"class":1022},[717,1707,1085],{"class":1026},[717,1709,1030],{"class":1022},[717,1711,1712],{"class":744},");",[717,1714,1715],{"class":719,"line":896},[717,1716,734],{"emptyLinePlaceholder":23},[717,1718,1720,1722,1724,1726,1729,1731],{"class":1719,"line":921},[719,957],[717,1721,1621],{"class":744},[717,1723,1052],{"class":899},[717,1725,751],{"class":723},[717,1727,1728],{"class":769}," new",[717,1730,979],{"class":978},[717,1732,1733],{"class":744},"();",[717,1735,1737,1739,1741,1743,1746,1748,1750,1753,1755],{"class":1736,"line":934},[719,957],[717,1738,1621],{"class":744},[717,1740,1085],{"class":899},[717,1742,1626],{"class":723},[717,1744,1745],{"class":899},"text ",[717,1747,751],{"class":723},[717,1749,1023],{"class":1022},[717,1751,1752],{"class":1026},"News is what somebody does not want you to print.",[717,1754,1030],{"class":1022},[717,1756,1060],{"class":744},[717,1758,1760,1762,1764,1766,1769,1772,1774],{"class":1759,"line":950},[719,957],[717,1761,1621],{"class":744},[717,1763,1176],{"class":899},[717,1765,1626],{"class":723},[717,1767,1768],{"class":1575},"publish",[717,1770,1771],{"class":744},"($",[717,1773,1085],{"class":899},[717,1775,1712],{"class":744},[717,1777,1778],{"class":719,"line":958},[717,1779,734],{"emptyLinePlaceholder":23},[717,1781,1783,1785,1788,1790,1792,1794],{"class":1782,"line":993},[719,957],[717,1784,1621],{"class":744},[717,1786,1787],{"class":899},"article ",[717,1789,751],{"class":723},[717,1791,1728],{"class":769},[717,1793,941],{"class":978},[717,1795,1733],{"class":744},[717,1797,1799,1801,1804,1806,1809,1811,1813,1816,1818],{"class":1798,"line":1038},[719,957],[717,1800,1621],{"class":744},[717,1802,1803],{"class":899},"article",[717,1805,1626],{"class":723},[717,1807,1808],{"class":1575},"setTitle",[717,1810,745],{"class":744},[717,1812,1030],{"class":1022},[717,1814,1815],{"class":1026},"First article",[717,1817,1030],{"class":1022},[717,1819,915],{"class":744},[717,1821,1823,1825,1828,1830,1832,1835,1837],{"class":1822,"line":1063},[719,957],[717,1824,1675],{"class":723},[717,1826,1827],{"class":1575},"setMetaDescription",[717,1829,745],{"class":744},[717,1831,1030],{"class":1022},[717,1833,1834],{"class":1026},"The first news article.",[717,1836,1030],{"class":1022},[717,1838,1712],{"class":744},[717,1840,1843,1845,1847,1849,1851,1853,1855,1857],{"class":1841,"line":1842},[719,957],20,[717,1844,1621],{"class":744},[717,1846,1803],{"class":899},[717,1848,1626],{"class":723},[717,1850,1052],{"class":899},[717,1852,751],{"class":723},[717,1854,1049],{"class":744},[717,1856,1085],{"class":899},[717,1858,1060],{"class":744},[717,1860,1862],{"class":719,"line":1861},21,[717,1863,734],{"emptyLinePlaceholder":23},[717,1865,1868,1870,1872,1874,1876,1878,1880,1882,1885,1887,1889,1891,1893,1895,1898,1900,1902,1905,1907],{"class":1866,"line":1867},[719,957],22,[717,1869,1621],{"class":744},[717,1871,1176],{"class":899},[717,1873,1626],{"class":723},[717,1875,1157],{"class":1575},[717,1877,1771],{"class":744},[717,1879,1803],{"class":899},[717,1881,1014],{"class":744},[717,1883,1884],{"class":773}," template",[717,1886,706],{"class":744},[717,1888,1023],{"class":1022},[717,1890,1354],{"class":1026},[717,1892,1030],{"class":1022},[717,1894,1014],{"class":744},[717,1896,1897],{"class":773}," route",[717,1899,706],{"class":744},[717,1901,1023],{"class":1022},[717,1903,1904],{"class":1026},"\u002Fnews\u002Ffirst-article",[717,1906,1030],{"class":1022},[717,1908,1712],{"class":744},[717,1910,1912],{"class":719,"line":1911},23,[717,1913,1066],{"class":744},[611,1915,1916,1918,1919,1921,1922,1925,1926,1928,1929,1932,1933,1435],{},[627,1917,676],{}," makes the page a template page, so it gets no route. The Quote is saved with the article, because it's set on the article's ",[627,1920,1085],{}," field. ",[627,1923,1924],{},"pageDataPosition()"," takes the page data class and the field name, and creates the dynamic position in the ",[627,1927,629],{}," group. ",[627,1930,1931],{},"pageData()"," takes the template page's reference, not its ",[627,1934,1935],{},"uiComponent",[611,1937,1938],{},"Load it from the project root:",[708,1940,1942],{"className":1092,"code":1941,"language":1094,"meta":713,"style":713},"docker compose exec php bin\u002Fconsole doctrine:fixtures:load --append\n",[627,1943,1944],{"__ignoreMap":713},[717,1945,1946,1948,1950,1952,1954,1956,1959],{"class":719,"line":720},[717,1947,1101],{"class":773},[717,1949,1104],{"class":1026},[717,1951,1107],{"class":1026},[717,1953,1110],{"class":1026},[717,1955,1113],{"class":1026},[717,1957,1958],{"class":1026}," doctrine:fixtures:load",[717,1960,1962],{"class":1961},"szhYu"," --append\n",[648,1964,1965],{"icon":650,"color":651},[611,1966,1967,1970,1971,1974,1975,1435],{},[627,1968,1969],{},"--append"," keeps anything that already exists. An article whose route path already exists is kept as it is, and so is its quote, so a second load doesn't create another one. A group that already exists is kept too, without new positions, as in ",[636,1972,82],{"href":1973},"\u002Fguides\u002Fyour-first-component#via-fixtures",". See ",[636,1976,1978],{"href":1977},"\u002Fapi\u002Fdata-fixtures\u002Fappending#appending-to-an-existing-site","Appending to an Existing Site",[611,1980,1981,1982,1984,1985,1987],{},"Visit ",[627,1983,1444],{},": the landing layout wraps the two-column page, and the ",[627,1986,629],{}," group shows this article's quote.",[690,1989,1991],{"id":1990},"next-how-dynamic-pages-work","Next: How Dynamic Pages Work",[611,1993,1994,1995,1997,1998,2000],{},"You've built every piece the guides cover. ",[636,1996,44],{"href":45}," explains how page data, template pages and dynamic positions fit together, and the API's ",[636,1999,176],{"href":177}," covers collections, nested pages and route generation.",[2002,2003,2004],"style",{},"html pre.shiki code .sVlFx, html code.shiki .sVlFx{--shiki-light:#D73A49;--shiki-default:#F97583;--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 .sm4w6, html code.shiki .sm4w6{--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-default:#F97583;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sOvfz, html code.shiki .sOvfz{--shiki-light:#24292E;--shiki-default:#E1E4E8;--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 .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 .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 .swB56, html code.shiki .swB56{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#C792EA}html pre.shiki code .sbW4m, html code.shiki .sbW4m{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#FFCB6B}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 .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 .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 .sKpYG, html code.shiki .sKpYG{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#82AAFF}html pre.shiki code .szhYu, html code.shiki .szhYu{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#C3E88D}",{"title":713,"searchDepth":731,"depth":731,"links":2006},[2007,2008,2009,2013],{"id":692,"depth":731,"text":693},{"id":1150,"depth":731,"text":1151},{"id":1287,"depth":731,"text":1288,"children":2010},[2011,2012],{"id":1329,"depth":737,"text":1330},{"id":1497,"depth":737,"text":1498},{"id":1990,"depth":731,"text":1991},"Build news articles that share one template page, each with its own URL and its own Quote, using a page data entity and a dynamic component position.","md",{},{"title":90,"description":2014},"VwIgGjCXPi8RpR3yTFod2MgqJDTuUEgebzgITyhNjRg",[2020,2022],{"title":86,"path":87,"stem":88,"description":2021,"children":-1},"Give the same component multiple visual styles — using style class names for CSS variation or ui\u002F Vue files for fully different templates.",{"title":30,"path":95,"stem":96,"description":2023,"children":-1},"What the API Components Bundle provides, the order to read this section in, and a reference for the core resources it registers.",1793565689890]