laravel-categories
laravel-categories copied to clipboard
HasTranslatableSlug does not work
Hi, I couldn't get the translatable slug to work with this module because the Category model uses the trait HasSlug and from the docs of https://github.com/spatie/laravel-sluggable you need to use one or the other so extending Category would not work.
For now I had to create a copy for the Category Model and create a new trait for HasTranslatableSlug.
I'm not sure if a config setting could be used use one trait over the other or if just using translatable trait makes more sense in the end?
HasTranslatableSlug Trait
<?php
declare(strict_types=1);
namespace App\Traits;
use Illuminate\Database\Eloquent\Model;
use Spatie\Sluggable\HasTranslatableSlug as BaseHasTranslatableSlug;
trait HasTranslatableSlug
{
use BaseHasTranslatableSlug;
/**
* Boot the trait.
*/
protected static function bootHasTranslatableSlug()
{
// Auto generate slugs early before validation
static::validating(function (Model $model) {
if ($model->exists && $model->getSlugOptions()->generateSlugsOnUpdate) {
$model->generateSlugOnUpdate();
} elseif (! $model->exists && $model->getSlugOptions()->generateSlugsOnCreate) {
$model->generateSlugOnCreate();
}
});
}
}
Category Model
<?php
declare(strict_types=1);
namespace App\Models;
use Kalnoy\Nestedset\NestedSet;
use Kalnoy\Nestedset\NodeTrait;
use Spatie\Sluggable\SlugOptions;
use App\Traits\HasTranslatableSlug;
use Illuminate\Database\Eloquent\Model;
use Rinvex\Support\Traits\HasTranslations;
use Rinvex\Support\Traits\ValidatingTrait;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
/**
* Rinvex\Categories\Models\Category.
*
* @property int $id
* @property string $slug
* @property array $name
* @property array $description
* @property int $_lft
* @property int $_rgt
* @property int $parent_id
* @property \Carbon\Carbon|null $created_at
* @property \Carbon\Carbon|null $updated_at
* @property \Carbon\Carbon|null $deleted_at
* @property-read \Kalnoy\Nestedset\Collection|\Rinvex\Categories\Models\Category[] $children
* @property-read \Rinvex\Categories\Models\Category|null $parent
*
* @method static \Illuminate\Database\Eloquent\Builder|\Rinvex\Categories\Models\Category whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\Rinvex\Categories\Models\Category whereDeletedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\Rinvex\Categories\Models\Category whereDescription($value)
* @method static \Illuminate\Database\Eloquent\Builder|\Rinvex\Categories\Models\Category whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\Rinvex\Categories\Models\Category whereLft($value)
* @method static \Illuminate\Database\Eloquent\Builder|\Rinvex\Categories\Models\Category whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|\Rinvex\Categories\Models\Category whereParentId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\Rinvex\Categories\Models\Category whereRgt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\Rinvex\Categories\Models\Category whereSlug($value)
* @method static \Illuminate\Database\Eloquent\Builder|\Rinvex\Categories\Models\Category whereUpdatedAt($value)
* @mixin \Eloquent
*/
class Category extends Model
{
use HasTranslatableSlug;
use NodeTrait;
use SoftDeletes;
use HasTranslations;
use ValidatingTrait;
/**
* {@inheritdoc}
*/
protected $fillable = [
'slug',
'name',
'description',
NestedSet::LFT,
NestedSet::RGT,
NestedSet::PARENT_ID,
];
/**
* {@inheritdoc}
*/
protected $casts = [
'slug' => 'array',
NestedSet::LFT => 'integer',
NestedSet::RGT => 'integer',
NestedSet::PARENT_ID => 'integer',
'deleted_at' => 'datetime',
];
/**
* {@inheritdoc}
*/
protected $observables = [
'validating',
'validated',
];
/**
* The attributes that are translatable.
*
* @var array
*/
public $translatable = [
'name',
'description',
'slug'
];
/**
* The default rules that the model will validate against.
*
* @var array
*/
protected $rules = [];
/**
* Whether the model should throw a
* ValidationException if it fails validation.
*
* @var bool
*/
protected $throwValidationExceptions = true;
/**
* Create a new Eloquent model instance.
*
* @param array $attributes
*/
public function __construct(array $attributes = [])
{
$this->setTable(config('rinvex.categories.tables.categories'));
$this->setRules([
'name' => 'required|string|strip_tags|max:150',
'description' => 'nullable|string|max:32768',
'slug' => 'required|alpha_dash|max:150|unique:'.config('rinvex.categories.tables.categories').',slug',
NestedSet::LFT => 'sometimes|required|integer',
NestedSet::RGT => 'sometimes|required|integer',
NestedSet::PARENT_ID => 'nullable|integer',
]);
parent::__construct($attributes);
}
/**
* Get all attached models of the given class to the category.
*
* @param string $class
*
* @return \Illuminate\Database\Eloquent\Relations\MorphToMany
*/
public function entries(string $class): MorphToMany
{
return $this->morphedByMany($class, 'categorizable', config('rinvex.categories.tables.categorizables'), 'category_id', 'categorizable_id', 'id', 'id');
}
/**
* Get the options for generating the slug.
*
* @return \Spatie\Sluggable\SlugOptions
*/
public function getSlugOptions(): SlugOptions
{
return SlugOptions::create()
->doNotGenerateSlugsOnUpdate()
->generateSlugsFrom('name')
->saveSlugsTo('slug');
}
}