══════════ ساختار فرم‌ها در سایت + وارد کردن فرم از فایل ══════════

۱) فرم‌ها روی هاست چه شکلی هستند؟
  همه‌چیز JSON است (پسوند .json)؛ پایگاه‌داده‌ای برای خود فرم‌ها نیست:
  • form-packs.json            بسته‌های آمادهٔ سایت (هویتی، تماس، آدرس، مدارک، …) کنار api.php
  • data/c3-custom-forms.json  «فرم‌های دستی» که از پنل می‌سازید (و فرم‌هایی که با آپلود وارد می‌کنید)
  • data/services.json         فرمِ هر خدمت، داخل خود خدمت (کلید form)
  • پاسخ مشتری‌ها داخل دیتابیس SQLite (data/) ذخیره می‌شود، نه در این فایل‌ها.
  ساختار یک فرم:   { "title": "نام فرم", "fields": [ { "id":"name", "type":"text", "label":"نام", "required":true }, … ] }

۲) وارد کردن فرم از فایل
  پنل ← تب «📋 فرم‌ها» ← کارت «✍️ فرم دستی من» ← «📥 وارد کردن فرم از فایل» ← «📤 انتخاب فایل فرم».
  • پسوند مجاز: .json (یا .txt با همان محتوای JSON)، حداکثر ۱ مگابایت.
  • فایل می‌تواند یک فرم، چند فرم، یا فقط فهرست فیلدها باشد (در این حالت نام فایل، نام فرم می‌شود). این شکل‌ها پذیرفته می‌شود:
      { "title": "…", "fields": [ … ] }
      { "forms": [ {title, fields}, … ] }      (همان شکل «خروجی فرم‌های من»)
      [ {title, fields}, … ]   یا   [ فیلد، فیلد، … ]
      { "packs": [ … ] }   (شکل form-packs.json)
  • اگر فرمی با همان نام از قبل باشد، می‌پرسد: تأیید = جایگزین، انصراف = با نام «(واردشده)» کنار آن ذخیره شود.
  • فیلدهای ناقص (نوع ناشناخته، بدون عنوان، لیست بدون گزینه) رد می‌شوند و در پیام زیر دکمه‌ها فهرستشان نشان داده می‌شود؛ بقیه وارد می‌شوند.
  • دکمهٔ «⬇ دانلود نمونه فایل» یک فایل نمونه می‌دهد؛ «⬇ خروجی فرم‌های من» همهٔ فرم‌های دستی فعلی را برای نسخهٔ پشتیبان یا انتقال به سایت دیگر ذخیره می‌کند.
  • سرور تغییری نکرد: فایل از همان مسیر ذخیرهٔ فرم دستی (api/c3/admin/custom-forms) می‌گذرد و سمت سرور هم دوباره پاک‌سازی می‌شود.

۳) انواع فیلد (type)
  section      عنوان بخش (فقط label)            text         متن کوتاه (max اختیاری)
  textarea     متن بلند                           number       عدد
  tel          موبایل (با 09 شروع می‌شود)        email        ایمیل
  national_id  کد ملی (اعتبارسنجی)               postal_code  کد پستی ۱۰ رقمی
  date_jalali  تاریخ شمسی (مثل ۱۳۷۰/۰۱/۱۵)       select       لیست کشویی (options لازم)
  radio        تک‌گزینه‌ای (options لازم)         checkbox     تیک بله/خیر
  file         آپلود فایل (accept و multiple)
  نام‌های جایگزین مثل phone ، dropdown ، date ، heading ، upload هم شناخته می‌شوند.

۴) کلیدهای هر فیلد
  id        انگلیسی/عدد/_  (حداکثر ۴۰). نکته: اگر id را name ، mobile ، first_name ، last_name بگذارید، هنگام ثبت درخواست از همین‌ها نام و موبایل مشتری پر می‌شود.
  type      یکی از انواع بالا          label     عنوان فیلد (حداکثر ۸۰ نویسه)
  required  true / false               hint      راهنمای زیر فیلد (حداکثر ۱۲۰)
  max       حداکثر طول متن (۱ تا ۵۰۰۰)  options   فهرست گزینه‌ها (حداکثر ۳۰ گزینه، هر کدام ۶۰ نویسه) — آرایه یا متن جداشده با ویرگول
  accept    فقط برای file (مثل image/*,application/pdf)     multiple  فقط برای file
  dir       "ltr" برای فیلدهای انگلیسی مثل ایمیل

۵) محدودیت‌ها
  حداکثر ۶۰ فرم دستی، هر فرم حداکثر ۸۰ فیلد. فایل UTF-8 باشد.

فایل‌های تغییرکرده: panel-aaf2d6f1b2e7.html   (api.php و بقیه بدون تغییر)
نمونهٔ فایل جدا: cafenetakbari-form-sample.json
