1 <?php namespace BookStack\Entities;
3 use BookStack\Uploads\Attachment;
4 use Illuminate\Database\Eloquent\Builder;
5 use Illuminate\Database\Eloquent\Collection;
6 use Illuminate\Database\Eloquent\Relations\BelongsTo;
7 use Illuminate\Database\Eloquent\Relations\HasMany;
12 * @property int $chapter_id
13 * @property string $html
14 * @property string $markdown
15 * @property string $text
16 * @property bool $template
17 * @property bool $draft
18 * @property int $revision_count
19 * @property Chapter $chapter
20 * @property Collection $attachments
22 class Page extends BookChild
24 protected $fillable = ['name', 'html', 'priority', 'markdown'];
26 protected $simpleAttributes = ['name', 'id', 'slug'];
28 public $textField = 'text';
31 * Get the entities that are visible to the current user.
33 public function scopeVisible(Builder $query)
35 $query = Permissions::enforceDraftVisiblityOnQuery($query);
36 return parent::scopeVisible($query);
40 * Converts this page into a simplified array.
43 public function toSimpleArray()
45 $array = array_intersect_key($this->toArray(), array_flip($this->simpleAttributes));
46 $array['url'] = $this->getUrl();
53 public function parent(): Entity
55 return $this->chapter_id ? $this->chapter : $this->book;
59 * Get the chapter that this page is in, If applicable.
62 public function chapter()
64 return $this->belongsTo(Chapter::class);
68 * Check if this page has a chapter.
71 public function hasChapter()
73 return $this->chapter()->count() > 0;
77 * Get the associated page revisions, ordered by created date.
80 public function revisions()
82 return $this->hasMany(PageRevision::class)->where('type', '=', 'version')->orderBy('created_at', 'desc')->orderBy('id', 'desc');
86 * Get the attachments assigned to this page.
89 public function attachments()
91 return $this->hasMany(Attachment::class, 'uploaded_to')->orderBy('order', 'asc');
95 * Get the url for this page.
96 * @param string|bool $path
99 public function getUrl($path = false)
101 $bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
102 $midText = $this->draft ? '/draft/' : '/page/';
103 $idComponent = $this->draft ? $this->id : urlencode($this->slug);
105 $url = '/books/' . urlencode($bookSlug) . $midText . $idComponent;
106 if ($path !== false) {
107 $url .= '/' . trim($path, '/');
114 * Get the current revision for the page if existing
115 * @return PageRevision|null
117 public function getCurrentRevision()
119 return $this->revisions()->first();