This commit is contained in:
Mark Gregory
2026-07-24 11:47:08 +01:00
parent 8c74abfbc6
commit d512840a9a
27 changed files with 304 additions and 6 deletions
+19
View File
@@ -0,0 +1,19 @@
<?php
namespace Modules\Sites\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
final class Site extends Model
{
protected $fillable = ['name','key','status','theme','default_locale','timezone','is_default'];
protected function casts(): array { return ['is_default' => 'boolean']; }
public function domains(): HasMany { return $this->hasMany(SiteDomain::class); }
public function settings(): HasMany { return $this->hasMany(SiteSetting::class); }
public function assignments(): HasMany { return $this->hasMany(SiteContent::class); }
public function scopeActive(Builder $query): Builder { return $query->where('status', 'active'); }
public function setting(string $key, mixed $default = null): mixed
{
$setting = $this->relationLoaded('settings') ? $this->settings->firstWhere('key', $key) : $this->settings()->where('key', $key)->first();
return $setting?->typedValue() ?? $default;
}
}
+13
View File
@@ -0,0 +1,13 @@
<?php
namespace Modules\Sites\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphTo;
final class SiteContent extends Model
{
protected $table = 'site_content';
protected $fillable = ['site_id','content_type','content_id','is_primary'];
protected function casts(): array { return ['is_primary'=>'boolean']; }
public function site(): BelongsTo { return $this->belongsTo(Site::class); }
public function content(): MorphTo { return $this->morphTo(__FUNCTION__, 'content_type', 'content_id'); }
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace Modules\Sites\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
final class SiteDomain extends Model
{
protected $fillable = ['site_id','domain','is_primary','redirect_to_primary','force_https','is_active'];
protected function casts(): array { return ['is_primary'=>'boolean','redirect_to_primary'=>'boolean','force_https'=>'boolean','is_active'=>'boolean']; }
public function site(): BelongsTo { return $this->belongsTo(Site::class); }
}
+18
View File
@@ -0,0 +1,18 @@
<?php
namespace Modules\Sites\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
final class SiteSetting extends Model
{
protected $fillable = ['site_id','group','key','value','type'];
public function site(): BelongsTo { return $this->belongsTo(Site::class); }
public function typedValue(): mixed
{
return match ($this->type) {
'boolean' => filter_var($this->value, FILTER_VALIDATE_BOOLEAN),
'integer' => (int) $this->value,
'json' => json_decode((string) $this->value, true),
default => $this->value,
};
}
}