شخصی سازی کردن صفحه اول در لاراول توسط کاربر

سلام.امروز میخوام از تجربه شخصی خودم برای پیاده سازی قابلیت "شخصی سازی کردن صفحه اول در لاراول توسط کاربر" بهتون بگمفکر کنید میخواید یه صفحه بسازید که کاربر ادمین بتونه صفحه اول (یا هر صفحه دیگه) رو شخصی سازی کنهنمونه ای که خودم ساختم (فروشگاه ساز 8190)خب حالا که تقریبا میدونید دارم از چی حرف میزنیم بریم که تجربه من رو در این مورد بشنویدفولدر بندی و فایلهااول از همه داخل public یه فولدر ساختم به اسم widgets بعد هر ویجتی که میخواستم اضافه کنم واسش یه فولدر میساختم و اسم ویجتم رو میزاشتم روش، برای مثال labelحالا داخل این فولدر 3 فایل ایجاد میکنیمindex.blade.phpindex.pngsettings.blade.phpدیتابیسبریم سروقت دیتابیس (بعد درمورد فایلها توضیح میدم)سه تا جدول ساختم به اسم هایw_propertiesw_settingsw_pagesw_propertiesمن هر ویجت جدید که میسازم میام و مشخصاتشو تو این جدول وارد میکنممشخصاتی نظیر اسم ویجت، آدرس فایل اصلی ویجت، آدرس عکس ویجت، آدرس فایل تنظیمات ویجت و....قطعا شما میتونید این کار رو به خاطر فولدر بندی صحیح هوشمند تر کنید و فقط برخی مشخصات رو ذخیره کنیدw_settingsاین جدول یک ردیف مهم داره به اسم settingاین ردیف، تنظیمات ویجت رو به صورت json داخل خودش ذخیره میکنه. برای واضح شدن مبحث یک مثال براتون میزنم.{ &quottext&quot:&quotThis is a label&quot, &quotdirection&quot:&quotcenter&quot, &quotfont&quot:&quotbyekan&quot, &quotfont_size&quot:&quot25&quot, &quotweight&quot:&quot100&quot }و حتما یادتون باشه برای هر ویجت ملزم به پر کردن این ردیف به عنوان تعیین پارامترهای پیشفرض هستین.دیگه خودتون باید در نظر بگیرین که ویجتتون نیاز به چه پارامترهایی داره.ردیف مهم بعدی تو این جدول gadget_id هست که به id در جدول w_properties وصله.این ردیف برای اینه که بدونیم کاربر از کدوم گجت یک نمونه جدید ساخته و میخواد تنظیمات رو انجام بده (یا حتی برای اینکه بدونیم کاربر میخواد تنظیمات کدوم گجت رو تغییر بده).w_pagesتنها ردیف قابل بحث این جدول content هست.به ترتیب id (از جدول w_settings) گجت هایی که باید توی صفحه مورد نظر لود بشن رو واراد میکنیم و با "،" از هم جداشون میکنیممثلا:1,2,4,6 اگر تا الان یکم گیج شدین مشکلی نداره، احتمالا در ادامه مفهوم رو میفهمینحالا بریم سراغ کدهایی که نوشتم.هرجا که خواستم به صفحه اصلی Route کنم اینکارو میکردم$pageinfo = pages::where(&quotshopname&quot,&quot=&quot,$site)->where(&quotname&quot,&quot=&quot,&quotindex&quot)->first(); $gadgets = gadget_propertie::all(); if($gadgets != &quot&quot && $pageinfo != &quot&quot){ return view('your.main.view',[&quotpage&quot=>$pageinfo, &quotgadgets&quot=>$gadgets]); }کد صفحه اصلی (your.main.view) رو به این صورت نوشتم@foreach (explode(',', $page->content) as $pg) @if($pg <> &quot&quot) @php $gadgetid=App\w_setting::where(&quotid&quot,&quot=&quot,$pg)->first()->gadget_id; $add = App\w_propertie::where(&quotid&quot,&quot=&quot,$gadgetid)->first()->main_file; $json = App\w_setting::where(&quotid&quot,&quot=&quot,$pg)->first()->setting; $parametr = json_decode($json); @endphp @include($add,[&quotpmr&quot => $parametr]) //Call widget with parametrs @endif @endforeachتو اینجا میریم و همه ویجت هارو دونه دونه صدا میزنیم و تنظیماتش رو (که به json تبدیل کردیم) رو به عنوان پارامتر بهشون تحویل میدیمبعد تو فایل index.blade.php ویجت ها، براساس نیازم پارامتر هارو جای گذاری کردمبرای مثال ویجت لیبل رو به این صورت نوشتم<div class=&quotcol-lg-12&quot> <div style=&quot text-align: {{$pmr->direction}}; font-family: {{$pmr->font}}; font-size: @if(isset($pmr->font_size)) {{$pmr->font_size.&quotpx&quot}} @else {{'45px'}} @endif; font-weight: @if(isset($pmr->weight)) {{$pmr->weight}} @else {{'bold'}} @endif; &quot> {{$pmr->text}} </div> </div>در نظر بگیرید که اگر تو جدول w_settings ردیف setting رو با پارامتر های پیشفرض پر نکرده بودیم حالا باید هردفعه که پارامتری رو صدا میزدیم چک میکردیم آیا خالیه یا نه و اگر پارامتر خالی بود مقدار پیشفرضی رو در نظر بگیریم. مرحله بعد، فایل settings.blade.phpتو این فایل به کاربر اجازه میدیم پارامترها و تنظیمات ویجت رو انجام بده و اونو ذخیره کنه.شرح دادن فایل setting.blade.php نه تنها نکته حائز اهمیتی نداره بلکه به خاطر طولانی بودن کد این قسمت (که 99% هم html هست) باعث گیج شدن شما میشه.من تا اینجا نام جداول ، ردیف ها و کدها رو نسبت به پروژه خودم متفاوت بهتون گفتم.سایت ساز 8190، یک وبسایتی هست که برای تمرین خودم و زدن اولین پروژم با لاراول آوردمش بالا و بی شک کدهایی که دیدین و منطقی که فهمیدین بیشتر جای کار داره و بزارین به حساب تازه کار بودنم.امیدوارم بتونم به کسایی که میخواستن چنین قابلیتی رو برای سایتشون فعال کنن کمک کوچکی کرده باشم.حتما منتظر نظرات و نقد هاتون نسبت به کد و منطق این نوشته هستم.