ข้ามไปยังเนื้อหา

การจัดการเนื้อหา

Headless CMS ที่มี collections, entries, locales และ releases ครบครัน จัดการเนื้อหาผ่าน Content panel หรือ SDK

Proyecta มีระบบ headless CMS แบบสมบูรณ์ โดยใช้แนวคิด schema-first: คุณกำหนด collections (ประเภทเนื้อหาแบบมีโครงสร้าง) ก่อน จากนั้นสร้าง entries ที่สอดคล้องกับ fields ของแต่ละ collection โดย entries สามารถแปลเป็นภาษาต่างๆ และจัดกลุ่มเป็น releases ได้

เนื้อหาสามารถจัดการได้ผ่าน SDK หรือโดยการถาม AI Content API มีประเภท resource ทั้งหมดหกแบบ:

Tab / Resourceใช้สำหรับ
Collectionsกำหนดและจัดการ content schemas (เช่น “Blog Post”, “FAQ”, “Product Spec”)
Fieldsช่องที่มีการกำหนดประเภทภายใน collection (จัดการในฐานะ sub-resource ของ Collections)
Entriesดู สร้าง แก้ไข publish และลบ entries ภายใน collection
Localesเพิ่มและจัดการ locales ของภาษา/ภูมิภาคสำหรับเนื้อหาที่แปลแล้ว
Releasesจัดกลุ่ม entries เพื่อเผยแพร่พร้อมกัน (หรือยกเลิกการเผยแพร่พร้อมกัน) โดย publish ด้วยตนเองผ่าน releases.publish()
Assetsอัปโหลดและจัดการไฟล์มีเดีย (รูปภาพ วิดีโอ PDF) ที่สามารถอ้างอิงจาก entries ได้

คลิก collection ใน Collections tab เพื่อไปยัง entries ของ collection นั้น Entries tab ให้คุณสร้าง แก้ไข publish และลบรายการเนื้อหาแต่ละรายการได้

คุณยังสามารถจัดการทุกอย่างผ่าน SDK แบบ programmatic ได้ด้วย (proyecta.content)

แนวคิดความหมาย
CollectionSchema — รูปแบบของเนื้อหาประเภทหนึ่ง (เช่น “Blog Post”, “FAQ”, “Product Spec”)
Fieldช่องที่มีการกำหนดประเภทใน collection (เช่น title: string, body: rich_text, coverImage: asset)
Entryอินสแตนซ์เดียวของ collection (บล็อกโพสต์หนึ่งชิ้น หรือ FAQ หนึ่งรายการ)
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 หนึ่งและมีข้อมูลที่ตรงกับ fields ของ 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

สำหรับการอัปโหลดไฟล์ผ่าน chat (ลากเข้า builder) ดูได้ที่ Files & Media

เนื้อหาสามารถแปลเป็นหลาย locales ได้ แต่ละ locale คือ record ที่จัดการผ่าน 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 ที่จะเผยแพร่ (หรือยกเลิกการเผยแพร่) พร้อมกัน วิธีนี้ช่วยให้คุณเตรียมการเผยแพร่เนื้อหาแบบประสานงาน — ไม่ว่าจะเป็นการ launch แคมเปญการตลาด หน้าสินค้าใหม่ หรือการอัปเดต FAQ — และให้ทุกอย่างเปลี่ยนแปลงพร้อมกันแบบ atomic

หมายเหตุ: ยังไม่รองรับการเผยแพร่อัตโนมัติตามเวลา Releases ที่มีวันที่ scheduled_at จะเข้าสู่สถานะ scheduled แต่ต้องทำการ publish ด้วยตนเองผ่าน releases.publish() ฟีเจอร์การ 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 สำหรับการอัปเดต

รูปแบบการใช้งานทั่วไป (ให้ AI ช่วยเชื่อมต่อให้)

หัวข้อที่มีชื่อว่า “รูปแบบการใช้งานทั่วไป (ให้ AI ช่วยเชื่อมต่อให้)”
  • "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."
กรณีการใช้งานใช้สิ่งนี้
เนื้อหาเชิงบรรณาธิการ (โพสต์ FAQ เนื้อหาการตลาด) — ต้องการสถานะ publish/draft การกำหนดเวลา และการแปลภาษาContent API
ข้อมูลของแอป (ผู้ใช้ คำสั่งซื้อ รายการสินค้า) — ต้องการความเร็วในการ query, transactions และ real-timeDatabase
Static assets ในโค้ดไดเรกทอรี public/ ในโปรเจกต์ของคุณ
ไฟล์ที่ผู้ใช้อัปโหลดFiles & Media
  • Rich-text entry editor — การแก้ไขแบบ WYSIWYG เต็มรูปแบบสำหรับ fields ประเภท rich_text ใน Content panel
  • Live preview ของการเปลี่ยนแปลงเนื้อหาในแอปของคุณ
  • Content roles — แยกสิทธิ์ของ editor ออกจากสิทธิ์ของ developer