]> BookStack Code Mirror - bookstack/blob - app/Entities/Page.php
Checked over recycle bin parent/child flows
[bookstack] / app / Entities / Page.php
1 <?php namespace BookStack\Entities;
2
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;
8 use Permissions;
9
10 /**
11  * Class Page
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
21  */
22 class Page extends BookChild
23 {
24     protected $fillable = ['name', 'priority', 'markdown'];
25
26     protected $simpleAttributes = ['name', 'id', 'slug'];
27
28     public $textField = 'text';
29
30     protected $hidden = ['html', 'markdown', 'text', 'restricted', 'pivot'];
31
32     /**
33      * Get the entities that are visible to the current user.
34      */
35     public function scopeVisible(Builder $query)
36     {
37         $query = Permissions::enforceDraftVisiblityOnQuery($query);
38         return parent::scopeVisible($query);
39     }
40
41     /**
42      * Converts this page into a simplified array.
43      * @return mixed
44      */
45     public function toSimpleArray()
46     {
47         $array = array_intersect_key($this->toArray(), array_flip($this->simpleAttributes));
48         $array['url'] = $this->getUrl();
49         return $array;
50     }
51
52     /**
53      * Get the chapter that this page is in, If applicable.
54      * @return BelongsTo
55      */
56     public function chapter()
57     {
58         return $this->belongsTo(Chapter::class);
59     }
60
61     /**
62      * Check if this page has a chapter.
63      * @return bool
64      */
65     public function hasChapter()
66     {
67         return $this->chapter()->count() > 0;
68     }
69
70     /**
71      * Get the associated page revisions, ordered by created date.
72      * @return mixed
73      */
74     public function revisions()
75     {
76         return $this->hasMany(PageRevision::class)->where('type', '=', 'version')->orderBy('created_at', 'desc')->orderBy('id', 'desc');
77     }
78
79     /**
80      * Get the attachments assigned to this page.
81      * @return HasMany
82      */
83     public function attachments()
84     {
85         return $this->hasMany(Attachment::class, 'uploaded_to')->orderBy('order', 'asc');
86     }
87
88     /**
89      * Get the url for this page.
90      * @param string|bool $path
91      * @return string
92      */
93     public function getUrl($path = false)
94     {
95         $bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
96         $midText = $this->draft ? '/draft/' : '/page/';
97         $idComponent = $this->draft ? $this->id : urlencode($this->slug);
98
99         $url = '/books/' . urlencode($bookSlug) . $midText . $idComponent;
100         if ($path !== false) {
101             $url .= '/' . trim($path, '/');
102         }
103
104         return url($url);
105     }
106
107     /**
108      * Get the current revision for the page if existing
109      * @return PageRevision|null
110      */
111     public function getCurrentRevision()
112     {
113         return $this->revisions()->first();
114     }
115 }