From 57f367c21911b8c24f1c3ce78cdab6d82f659ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Doubravsk=C3=BD?= Date: Thu, 30 Jul 2026 17:00:48 +0200 Subject: [PATCH] =?UTF-8?q?Skl=C3=A1dat=20navigaci=20z=20kolekce=20Pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Menu bylo napsané natvrdo a odkazovalo na /kontakt bez ohledu na to, jestli stránka s tím slugem existuje — odtud 404. Stránky založené v administraci se naopak neobjevily nikde. Hlavička teď vypisuje stránky z kolekce, řazené podle názvu. Layout kvůli tomu musí být force-dynamic, jinak by se při buildu předgenerovala stránka 404, která tenhle layout používá taky, a build by sáhl do databáze. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 3 +++ src/app/(frontend)/layout.tsx | 23 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 426288e..1838948 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,3 +32,6 @@ verzování [sémantické](https://semver.org/lang/cs/). odmítne s HTTP 400 „url parameter is not allowed". Do `next/image` se nově posílá jen cesta — soubor leží na stejném originu a stejný image tak funguje na stagingu i v produkci, kde se domény liší. +- Stránky založené v administraci se nikde neobjevily. Navigace byla napsaná + natvrdo a odkazovala na `/kontakt`, i když stránka s tím slugem nemusela + existovat (odtud 404). Menu se teď skládá z kolekce Pages. diff --git a/src/app/(frontend)/layout.tsx b/src/app/(frontend)/layout.tsx index 73b4c66..2a95be0 100644 --- a/src/app/(frontend)/layout.tsx +++ b/src/app/(frontend)/layout.tsx @@ -1,5 +1,8 @@ import React from 'react' import Link from 'next/link' +import { getPayload } from 'payload' + +import config from '@/payload.config' import './styles.css' export const metadata = { @@ -7,8 +10,22 @@ export const metadata = { title: 'Reiner — zbraně a střelivo', } +// Menu se skládá z obsahu, takže se nesmí předgenerovat při buildu. +// Platí i pro stránku 404, která tenhle layout používá také. +export const dynamic = 'force-dynamic' + export default async function RootLayout(props: { children: React.ReactNode }) { const { children } = props + const payload = await getPayload({ config: await config }) + + // Do menu se propíše každá stránka založená v administraci — natvrdo psaný + // odkaz by mířil na něco, co majitel ještě nevytvořil, nebo pojmenoval jinak. + const { docs: stranky } = await payload.find({ + collection: 'pages', + sort: 'nazev', + depth: 0, + limit: 20, + }) return ( @@ -19,7 +36,11 @@ export default async function RootLayout(props: { children: React.ReactNode }) {