مدیریت فضای کاری
تمهای بازاریابی قابلنصب
تمهای قابل تعویض بازاریابی
کل سایت بازاریابی — خانه، قیمتگذاری، نحوه کار، یکپارچهسازیها، حریم خصوصی، شرایط، تاریخچه تغییرات — یک تم قابل تعویض است. اپراتورها با قرار دادن یک پوشه، تم جدیدی اضافه میکنند؛ تغییر آن با یک کلیک در تنظیمات ← سیستم ← بازاریابی انجام میشود.
نحوه عملکرد
هر کنترلکننده بازاریابی، کامپوننت Inertia خود را از طریق App\Support\MarketingTheme::component($page) بهجای سختکد کردن یک رشته، جستجو میکند. حلکننده app_settings.marketing_theme را میخواند، زمانی که ستون خالی باشد یا به نامکی اشاره کند که نصب نشده است، به harvest (تم داخلی) بازمیگردد و یکی از موارد زیر را برمیگرداند:
- مسیر کامپوننت قدیمی برای
harvest(welcome،marketing/pricing،marketing/how-it-worksو غیره) — بنابراین نصبهای موجود به نمایش چیدمان اصلی ادامه میدهند. marketing-themes/{slug}/{page}برای هر تم دیگر — Inertia را به یک پوشه مستقل به ازای هر تم اشاره میدهد.
افزودن تم جدید
-
یک پوشه در
resources/js/pages/marketing-themes/به نام نامک تم (kebab-case، بدون فاصله) ایجاد کنید. به عنوان مثال،resources/js/pages/marketing-themes/meadow/. -
یک مانیفست
theme.jsonدر ریشه آن پوشه اضافه کنید. حداقل شکل:{ "name": "Meadow", "description": "چیدمان آرام و تحریریه با رنگهای سبز." }تمهای بدون
theme.jsonنادیده گرفته میشوند — مانیفست چیزی است که یک پوشه را به تم تبدیل میکند.اگر یک تم فقط زیرمجموعهای از هفت صفحه را ارائه میدهد، یک لیست مجاز
pagesاضافه کنید تا حلکننده بداند تم کدام کلیدها را ارائه میدهد — هر صفحه دیگر بهطور بیصدا به کامپوننت قدیمی Harvest بازمیگردد:{ "name": "Aurora", "description": "بروتالیست تحریریه — فقط صفحه اصلی.", "pages": ["home"] }حذف
pagesبه این معنی است که تم فرض میشود همه هفت صفحه را ارائه میدهد؛ زمانی که یک بسته کامل ارسال میکنید مفید است. -
هفت کامپوننت صفحه را در داخل پوشه قرار دهید که هر کدام همان props را دریافت کنند که کنترلکننده منطبق امروز ارسال میکند. نامها باید دقیقاً مطابقت داشته باشند:
home.tsxpricing.tsxhow-it-works.tsxintegrations.tsxprivacy.tsxterms.tsxchangelog.tsx
از
resources/js/layouts/marketing-shell.tsxبهعنوان پوسته اشتراکی استفاده کنید، یا پوسته مخصوص تم خود را در داخل پوشه ارسال کنید. -
npm run buildرا اجرا کنید (یاnpm run devرا در حین تکرار در حال اجرا نگه دارید) تا Vite فایلهای جدید را دریافت کند. -
تنظیمات ← سیستم ← بازاریابی را باز کنید، تم جدید را از منوی کشویی انتخاب کنید و ذخیره کنید. از
/،/pricingو غیره بازدید کنید — آنها اکنون از پوشه شما نمایش داده میشوند.
propsهایی که کامپوننتهای تم شما دریافت میکنند
کنترلکنندهها بدون توجه به تم، همان props را ارسال میکنند. کامپوننتهای صفحه خود را براساس این شکل بسازید و تغییر تم، یک تغییر کاملاً بصری خواهد بود:
| صفحه | props قابل توجه |
|---|---|
home | canRegister، demoAgentId، content، seo |
pricing | plans، lifetime_plans، currency، currencies، matrix، faqs، shell، brand، seo |
how-it-works | steps، latency، shell، brand، seo |
integrations | native، data_sources، roadmap، shell، brand، seo |
privacy | content، shell، brand، seo |
terms | intro، sections، effective_date، contact_email، shell، brand، seo |
changelog | entries، shell، brand، seo |
داخلی: تم Harvest
تم ارسالشده harvest نام دارد. برای سازگاری با نسخههای قبلی، فایلهای آن در همان جایی که همیشه بودند (resources/js/pages/welcome.tsx + resources/js/pages/marketing/*.tsx) قرار دارند، نه در marketing-themes/harvest/. حلکننده به آن مسیرهای قدیمی نگاشت میکند تا نصبهای موجود بدون تغییر در نمایش ارتقا یابند.
تمهای اضافی ارسالشده
دو تم اضافی در بسته ارسال میشوند. هر دو بستههای کامل هستند که همه هفت صفحه را پوشش میدهند و از دستیار فروش دموی زنده برای پیشنمایش چت قهرمان استفاده میکنند.
-
Aurora (نامک
aurora) — بروتالیست تحریریه با پالت کاغذ/جوهر و لهجه سیگنال لیمویی. درresources/js/pages/marketing-themes/aurora/قرار دارد.auth-shell.tsxرا ارسال میکند تا جریانهای ورود، ثبتنام و بازنشانی رمز عبور در همان پالت کاغذ/جوهر/لیمویی سایت بازاریابی نمایش داده شوند. -
Prism (نامک
prism) — هویت گرادیان بنفش/مرجانی، بدنه Inter Tight با لهجههای کج نویس Instrument Serif، ماکت براق قهرمان با کارتهای زمینه شناور، فوتر نوار گرادیان. درresources/js/pages/marketing-themes/prism/قرار دارد. همچنینauth-shell.tsxرا برای ورود منطبق با تم ارسال میکند.
دموی امتحان کنید Prism (دریافت آدرس ناشناس)
قهرمان Prism یک فرم تعاملی امتحان کنید را ارسال میکند. یک بازدیدکننده یک آدرس را وارد میکند، سرور صفحه را بهصورت همزمان دریافت میکند (POST /api/v1/widget/try-now)، متن قابل خواندن را از طریق HtmlExtractor استخراج میکند، آن را تکهتکه میکند و تکهها را زیر یک توکن کش با عمر کوتاه (TTL ۱ ساعت) ذخیره میکند. سپس چت قهرمان به آن زمینه کششده تغییر میکند — هر پیام بازدیدکننده از طریق POST /api/v1/widget/try-now/stream هدایت میشود که یک پاسخ هوش مصنوعی مبتنی بر تکههای کششده را از طریق تگهای <source> پخش میکند.
در app/Services/TryNow/TryNowSession.php و app/Http/Controllers/Widget/TryNowController.php قرار دارد. بدون دستیار فروش، بدون فضای کاری، بدون نوشتن در پایگاه داده — نمیتواند دادههای فضای کاری را آلوده کند. محدودیت نرخ به ازای هر IP از طریق محدودکنندههای try-now-start و try-now-stream که در AppServiceProvider::configureRateLimiting تعریف شدهاند، اعمال میشود.
پوستههای احراز هویت منطبق با تم
هر دو Aurora و Prism یک auth-shell.tsx را در کنار هفت صفحه بازاریابی خود ارسال میکنند. توزیعکننده در resources/js/layouts/auth-layout.tsx پوسته مناسب را براساس marketingTheme (prop اشتراکی Inertia) انتخاب میکند. زمانی که تم فعال پوستهای ارسال نمیکند، توزیعکننده به چیدمان دوپنلی پیشفرض Harvest بازمیگردد. برای افزودن پوسته احراز هویت یک تم جدید:
resources/js/pages/marketing-themes/<slug>/auth-shell.tsxرا با صادر کردن یک کامپوننت با propsهای{ title, description, children }ایجاد کنید.- یک شاخه در
auth-layout.tsxاضافه کنید:if (marketingTheme === '<slug>'). - یک تست Pest در
tests/Feature/Marketing/اضافه کنید که با تم فعال به/loginو/registerدرخواست دهد.
بین آنها در تنظیمات ← سیستم ← بازاریابی یا از طریق tinker تغییر دهید:
php artisan tinker --execute 'App\Models\AppSetting::singleton()->forceFill(["marketing_theme" => "prism"])->save();'
بازنشانی در صورت خرابی تم
اگر پوشه یک تم حذف شود، مانیفست آن نامعتبر شود، یا نامک ذخیرهشده در app_settings.marketing_theme با هیچ تم نصبشدهای مطابقت نداشته باشد، حلکننده بهطور بیصدا به harvest بازمیگردد. سایت بازاریابی با یک تنظیم قدیمی نمیتواند خالی شود. برای بازنشانی صریح، دستور زیر را اجرا کنید:
php artisan tinker --execute 'App\Models\AppSetting::singleton()->forceFill(["marketing_theme" => "harvest"])->save();'