belongsTo(Page::class); } public function poster(): BelongsTo { return $this->belongsTo(Asset::class); } public function author(): BelongsTo { return $this->belongsTo(User::class); } public function sections(): MorphToMany { return $this->objects()->wherePivot('group', '=', 'sections'); } public function sidebars(): MorphToMany { return $this->objects()->wherePivot('group', '=', 'sidebars'); } public function scopeBySlug($query, $slug) { $query->where(['slug' => $slug]); } public function getLinkAttribute(): string { return ($this->page->link ?? '') . "/{$this->slug}"; } public function getParentsAttribute(): Collection { $page = $this->page; $result = collect([$page]); while ($page = $page->parent) $result->push($page); return $result; } public function getParsedTypeAttribute(): array { return ['name' => $this->type, 'title' => PublicationType::TITLES[$this->type] ?? null]; } public function getParsedParamsAttribute() { return json_decode($this->params); } public function getPublishDateRusAttribute(): string { return $this->published_at ? $this->published_at->format('d') . ' ' . $this->published_at->getTranslatedMonthName('Do MMMM') . ' ' . $this->published_at->format('Y') . ' г.' : 'когда-то'; } public function addSection($typeName, $ord = null): ?Model { return $this->createObject($typeName, $ord, 'sections'); } public function addSidebar($typeName = 'page-sidebar', $ord = null): ?Model { return $this->createObject($typeName, $ord, 'sidebars'); } public static function byUrl($url) { if ($url = trim($url, '/ ')) { $slugs = explode('/', $url); $publicationSlug = array_pop($slugs); $pageUrl = implode('/', $slugs); if ($pageUrl) { return ($page = Page::byUrl($pageUrl)) ? $page->publications()->bySlug($publicationSlug)->first() : null; } else return self::bySlug($publicationSlug)->first(); } return null; } }