-<?php namespace BookStack\Entities;
+<?php
+namespace BookStack\Entities\Models;
+
+use BookStack\Entities\Tools\PageContent;
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 Permissions;
/**
- * 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 Chapter $chapter
+ * 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 Chapter $chapter
* @property Collection $attachments
*/
class Page extends BookChild
{
- protected $fillable = ['name', 'priority', 'markdown'];
+ 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'];
- protected $simpleAttributes = ['name', 'id', 'slug'];
+ protected $fillable = ['name', 'priority'];
public $textField = 'text';
- protected $hidden = ['html', 'markdown', 'text', 'restricted', 'pivot'];
+ protected $hidden = ['html', 'markdown', 'text', 'restricted', 'pivot', 'deleted_at'];
+
+ protected $casts = [
+ 'draft' => 'boolean',
+ 'template' => 'boolean',
+ ];
/**
* Get the entities that are visible to the current user.
*/
- public function scopeVisible(Builder $query)
+ public function scopeVisible(Builder $query): Builder
{
- $query = Permissions::enforceDraftVisiblityOnQuery($query);
- return parent::scopeVisible($query);
- }
+ $query = Permissions::enforceDraftVisibilityOnQuery($query);
- /**
- * Converts this page into a simplified array.
- * @return mixed
- */
- public function toSimpleArray()
- {
- $array = array_intersect_key($this->toArray(), array_flip($this->simpleAttributes));
- $array['url'] = $this->getUrl();
- return $array;
+ return parent::scopeVisible($query);
}
/**
* Get the chapter that this page is in, If applicable.
+ *
* @return BelongsTo
*/
public function chapter()
/**
* Check if this page has a chapter.
+ *
* @return bool
*/
public function hasChapter()
/**
* Get the associated page revisions, ordered by created date.
- * @return mixed
+ * Only provides actual saved page revision instances, Not drafts.
*/
- public function revisions()
+ public function revisions(): HasMany
{
- return $this->hasMany(PageRevision::class)->where('type', '=', 'version')->orderBy('created_at', 'desc')->orderBy('id', 'desc');
+ return $this->allRevisions()
+ ->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
+ {
+ return $this->hasMany(PageRevision::class);
}
/**
* Get the attachments assigned to this page.
+ *
* @return HasMany
*/
public function attachments()
}
/**
- * Get the url for this page.
- * @param string|bool $path
- * @return string
+ * Get the url of this page.
*/
- public function getUrl($path = false)
+ public function getUrl(string $path = ''): string
{
- $bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
- $midText = $this->draft ? '/draft/' : '/page/';
- $idComponent = $this->draft ? $this->id : urlencode($this->slug);
+ $parts = [
+ 'books',
+ urlencode($this->book_slug ?? $this->book->slug),
+ $this->draft ? 'draft' : 'page',
+ $this->draft ? $this->id : urlencode($this->slug),
+ trim($path, '/'),
+ ];
- $url = '/books/' . urlencode($bookSlug) . $midText . $idComponent;
- if ($path !== false) {
- $url .= '/' . trim($path, '/');
- }
-
- return url($url);
+ return url('/' . implode('/', $parts));
}
/**
- * Get the current revision for the page if existing
+ * Get the current revision for the page if existing.
+ *
* @return PageRevision|null
*/
public function getCurrentRevision()
{
return $this->revisions()->first();
}
+
+ /**
+ * 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();
+
+ return $refreshed;
+ }
}