Files
fotospiel-app/app/Models/BlogPost.php
Codex Agent 446eb15c6b
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled
Fix blog post image upload storage
2026-01-22 15:03:05 +01:00

112 lines
3.0 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use League\CommonMark\Environment\Environment;
use League\CommonMark\Extension\Autolink\AutolinkExtension;
use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension;
use League\CommonMark\Extension\Strikethrough\StrikethroughExtension;
use League\CommonMark\Extension\Table\TableExtension;
use League\CommonMark\Extension\TaskList\TaskListExtension;
use League\CommonMark\MarkdownConverter;
use Spatie\Translatable\HasTranslations;
class BlogPost extends Model
{
use HasFactory, HasTranslations, SoftDeletes;
protected $table = 'blog_posts';
protected $translatable = [
'title',
'excerpt',
'content',
'meta_title',
'meta_description',
];
protected $fillable = [
'blog_category_id',
'slug',
'banner',
'published_at',
'is_published',
'title',
'content',
'excerpt',
'meta_title',
'meta_description',
'translations',
];
protected $casts = [
'published_at' => 'date',
'is_published' => 'boolean',
];
protected $appends = [
'banner_url',
'content_html',
];
public function bannerUrl(): Attribute
{
return Attribute::get(function () {
if (! $this->banner) {
return '';
}
$path = ltrim($this->banner, '/');
if (str_starts_with($path, 'storage/')) {
$path = substr($path, strlen('storage/'));
}
return \Storage::disk('public')->url($path);
});
}
public function contentHtml(): Attribute
{
return Attribute::get(function () {
$markdown = $this->getTranslation('content', app()->getLocale());
$environment = new Environment;
$environment->addExtension(new CommonMarkCoreExtension);
$environment->addExtension(new TableExtension);
$environment->addExtension(new AutolinkExtension);
$environment->addExtension(new StrikethroughExtension);
$environment->addExtension(new TaskListExtension);
$converter = new MarkdownConverter($environment);
return (string) $converter->convert($markdown);
});
}
public function scopePublished(Builder $query)
{
return $query->whereNotNull('published_at')->where('is_published', true);
}
public function scopeDraft(Builder $query)
{
return $query->whereNull('published_at');
}
public function category(): BelongsTo
{
return $this->belongsTo(BlogCategory::class, 'blog_category_id');
}
public function author(): BelongsTo
{
return $this->belongsTo(BlogAuthor::class, 'blog_author_id');
}
}