BookStack/app/Entities/Models/Page.php

149 lines
4.1 KiB
PHP
Raw Normal View History

2021-06-26 23:23:15 +08:00
<?php
namespace BookStack\Entities\Models;
use BookStack\Entities\Tools\PageContent;
use BookStack\Facades\Permissions;
use BookStack\Uploads\Attachment;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
/**
2021-06-26 23:23:15 +08:00
* Class Page.
*
* @property int $chapter_id
* @property string $html
* @property string $markdown
* @property string $text
* @property bool $template
* @property bool $draft
* @property int $revision_count
* @property string $editor
* @property Chapter $chapter
* @property Collection $attachments
* @property Collection $revisions
* @property PageRevision $currentRevision
*/
class Page extends BookChild
2015-07-13 03:01:42 +08:00
{
use HasFactory;
public static $listAttributes = ['name', 'id', 'slug', 'book_id', 'chapter_id', 'draft', 'template', 'text', 'created_at', 'updated_at', 'priority'];
public static $contentAttributes = ['name', 'id', 'slug', 'book_id', 'chapter_id', 'draft', 'template', 'html', 'text', 'created_at', 'updated_at', 'priority'];
2015-07-13 04:31:15 +08:00
protected $fillable = ['name', 'priority'];
2015-07-21 05:05:26 +08:00
public $textField = 'text';
protected $hidden = ['html', 'markdown', 'text', 'restricted', 'pivot', 'deleted_at'];
2020-05-23 07:28:41 +08:00
2020-11-22 22:56:19 +08:00
protected $casts = [
2021-06-26 23:23:15 +08:00
'draft' => 'boolean',
2020-11-22 22:56:19 +08:00
'template' => 'boolean',
];
/**
* Get the entities that are visible to the current user.
*/
public function scopeVisible(Builder $query): Builder
{
$query = Permissions::enforceDraftVisibilityOnQuery($query);
2021-06-26 23:23:15 +08:00
return parent::scopeVisible($query);
}
/**
* Get the chapter that this page is in, If applicable.
2021-06-26 23:23:15 +08:00
*
* @return BelongsTo
*/
public function chapter()
{
return $this->belongsTo(Chapter::class);
}
/**
* Check if this page has a chapter.
*/
public function hasChapter(): bool
{
return $this->chapter()->count() > 0;
}
/**
* Get the associated page revisions, ordered by created date.
* Only provides actual saved page revision instances, Not drafts.
*/
public function revisions(): HasMany
{
return $this->allRevisions()
->where('type', '=', 'version')
->orderBy('created_at', 'desc')
->orderBy('id', 'desc');
}
/**
* Get the current revision for the page if existing.
*
* @return PageRevision|null
*/
public function currentRevision(): HasOne
{
return $this->hasOne(PageRevision::class)
->where('type', '=', 'version')
->orderBy('created_at', 'desc')
->orderBy('id', 'desc');
}
/**
* Get all revision instances assigned to this page.
* Includes all types of revisions.
*/
public function allRevisions(): HasMany
2015-08-09 19:06:52 +08:00
{
return $this->hasMany(PageRevision::class);
2015-08-09 19:06:52 +08:00
}
/**
2016-11-12 22:12:26 +08:00
* Get the attachments assigned to this page.
2021-06-26 23:23:15 +08:00
*
* @return HasMany
*/
2016-11-12 22:12:26 +08:00
public function attachments()
{
2016-11-12 22:12:26 +08:00
return $this->hasMany(Attachment::class, 'uploaded_to')->orderBy('order', 'asc');
}
/**
* Get the url of this page.
*/
2021-11-06 08:32:01 +08:00
public function getUrl(string $path = ''): string
2015-07-13 04:31:15 +08:00
{
$parts = [
'books',
urlencode($this->book_slug ?? $this->book->slug),
$this->draft ? 'draft' : 'page',
$this->draft ? $this->id : urlencode($this->slug),
trim($path, '/'),
];
return url('/' . implode('/', $parts));
}
/**
* Get this page for JSON display.
*/
public function forJsonDisplay(): self
{
$refreshed = $this->refresh()->unsetRelations()->load(['tags', 'createdBy', 'updatedBy', 'ownedBy']);
$refreshed->setHidden(array_diff($refreshed->getHidden(), ['html', 'markdown']));
$refreshed->html = (new PageContent($refreshed))->render();
2021-06-26 23:23:15 +08:00
return $refreshed;
}
2015-07-13 03:01:42 +08:00
}