কন্টেন্ট ম্যানেজমেন্ট
Proyecta-র CMS আপনার অ্যাপের প্রাথমিক data layer — শুধু ব্লগ পোস্ট আর মার্কেটিং কপি নয়, বরং আপনার অ্যাপ যে আসল রেকর্ডগুলির উপর দাঁড়িয়ে সেগুলিও। Collections provision হয় এবং আসল sample content দিয়ে seed হয় UI তৈরির আগেই, তাই আপনার অ্যাপ প্রথম build থেকেই সম্পাদনযোগ্য data-র সাথে যুক্ত হয়ে ship করে।
বেশিরভাগ Proyecta অ্যাপ তাদের data built-in CMS-এ রাখে। আপনি যখন আপনার অ্যাপ বর্ণনা করেন, Proyecta একটি data model ডিজাইন করে, প্রয়োজনীয় collections তৈরি করে এবং সেগুলি বাস্তবসম্মত sample content দিয়ে পূরণ করে — একটি পেজও তৈরি হওয়ার আগেই। আপনার পেজগুলি তখন সেই আসল, মালিক-সম্পাদনযোগ্য content পড়ে typed hooks-এর মাধ্যমে, যা AI আপনার জন্য wired up করে দেয়। এটি সামগ্রিকভাবে কীভাবে কাজ করে তা জানতে দেখুন আপনার অ্যাপের data কীভাবে কাজ করে।
শুরু করতে এর কিছুই নিয়ে ভাবতে হবে না — এটি স্বয়ংক্রিয়ভাবে হয়। এই পেজটি ব্যাখ্যা করে ভেতরে কী আছে, যাতে আপনি এটি নিজের মতো করে গড়ে নিতে পারেন।
Collections এবং singletons
Section titled “Collections এবং singletons”Content সংগঠিত হয় collections এবং singletons-এ:
| ধরন | এটি কী | উদাহরণ |
|---|---|---|
| Collection | অনেক entries সহ একটি content type — একটি schema, অনেক row। | posts, services, testimonials, catalogItems |
| Singleton | ঠিক একটি entry সহ একটি content type — global, একবারের content। | businessInfo, seoSettings |
একটি collection হলো একটি আকার; প্রতিটি entry হলো সেই আকারের একটি আইটেম (একটি ব্লগ পোস্ট, একটি service, একটি FAQ)। একটি singleton একটি একক সম্পাদনযোগ্য রেকর্ড ধারণ করে — আপনার ব্যবসার পরিচয়, বা কোনো পেজের hero/section কপি।
কোন ধরনের content
Section titled “কোন ধরনের content”Proyecta ready-made collection design নিয়ে আসে — বাস্তব ব্যবসায় যে ধরনের রেকর্ড রাখা হয় তার জন্য সুচিন্তিত fields, admin hints এবং starter content সহ: ব্লগ পোস্ট ও আর্টিকেল, services, পণ্য catalog, খাবারের মেনু, testimonials ও রিভিউ, টিমের সদস্য, ফটো গ্যালারি, FAQ, ইভেন্ট, লোকেশন, ডাউনলোডযোগ্য রিসোর্স, চাকরির বিজ্ঞাপন, কোর্স, ট্যুর এবং আবাসন তালিকা, এবং আরও অনেক কিছু।
কোনো মেনু থেকে বেছে নিতে হয় না। আপনি যখন আপনার অ্যাপ বর্ণনা করেন, Proyecta আপনার brief অনুযায়ী প্রয়োজনীয়গুলি বেছে নেয় — আপনার ব্যবসার ধরন, আপনার চাহিদার features, আপনার ভাষা — এবং সেগুলি তৈরি করে, বাস্তবসম্মত sample content দিয়ে আগে থেকেই পূরণ করে। আপনার অ্যাপের যদি এর কোনোটিই দিয়ে না হয়, Proyecta নিজের fields সহ একটি custom collection ডিজাইন করে।
সে কারণেই, আপনার admin panel আপনার অ্যাপের collections দেখায় — কোনো নির্দিষ্ট তালিকা নয়। এটি আপনার অ্যাপের live content model থেকে নিজেকে তৈরি করে, তাই Proyecta আপনার জন্য যা তৈরি করেছে, built-in হোক বা custom, সেটিই আপনি দেখতে ও সম্পাদনা করতে পারবেন। দুটি Proyecta অ্যাপের collections-এর সেট কমই একরকম হয়, এবং এটি পরিকল্পিতভাবেই এমন।
Fields
Section titled “Fields”প্রতিটি collection typed fields দিয়ে তৈরি। Field types শুরু থেকে শেষ পর্যন্ত enforce করা হয় — admin panel সঠিক editor render করে এবং আপনার পেজগুলি সঠিকভাবে-typed values পায়।
| Field type | এটি কীসের জন্য |
|---|---|
string |
ছোট এক-লাইনের values — শিরোনাম, নাম, ঠিকানা। |
text |
সাধারণ টেক্সটের একটি অনুচ্ছেদ। |
markdown |
দীর্ঘ rich text — আর্টিকেলের বডি, “about” কপি। |
slug |
URL identifier, অন্য field থেকে স্বয়ংক্রিয়ভাবে তৈরি (যেমন শিরোনাম)। |
number |
গণনা, রেটিং, সময়কাল। |
money |
একটি মূল্য বা মুদ্রার পরিমাণ — অর্থ হিসেবে দেখানো ও সম্পাদনা করা হয়। |
boolean |
চালু/বন্ধ flag। |
date |
ক্যালেন্ডারের তারিখ। |
datetime |
Timestamp — publish তারিখ, ইভেন্ট শুরুর সময়। |
weeklyHours |
সপ্তাহের প্রতিদিনের খোলার সময়। |
asset |
একটি ছবি, ভিডিও বা PDF (public URL হিসেবে সংরক্ষিত)। |
reference |
অন্য collection-এর একটি entry-র সাথে লিংক। |
enum |
নির্দিষ্ট পছন্দের তালিকা থেকে একটি value। |
array |
string-এর তালিকা — ট্যাগ, ফোন নম্বর, জোন। |
blocks |
Stackable content blocks — typed sections দিয়ে তৈরি একটি পেজ। |
json |
Structured data যা উপরের কোনো type-এ পড়ে না। |
Entries, drafts এবং publishing
Section titled “Entries, drafts এবং publishing”একটি entry হলো collection-এর একটি আইটেম। প্রতিটি entry-র একটি status থাকে:
- Draft — কাজ চলছে; আপনার live সাইটে কখনো দেখানো হয় না।
- Published — live এবং ভিজিটরদের কাছে দৃশ্যমান।
- Archived — অবসরপ্রাপ্ত, পথের বাইরে রাখা।
আপনার public পেজগুলি শুধুমাত্র published entries দেখে — drafts এবং archived আইটেমগুলি স্বয়ংক্রিয়ভাবে লুকানো থাকে, তাই content live হওয়ার আগে নিরাপদে প্রস্তুত করতে পারবেন।
Content ম্যানেজ করা (কোড দরকার নেই)
Section titled “Content ম্যানেজ করা (কোড দরকার নেই)”Content যোগ ও সম্পাদনা করার দুটি উপায় আছে — কোনোটিতেই কোড ছুঁতে হয় না:
- চ্যাটে AI-কে জিজ্ঞেস করুন। শুধু পরিবর্তনটি বর্ণনা করুন এবং এটি আপনার জন্য সঠিক content সম্পাদনা করে দেবে:
"Add a testimonial from María González: 'Best service in town', 5 stars.""Change the tagline in Business Info to 'Café de especialidad en la Roma'.""Mark the last five contact-form submissions as read."
- আপনার অ্যাপের admin panel। প্রতিটি published অ্যাপ একটি built-in, sign-in-protected admin panel পায় যেখানে আপনি (এবং যে staff-কে আপনি অ্যাক্সেস দেবেন) সরাসরি content ও ফর্ম submissions ম্যানেজ করতে পারবেন — প্রতিটি collection-এর জন্য spreadsheet-style editor, সাথে submissions inbox। এটি আপনার অ্যাপের live content model থেকে নিজেকে configure করে, তাই নতুন collections স্বয়ংক্রিয়ভাবে সেখানে দেখা যায়। দেখুন Admin Panel।
আপনার অ্যাপের admin panel বা AI-এর মাধ্যমে CMS content ম্যানেজ করুন — একটি in-builder content editor roadmap-এ আছে (দেখুন শীঘ্রই আসছে)। Live-updating অ্যাপের জন্য একটি realtime record browser শীঘ্রই আসছে।
আপনার অ্যাপ কীভাবে content পড়ে
Section titled “আপনার অ্যাপ কীভাবে content পড়ে”আপনার পেজগুলি @/hooks/useContent-এর typed hooks-এর মাধ্যমে content পড়ে — এবং সেই wiring AI আপনার জন্য লেখে। আপনি পেজটি বর্ণনা করেন; Proyecta সেই components তৈরি করে যেগুলি আপনার আসল collections-এর বিপরীতে এই hooks call করে। আপনি খুব কমই এগুলি নিজে স্পর্শ করেন, কিন্তু এগুলি কী করে তা এখানে দেওয়া হলো:
| Hook | এটি কী করে |
|---|---|
useCollection('posts') |
একটি collection-এর published entries তালিকা করে (optional filter/sort/limit সহ)। |
useEntry('posts', slug) |
slug দিয়ে একটি published entry fetch করে (detail পেজের জন্য)। |
useSingleton('businessInfo') |
একটি singleton পড়ে (business info, পেজ content)। |
useFormSubmit('contactForm') |
একটি ফর্ম submit করে এবং validation error জানায়। |
// A blog index — exactly the kind of code the AI generates for youimport { useCollection } from '@/hooks/useContent';
function BlogList() { const { data: posts, isLoading } = useCollection('posts', { sort: 'published_at:desc' }); if (isLoading) return <Spinner />; return posts?.map((post) => <PostCard key={post._id} post={post} />);}Proyecta যখন আপনার collections-এর জন্য typed interfaces তৈরি করে, hooks সম্পূর্ণ typed হয়ে যায় (useCollection<Post>('posts')), তাই আপনার editor প্রতিটি field autocomplete করে। Reads একটি baked snapshot থেকে first paint-এ hydrated হয় — পেজগুলি তাৎক্ষণিকভাবে এবং SEO-friendly ভাবে render হয়, তারপর background-এ live refresh হয়।
Forms একটি first-class capability, AI-এর হাতে-তৈরি কিছু নয়। একটি form block যোগ করুন এবং এটি fields render করে, input validate করে, submit করে এবং একটি success state দেখায়:
<FormBlock form="contactForm" />Forms-ও ready-made আসে — একটি contact form, একটি quote request, একটি booking form, একটি order form, একটি registration form — এবং Proyecta আপনার পেজে সঠিকটি wired করে দেয়। Submissions আপনার অ্যাপের admin-panel inbox-এ জমা পড়ে, এবং নতুনটি এলে মালিককে ইমেইল করা হয়। পুরো চিত্রের জন্য দেখুন Forms।
Localization
Section titled “Localization”Content একাধিক locales-এ অনুবাদ করা যায়। Localized হিসেবে চিহ্নিত fields প্রতিটি ভাষার জন্য আলাদা value সংরক্ষণ করে, এবং read hooks গুলি visitor-এর active locale pass করলে একটি fallback chain-এর মাধ্যমে সেগুলি resolve করে (অনুরোধকৃত ভাষা → configured fallbacks → default):
const { data: posts } = useCollection('posts', { locale: 'es' });Single-language অ্যাপগুলি locales সম্পূর্ণ উপেক্ষা করে — configure করার কিছু নেই। বিস্তৃত অনুবাদের জন্য দেখুন Internationalization।
Releases
Section titled “Releases”একটি release কয়েকটি entries একসাথে bundle করে যাতে সেগুলি একসাথে live (বা unpublished) হয় — একটি সমন্বিত content drop (একটি launch, একটি নতুন product পেজ, একটি FAQ refresh) পরিকল্পনা করুন এবং সবকিছু একবারে flip করুন।
নোট: স্বয়ংক্রিয় timed publishing এখনো implemented নয়।
scheduled_atতারিখ সহ একটি releasescheduledstatus-এ প্রবেশ করে কিন্তু ম্যানুয়ালি publish করতে হয়। নির্ধারিত সময়ে auto-publishing শীঘ্রই আসছে।
সাধারণ patterns (AI-কে দিয়ে wire করান)
Section titled “সাধারণ patterns (AI-কে দিয়ে wire করান)”এটি খুব কমই নিজে হাতে লিখতে হয় — আপনি যা চান বর্ণনা করুন এবং Proyecta আসল collections-এর বিপরীতে তা তৈরি করে:
"Build a blog. Each post has a title, cover image, rich-text body, category, and tags. Public routes at /blog and /blog/[slug], newest first.""Add an FAQ section the owner can edit, grouped by category.""Add a bookable services list with a request-a-quote form.""Make the site bilingual — English and Spanish — with a language switcher.""Seed the testimonials with five realistic reviews for a coffee shop."
আপনার অ্যাপের data কোথায় থাকে
Section titled “আপনার অ্যাপের data কোথায় থাকে”CMS হলো durable content ও রেকর্ডের জন্য ডিফল্ট জায়গা। কিছু ধরনের data পরিবর্তে purpose-built সিস্টেমে থাকে:
| Data-র ধরন | কোথায় থাকে |
|---|---|
| Content ও রেকর্ড (posts, services, listings, FAQs, catalog, bookings) | Proyecta CMS (এই পেজ) — ডিফল্ট |
| Realtime / behavior state (live chat, feeds, presence, game state) | Realtime store — শীঘ্রই আসছে |
| User accounts ও sign-in | Auth |
| Products, orders, subscriptions, payments | Commerce |
| Uploaded files ও media | Files & Media |
| Build-এ baked static assets | আপনার প্রজেক্টের public/ directory |
CMS হলো ডিফল্ট। সত্যিকারের realtime behavior-এর জন্য একটি realtime store শীঘ্রই আসছে; তখনও, durable content এবং commerce catalog CMS-এই থাকবে।
শীঘ্রই আসছে
Section titled “শীঘ্রই আসছে”- In-builder content editor — builder dashboard থেকে সরাসরি আপনার CMS collections ব্রাউজ ও সম্পাদনা করুন (আজ: admin panel বা AI-এর মাধ্যমে content ম্যানেজ করুন)।
- Rich-text WYSIWYG editor —
markdownfields-এর জন্য visual editing (আজ সেগুলি markdown হিসেবে সম্পাদনা করা হয়)। - Timed auto-publish — releases যা নির্ধারিত সময়ে স্বয়ংক্রিয়ভাবে live হয়।
- Live preview — আপনার অ্যাপের বিপরীতে content পরিবর্তনের।
- Content roles — developer permissions থেকে editor permissions আলাদা করা।