تخطَّ إلى المحتوى

إدارة المحتوى

نظام CMS بدون واجهة أمامية يدعم المجموعات والمداخل والإصدارات المحلية والإصدارات العامة. أدِر المحتوى من لوحة Content أو عبر SDK.

تمتلك Proyecta نظام CMS متكاملاً بدون واجهة أمامية. يعتمد النظام على المخطط أولاً: تُعرّف مجموعات (أنواع محتوى منظّمة)، ثم تُنشئ مداخل تتوافق مع حقول كل مجموعة. يمكن ترجمة المداخل وتجميعها في إصدارات.

يمكن إدارة المحتوى عبر SDK أو بطلب المساعدة من الذكاء الاصطناعي. تضم واجهة Content API ستة أنواع من الموارد:

التبويب / الموردالغرض منه
Collectionsتعريف وإدارة مخططات المحتوى (مثل “مقالة مدونة”، “أسئلة شائعة”، “مواصفات المنتج”)
Fieldsخانات مُحدَّدة النوع داخل مجموعة (تُدار كمورد فرعي من Collections)
Entriesتصفح المداخل وإنشاؤها وتحريرها ونشرها وحذفها داخل مجموعة
Localesإضافة وإدارة الإصدارات المحلية للغات والمناطق من أجل المحتوى المترجم
Releasesتجميع المداخل للنشر (أو إلغاء النشر) معاً؛ النشر يدوياً عبر releases.publish()
Assetsرفع وإدارة ملفات الوسائط (صور، فيديوهات، ملفات PDF) القابلة للإشارة إليها من المداخل

انقر على مجموعة في تبويب Collections للانتقال مباشرةً إلى مداخلها. يتيح لك تبويب Entries إنشاء عناصر المحتوى الفردية وتحريرها ونشرها وحذفها.

يمكنك أيضاً إدارة كل شيء برمجياً عبر SDK (‏proyecta.content).

المفهومما هو
Collectionمخطط — يُحدد شكل نوع واحد من المحتوى (مثل “مقالة مدونة”، “أسئلة شائعة”، “مواصفات المنتج”)
Fieldخانة محدَّدة النوع داخل مجموعة (مثل title: string، body: rich_text، coverImage: asset)
Entryنسخة واحدة من مجموعة (مقالة مدونة واحدة، سؤال شائع واحد)
Assetملف وسائط مرفوع يمكن الإشارة إليه من المداخل
Localeلغة أو منطقة يُترجم إليها المحتوى
Releaseمجموعة من المداخل مجدوَلة للنشر (أو إلغاء النشر) في الوقت ذاته
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);

المداخل هي صفوف المحتوى الفعلية. كل مدخل ينتمي إلى مجموعة ويحمل بيانات تتوافق مع حقول تلك المجموعة.

// 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);

رفع الأصول مدعوم بشكل رئيسي — استخدمه لإرفاق صور أو فيديوهات أو ملفات PDF بمداخلك:

// 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

للاطلاع على رفع الملفات عبر الدردشة (سحب الملفات إلى المحرر)، راجع الملفات والوسائط.

يمكن ترجمة المحتوى إلى إصدارات محلية متعددة. كل إصدار محلي هو سجل يُدار عبر proyecta.content.locales:

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

عند جلب المداخل، يمكنك طلب ترجمة إصدار محلي معيّن. راجع التدويل للاطلاع على الصورة الشاملة لـ i18n.

الإصدار هو حزمة من المداخل تُنشر (أو يُلغى نشرها) في الوقت ذاته. يتيح لك هذا إعداد إطلاق محتوى منسّق — حملة تسويقية، صفحة منتج جديدة، تحديث للأسئلة الشائعة — وتفعيل كل شيء دفعةً واحدة.

ملاحظة: النشر التلقائي المزمَّن غير متاح بعد. الإصدارات التي تحمل تاريخ 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);
}

لتغيير جدول إصدار ما، احذفه وأعد إنشاءه — لا يوجد endpoint للتحديث.

أنماط شائعة (دع الذكاء الاصطناعي يُنجزها)

Section titled “أنماط شائعة (دع الذكاء الاصطناعي يُنجزها)”
  • "Build a blog using the Proyecta Content API. Collection 'Blog Post' with fields: title, slug, excerpt, body (rich text), coverImage (asset), author. Public route at /blog and /blog/[slug]."
  • "Create an FAQ collection in Proyecta Content. Build an admin page where I can add/edit FAQs and a public /faq page."
  • "Set up a multi-language landing page using Proyecta Content with English and Spanish locales."
  • "Create a release containing three blog posts and publish it manually when ready."

متى تستخدم Content مقابل Database

Section titled “متى تستخدم Content مقابل Database”
حالة الاستخداماستخدم هذا
المحتوى التحريري (مقالات، أسئلة شائعة، نصوص تسويقية) — يحتاج إلى حالات النشر/المسودة والجدولة والترجمةContent API
بيانات التطبيق (مستخدمون، طلبات، بنود) — يحتاج إلى سرعة الاستعلام والمعاملات والوقت الفعليDatabase
الأصول الثابتة في الكودمجلد public/ في مشروعك
الملفات التي يرفعها المستخدمونالملفات والوسائط
  • محرر النصوص المنسَّقة — تحرير WYSIWYG كامل لحقول rich_text في لوحة Content
  • معاينة مباشرة لتغييرات المحتوى على تطبيقك
  • أدوار المحتوى — فصل صلاحيات المحررين عن صلاحيات المطورين