UNMD0
UNMD0
خواندن ۴ دقیقه·۴ سال پیش

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

سلام.

امروز میخوام از تجربه شخصی خودم برای پیاده سازی قابلیت "شخصی سازی کردن صفحه اول در لاراول توسط کاربر" بهتون بگم

فکر کنید میخواید یه صفحه بسازید که کاربر ادمین بتونه صفحه اول (یا هر صفحه دیگه) رو شخصی سازی کنه

نمونه ای که خودم ساختم (فروشگاه ساز 8190)
نمونه ای که خودم ساختم (فروشگاه ساز 8190)


خب حالا که تقریبا میدونید دارم از چی حرف میزنیم بریم که تجربه من رو در این مورد بشنوید


فولدر بندی و فایلها

اول از همه داخل public یه فولدر ساختم به اسم widgets

بعد هر ویجتی که میخواستم اضافه کنم واسش یه فولدر میساختم و اسم ویجتم رو میزاشتم روش، برای مثال label

حالا داخل این فولدر 3 فایل ایجاد میکنیم

  1. index.blade.php
  2. index.png
  3. settings.blade.php

دیتابیس

بریم سروقت دیتابیس (بعد درمورد فایلها توضیح میدم)

سه تا جدول ساختم به اسم های

  1. w_properties
  2. w_settings
  3. w_pages
w_properties
w_properties


من هر ویجت جدید که میسازم میام و مشخصاتشو تو این جدول وارد میکنم

مشخصاتی نظیر اسم ویجت، آدرس فایل اصلی ویجت، آدرس عکس ویجت، آدرس فایل تنظیمات ویجت و....

قطعا شما میتونید این کار رو به خاطر فولدر بندی صحیح هوشمند تر کنید و فقط برخی مشخصات رو ذخیره کنید




w_settings
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
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، یک وبسایتی هست که برای تمرین خودم و زدن اولین پروژم با لاراول آوردمش بالا و بی شک کدهایی که دیدین و منطقی که فهمیدین بیشتر جای کار داره و بزارین به حساب تازه کار بودنم.

امیدوارم بتونم به کسایی که میخواستن چنین قابلیتی رو برای سایتشون فعال کنن کمک کوچکی کرده باشم.

حتما منتظر نظرات و نقد هاتون نسبت به کد و منطق این نوشته هستم.


laravelphpالمنتورelementor
Full Stack Developer
شاید از این پست‌ها خوشتان بیاید