جشنواره عیدانه راکت | عضویت ویژه راکت برای آخرین بار | افزایش قیمتها از سال جدید | و ...
مشاهده اطلاعات بیشتر...درود دوستان
من پس از بارها پیاده سازی فیچِر دسته بندیها در پروژه های مختلف، به این نتیجه رسیدم که سورس کد این فیچر را به یک پکیج لاراولی تبدیل کنم.
بنده اخیرا پکیجی به نام 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 گیت و یا در این گفتگو اون رو عنوان کنید.
سلام ممنون از این پکیج عالی اگر بخوام هم وبلاگ هم محصولات رو دسته بندی کنم به طوری که موقع ساخت مطلب یا محصول دسته بندی های انتخابی فقط مخصوص به همون مدل باشه چطور اینهارو از هم متمایز کنم؟ خودم یه فیلد type به جدول اضافه کنم؟
بدون اینکه چیزی اضافه کنید .. از هم متمایز هستند.. تنها اسم های دسته بندی ها ممکنه یکسان باشه..
برای دریافت تمام موارد یک دسته بندی:
$categoryPosts = Category::find(1)
->entries(Post::class)
->get();
سلام
اگر بخوام چند نوع دسته بندی داشته باشم، روش کار چیه ؟ و چه تغییراتی باید بدم ؟
یعنی یه نوع دسته بندی برای مقالات، محصولات و ... نیاز دارم.
@ali.bayat
فکرکنم منظورمو متوجه نشدید، برای هر کدام از مدل ها ( مثلا مقالات، محصولات و ... )، یه دسته بندی جداگانه نیاز دارم
نسخه جدید کی ارائه میشه ؟
@ali.bayat
سلام مرسی از پکیج خیلی خوبی که زحمت کشیدید و طراحی کردین،داشتم مستنداتو میدیدم سوال شد اگه بخوایم لیست دسته بندی های یک مدل خاص رو بگیریم چکاری باید کرد؟ نه به طریقی که آی دی بدیم که ذکر کردین بگیم دسته بندی هایی که در pivot-table بین دسته بندی و مدل ها هست اون هایی که type مثلا app/article دارند رو بگیر؟ هرچی هست
@ali.bayat
سلام من دارم از پکیج استفاده می کنم حذف دسته ها یک مشکل دارم دقیقا طبق داکومنت انجام میدم اما این ارور رو بعد از حذف دسته بر می گردونه البته توی issue گیت هاب پکیج Kalnoy\Nestedset\ این رو حل کردن چطور میشه این مشکل رو حل کرد
Declaration of Kalnoy\Nestedset\BaseRelation::getRelationQuery(Illuminate\Database\Eloquent\Builder $query, Illuminate\Database\Eloquent\Builder $parent, $columns = Array) should be compatible with Illuminate\Database\Eloquent\Relations\Relation::getRelationQuery() {"userId":1,"exception":"[object] (ErrorException(code: 0): Declaration of Kalnoy\\Nestedset\\BaseRelation::getRelationQuery(Illuminate\\Database\\Eloquent\\Builder $query, Illuminate\\Database\\Eloquent\\Builder $parent, $columns = Array) should be compatible with Illuminate\\Database\\Eloquent\\Relations\\Relation::getRelationQuery() at /home/majid/Documents/development/app/new/online-market/vendor/kalnoy/nestedset/src/BaseRelation.php:121)
@ali.bayat
این کدی هست که من می خواهم یک دسته رو حذف کنم البته اینم بگم که دسته حذف میشه اما این ارور هم بعد از حذف ارسال میشه
$category = Category::findById($id);
$category->delete();
@MAJIDKALI
اکسپشنی که میگیری مربوط به پکیج Nestedset هست
راه حل موقت: میتونی با یه try catch خطا رو مدیریت کنی
من با نسخه های ۶،۷ و ۸ امتحان کردم چنین مشکلی نداشتم، ولی بررسیش میکنم
خیلی ممنون @ali.bayat
من فعلا همون trycatch رو استفاده می کردم اما فکر کنم پکیج Nestedset این رو حل کرده
نسخه ۵ پکیج laravel-nestedset یک مشکل سازگاری با نسخه های جدید لاراول داشت..
پکیج مورد استفاده به آخرین نسخه (۶) آپدیت شد و مشکل پکیج Categorizable هم حل شد.. اگر پکیج رو آپدیت کنی، میتونی بدون اون try catch هم ازش استفاده کنی.
سپاس بابت اطلاع رسانی
سلام چطور میشه مشکل اسلاگ فارسی رو برای دسته بندی ها حل کرد از spatie/laravel-sluggable برای ایجاد slug استفاده کردید اما برای فارسی کردن اسلاگ هیچ اپشن در نظر نگرفتید
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟