صفحة Markdown غير مجموعة
ملف .md جوّه src/pages بيبقى صفحة لوحده. ده كويس لصفحة أو اتنين. أول ما يبقى عندك مجموعة بنفس الشكل (مقالات، أصناف، وصفات)، انقلهم بره pages وحطهم في مجموعة. المجموعة مش بتعمل روابط لوحدها. أنت تعمل صفحة ديناميكية تقراها.
مجموعة وقت البناء
التعريف في src/content.config.ts. اللودر يقول الملفات فين. الـ schema يقول شكل الـ frontmatter إيه. Zod بتستورده من astro/zod مش من حزمة zod لوحدها، عشان النسخة تتفق مع Astro.
import { defineCollection } from "astro:content";import { glob } from "astro/loaders";import { z } from "astro/zod";const menu = defineCollection({ loader: glob({ pattern: "**/*.md", base: "./src/data/menu" }), schema: z.object({ title: z.string(), price: z.number(), pubDate: z.coerce.date(), draft: z.boolean().default(false), }),});export const collections = { menu };---title: كشريprice: 25pubDate: 2026-04-01---رز وعدس وشعرية.بعد astro sync أو dev، الأنواع تتولد. الاستعلام:
---import { getCollection, getEntry, render } from "astro:content";export async function getStaticPaths() { const dishes = (await getCollection("menu")).filter((d) => !d.data.draft); return dishes.map((dish) => ({ params: { id: dish.id }, props: { dish }, }));}const { dish } = Astro.props;const { Content } = await render(dish);---<h1>{dish.data.title}</h1><p>{dish.data.price} جنيه</p><Content />getEntry("menu", id) يجيب واحدة. render يديك مكوّن Content للمتن. المسودات فلترها أنت، Astro مش بيخبيها لوحده إلا لو اللودر أو الـ schema قال كده.
علاقة بين مجموعتين بـ reference جوّه الـ schema (صنف يشير لمؤلف). بعدين getEntries يحلّ المراجع. التفاصيل في مرجع astro:content لأنها أطول من سطر.
Markdown و MDX و Markdoc
الـ glob يقدر يمسك .md و .mdx و .mdoc لو التكامل متسطّب (astro add mdx). MDX يعني JSX جوّه المقالة، فمكوّناتك تشتغل وسط النص. Markdoc مسار تاني لو الفريق كاتبه كده.
من Astro 7 المعالج الافتراضي اسمه Sätteri، مش remark. الجداول والـ GFM شغالين من غير إضافات. لو عندك إضافات remark قديمة، الفصل الأخير بيقول تعمل إيه.
المجموعة الحية
محتوى بيتغير كل شوية (مخزون، سعر، مسودة من الـ CMS) متحرقوش في البناء. src/live.config.ts و defineLiveCollection و لودر بيشتغل وقت الطلب. الاستعلام getLiveCollection و getLiveEntry.
content.config.ts. سريع، يتخزّن، ينفع معاه تحسين الصور و MDX. محتاج بناء جديد لما النص يتغير.
live.config.ts. طازة من غير بناء. مفيش MDX وقت التشغيل، ومفيش تحسين صور. كل طلب ممكن يسأل المصدر، إلا لو حطيت كاش.
الاتنين ينفعوا في نفس المشروع: وصف الطبق مجموعة بناء، والكمية المتاحة مجموعة حية. من Astro 7 اللودر الحي يقدر يرجّع تلميح كاش، وتمرّره لـ Astro.cache (فصل الاحتراف).
متعملش مجموعة لصفحة واحدة، ولا لملف PDF. الـ PDF مكانه public. ولو الـ SDK بتاع المصدر مش قابل يتعمل لودر وأنت مرتاح بيه، استدعيه في الصفحة على طول.
خلّصت الفصل لما
١) حطيت ملفات المجموعة في src/data. هتطلع روابط لوحدها؟
٢) Zod بتتجاب منين؟
astro/zod، مش من نسخة عشوائية من حزمة zod.