You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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');
}
}
The text was updated successfully, but these errors were encountered:
seche
changed the title
HasTranslatableSlug
HasTranslatableSlug does not work
Nov 22, 2023
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
Category Model
The text was updated successfully, but these errors were encountered: