درود دوستان
من پس از بارها پیاده سازی فیچِر دسته بندیها در پروژه های مختلف، به این نتیجه رسیدم که سورس کد این فیچر را به یک پکیج لاراولی تبدیل کنم.
بنده اخیرا پکیجی به نام Laravel Categorizable منتشر کردم. این پکیج کاملا با نسخه ۶ لاراول سازگار است و با بهره گیری از روابط چندریختی (Polymorphism) این امکان را به ما میدهد که: هر مدلی که خواستیم را دسته بندی کنیم. به عبارت دیگر در یک اپلیکیشن لاراولی میتوانیم پستها، محصولات، ویدیوها و هر تعداد مدل دیگر که نیاز داریم را براحتی دسته بندی کنیم; با این پکیج همچنین ساخت، به روزرسانی و حذف دسته بندیها به راحتی قابل انجام است.
composer require alibayat/laravel-categorizable
php artisan vendor:publish --provider="AliBayat\LaravelCategorizable\CategorizableServiceProvider"
php artisan migrate
تنها کافیست از تریت پکیح در مدل مورد نظر استفاده کنیم:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use AliBayat\LaravelCategorizable\Categorizable;
class Post extends Model
{
use Categorizable;
}
به همین سادگی ما قابلیت دستهبندی شدن رو به مدل Post اضافه کردیم. با این کار یک سری متد ها که مربوط به این فیچر هستند به مدل ما اضافه میشه
برای نمایش متدها، نیاز به ساخت چند دستهبندی داریم. در زیر نحوه ساخت و حذف دستهبندی ها را به علاوه ساخت دستهبندی ها به حالت والد و فرزند (دستهبندی های تو در تو (Nested)) مرور میکنیم:
<?php
use AliBayat\LaravelCategorizable\Category;
// create "BackEnd" category
Category::create([
'name' => 'BackEnd'
]);
// create "PHP" category
Category::create([
'name' => 'PHP'
]);
// create "FrontEnd" category
Category::create([
'name' => 'FrontEnd'
]);
// create "Test" Category (alternative way)
$test = new Category();
$test->name = 'Test';
$test->save();
// assign "PHP" as a child of "BackEnd" category
$parent = Category::findByName('BackEnd');
$child = Category::findByName('PHP');
$parent->appendNode($child);
// delete "Test" Category
$testObj = Category::findByName('Test');
$testObj->delete();
حال که دستهبندی ها را ساختیم، چند متغیر را مقداردهی میکنیم و سپس عملکرد متد ها را بررسی میکنیم:
<?php
use App\Post;
use AliBayat\LaravelCategorizable\Category;
$post = Post::first();
// ۳ different ways of getting a category's instance
$backendCategory = Category::findById(۱); // 'BackEnd'
$phpCategory = Category::findByName('PHP'); // 'PHP'
$frontendCategory = Category::find(۳); // 'FrontEnd'
حال برای...
$post->attachCategory($phpCategory);
$post->detachCategory($phpCategory);
$post->syncCategories([
$phpCategory,
$backendCategory
]);
$post->syncCategories([]);
$post->hasCategory($phpCategory);
$post->hasCategory([
$phpCategory,
$backendCategory
]);
// return boolean
$post->categoriesList();
// return array [id => name]
$categoryPosts = Category::find(۱)
->entries(Post::class)
->get();
// return collection
مستندات پکیج در ریپازیتوری گیتهاب موجود است:
https://github.com/AliBayat/Laravel-Categorizable
در صورت پیدا کردن هر گونه باگ میتونید در قسمت Issues گیت و یا در این گفتگو اون رو عنوان کنید.
@MAJIDKALI
بله در حال حاظر اسلاگ ها اتومات ساخته میشند.. در نسخه بعد پکیج یه سری متدها براش در نظر گرفتم
اما پکیج spatie/laravel-sluggable قابل سفارشی سازی هست
اگر متد generateSlugsFrom رو بررسی کنی، این متد قابلیت پاس دادن کال بک هم داره
و بدون تغییر در سورس کد پکیج میشه این متد رو داخل مدل قرار داد و هر جور که دوست داری اسلاگ رو بسازی
@ali.bayat
بله من تغییر توی متد یا فیلد رو نمی خواهم ایجاد کنم فقط می خواهم اسلاگ ایجاد شده به صورت فارسی ایجاد بشه
در حالی که حالا به صورت زیر هست
درود
اولین نسخه stable پکیج منتشر شد و مشکل ساخت اسلاگ های فارسی هم درش رفع شده
کافیه نسخه پکیج رو به روز کنید:
composer update alibayat/laravel-categorizable
درود به آقای بیات
همین الان نصب کردم و دارم استفاده میکنم این پکیج واقعا لازم میشه توی همه پروژه ها
سلام. @ali.bayat . امیدوارم حالتون عالی باشه.
من از نکست جی اس برای طراحی سایت استفاده میکنم.
توی همین بحث دسته های چند لایه مشکل دارم. میشه لطفا کمک کنین؟
من یه فروشگاه دارم طراحی میکنم و یه مدل کتگوری ایجاد کردم. یه مدل ساب کتگوری. پروداکت ها همه میان زیرمجموعه اینا.
مدل کتگوری که دسته اصلی هست.
مدل ساب کتگوری هم دسته زیرمجموعه هست که آیدی دسته parent توش گذاشته شده.
چطور باید سیستم چند لایه رو پیاده کرد که بتونم تا بی نهایت دسته رو داشته باشم؟
در واقع اگه بخوام با همین سیستم parent پیاده سازیش کنم، زمان فراخوانی مشکل پیش میاد. چرا؟
مثلا اگه بخوام لیست همه دسته ها رو بگیرم، اول باید دسته های اصلی رو پیاده کنم که سادهست.
بعد باید یه find بزنم که کل دسته هایی که parent شون، دسته های اصلی هست رو پیدا بکنه.
بعد دوباره همین کار رو باید برای لایه دوم انجام بدم.
بعد سوم و....
راه درستش چیه؟
ممنون میشم راهنمایی کنین
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟