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