رفتن به محتوا

مدیریت محتوا

یک CMS بدون سر (headless) با مجموعه‌ها، ورودی‌ها، زبان‌ها و انتشارها. محتوا را از پنل Content یا SDK مدیریت کنید.

Proyecta یک CMS بدون سر کامل دارد. این سیستم schema-محور است: شما collections (انواع محتوای ساختاریافته) تعریف می‌کنید، سپس entries هایی می‌سازید که با فیلدهای هر collection مطابقت دارند. Entries می‌توانند بومی‌سازی شوند و در releases گروه‌بندی شوند.

محتوا می‌تواند از طریق SDK یا با درخواست از هوش مصنوعی مدیریت شود. Content API شش نوع منبع دارد:

تب / منبعکاربرد
Collectionsتعریف و مدیریت schema های محتوا (مثلاً «پست وبلاگ»، «سؤالات متداول»، «مشخصات محصول»)
Fieldsجایگاه‌های تایپ‌شده درون یک collection (به‌عنوان زیرمنبع Collections مدیریت می‌شوند)
Entriesمرور، ایجاد، ویرایش، انتشار و حذف entries درون یک collection
Localesافزودن و مدیریت زبان‌ها/مناطق برای محتوای ترجمه‌شده
Releasesگروه‌بندی entries برای انتشار (یا لغو انتشار) همزمان؛ انتشار دستی از طریق releases.publish()
Assetsآپلود و مدیریت فایل‌های رسانه‌ای (تصاویر، ویدیوها، PDF) قابل ارجاع از entries

برای رفتن به entries یک collection، روی آن در تب Collections کلیک کنید. تب Entries به شما امکان می‌دهد آیتم‌های محتوا را به‌صورت جداگانه ایجاد، ویرایش، منتشر و حذف کنید.

همچنین می‌توانید همه چیز را به‌صورت برنامه‌نویسی از طریق SDK (proyecta.content) مدیریت کنید.

مفهومتوضیح
Collectionیک schema — ساختار یک نوع محتوا (مثلاً «پست وبلاگ»، «سؤالات متداول»، «مشخصات محصول»)
Fieldیک جایگاه تایپ‌شده در یک collection (مثلاً title: string، body: rich_text، coverImage: asset)
Entryیک نمونه از یک collection (یک پست وبلاگ، یک آیتم سؤالات متداول)
Assetیک فایل رسانه‌ای آپلودشده که می‌توان از entries به آن ارجاع داد
Localeیک زبان/منطقه که محتوا به آن ترجمه می‌شود
Releaseگروهی از entries که قرار است همزمان منتشر (یا لغو انتشار) شوند
import Proyecta from '@proyecta-ai/sdk';
const proyecta = new Proyecta({ apiKey: process.env.PROYECTA_API_KEY });
// 1. Define a collection
const blog = await proyecta.content.collections.create({
api_id: 'blogPost',
name: 'Blog Post',
// fields are added via collections.fields.create()
});
// 2. Create an entry
const post = await proyecta.content.entries.create({
collection_id: blog.id,
data: {
title: 'Hello, world',
body: 'My very first post.',
},
});
// 3. Publish it
await proyecta.content.entries.publish({ entryId: post.id });
// Browse collections
for await (const collection of proyecta.content.collections.list()) {
console.log(collection.name);
}
// Add or remove fields on a collection
await proyecta.content.collections.fields.create(blog.id, {
/* field definition */
});
await proyecta.content.collections.fields.delete(blog.id, fieldId);

Entries همان ردیف‌های محتوای واقعی هستند. هر entry به یک collection تعلق دارد و داده‌هایی متناسب با فیلدهای آن collection را در خود نگه می‌دارد.

// Browse entries (pass the collection's api_id, not its numeric id)
for await (const entry of proyecta.content.entries.list({ collection: 'blogPost' })) {
console.log(entry);
}
// Update an entry
await proyecta.content.entries.update(post.id, { data: { title: 'Updated title' } });
// Publish an entry
await proyecta.content.entries.publish({ entryId: post.id });
// Delete an entry
await proyecta.content.entries.delete(post.id);

آپلود asset ها در اولویت هستند — از آن‌ها برای پیوست کردن تصاویر، ویدیوها یا PDF به entries خود استفاده کنید:

// Browse assets
for await (const asset of proyecta.content.assets.list()) {
console.log(asset);
}
// Upload, update, or delete via assets.create / assets.update / assets.delete

برای آپلود فایل از طریق چت (کشیدن و رها کردن در builder)، به Files & Media مراجعه کنید.

محتوا می‌تواند به چندین locale ترجمه شود. هر locale یک رکورد است که از طریق proyecta.content.locales مدیریت می‌شود:

await proyecta.content.locales.create({
/* code, name, etc. */
});
for await (const locale of proyecta.content.locales.list()) {
console.log(locale);
}

هنگام دریافت entries، می‌توانید ترجمه یک locale خاص را درخواست کنید. برای تصویر کلی‌تر از i18n، به Internationalization مراجعه کنید.

یک release مجموعه‌ای از entries است که همزمان منتشر (یا لغو انتشار) می‌شوند. این امکان به شما می‌دهد یک انتشار محتوای هماهنگ — یک راه‌اندازی بازاریابی، یک صفحه محصول جدید، یک بازبینی سؤالات متداول — را آماده کنید و همه چیز به‌صورت اتمی تغییر کند.

توجه: انتشار زمان‌بندی‌شده خودکار هنوز پیاده‌سازی نشده است. Releases با تاریخ scheduled_at وارد وضعیت scheduled می‌شوند اما باید به‌صورت دستی از طریق releases.publish() منتشر شوند. انتشار خودکار در زمان مشخص‌شده به زودی اضافه می‌شود.

// Create a release (optionally with a target date)
const release = await proyecta.content.releases.create({
name: 'Monday launch',
scheduled_at: '2024-01-08T09:00:00Z',
});
// Manually publish a release when ready
await proyecta.content.releases.publish({ releaseId: release.id });
// Browse releases
for await (const r of proyecta.content.releases.list()) {
console.log(r);
}

برای تغییر زمان‌بندی یک release، آن را حذف کرده و دوباره بسازید — هیچ endpoint ی برای به‌روزرسانی وجود ندارد.

الگوهای رایج (بگذار هوش مصنوعی آن را راه‌اندازی کند)

Section titled “الگوهای رایج (بگذار هوش مصنوعی آن را راه‌اندازی کند)”
  • «یک وبلاگ با استفاده از Proyecta Content API بساز. Collection 'Blog Post' با فیلدهای: title، slug، excerpt، body (rich text)، coverImage (asset)، author. مسیر عمومی در /blog و /blog/[slug].»
  • «یک collection سؤالات متداول در Proyecta Content بساز. یک صفحه ادمین برای افزودن/ویرایش سؤالات متداول و یک صفحه عمومی /faq بساز.»
  • «یک صفحه فرود چندزبانه با استفاده از Proyecta Content و locale های انگلیسی و اسپانیایی راه‌اندازی کن.»
  • «یک release شامل سه پست وبلاگ بساز و هنگامی که آماده شد آن را به‌صورت دستی منتشر کن.»

چه زمانی از Content استفاده کنیم در مقابل Database

Section titled “چه زمانی از Content استفاده کنیم در مقابل Database”
موارد استفادهاز این استفاده کن
محتوای سرمقاله‌ای (پست‌ها، سؤالات متداول، متن‌های بازاریابی) — نیاز به وضعیت publish/draft، زمان‌بندی، بومی‌سازیContent API
داده‌های اپلیکیشن (کاربران، سفارش‌ها، آیتم‌های سفارش) — نیاز به سرعت کوئری، تراکنش‌ها، real-timeDatabase
Asset های استاتیک در کددایرکتوری public/ در پروژه‌ات
فایل‌های آپلودشده توسط کاربرFiles & Media
  • ویرایشگر rich-text برای entries — ویرایش کامل WYSIWYG برای فیلدهای rich_text در پنل Content
  • پیش‌نمایش زنده تغییرات محتوا در اپلیکیشن
  • نقش‌های محتوا — جداسازی مجوزهای ویرایشگر از مجوزهای توسعه‌دهنده