]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/PageController.php
Expanded chapters interface and improved book/page deletion
[bookstack] / app / Http / Controllers / PageController.php
1 <?php
2
3 namespace Oxbow\Http\Controllers;
4
5 use Illuminate\Http\Request;
6
7 use Illuminate\Support\Str;
8 use Oxbow\Http\Requests;
9 use Oxbow\Repos\BookRepo;
10 use Oxbow\Repos\PageRepo;
11
12 class PageController extends Controller
13 {
14
15     protected $pageRepo;
16     protected $bookRepo;
17
18     /**
19      * PageController constructor.
20      * @param $pageRepo
21      * @param $bookRepo
22      */
23     public function __construct(PageRepo $pageRepo, BookRepo $bookRepo)
24     {
25         $this->pageRepo = $pageRepo;
26         $this->bookRepo = $bookRepo;
27     }
28
29
30     /**
31      * Display a listing of the resource.
32      *
33      * @return Response
34      */
35     public function index()
36     {
37         //
38     }
39
40     /**
41      * Show the form for creating a new resource.
42      *
43      * @param $bookSlug
44      * @param bool $pageSlug
45      * @return Response
46      */
47     public function create($bookSlug, $pageSlug = false)
48     {
49         $book = $this->bookRepo->getBySlug($bookSlug);
50         $page = $pageSlug ? $this->pageRepo->getBySlug($pageSlug, $book->id) : false;
51         return view('pages/create', ['book' => $book, 'parentPage' => $page]);
52     }
53
54     /**
55      * Store a newly created resource in storage.
56      *
57      * @param  Request $request
58      * @param $bookSlug
59      * @return Response
60      */
61     public function store(Request $request, $bookSlug)
62     {
63         $this->validate($request, [
64             'name' => 'required|string|max:255',
65             'html' => 'required|string',
66             'parent' => 'integer|exists:pages,id'
67         ]);
68         $book = $this->bookRepo->getBySlug($bookSlug);
69         $page = $this->pageRepo->newFromInput($request->all());
70         $slug = Str::slug($page->name);
71         while($this->pageRepo->countBySlug($slug, $book->id) > 0) {
72             $slug .= '1';
73         }
74         $page->slug = $slug;
75         $page->priority = $this->bookRepo->getNewPriority($book);
76
77         if($request->has('parent')) {
78             $page->page_id = $request->get('parent');
79         }
80
81         $page->book_id = $book->id;
82         $page->text = strip_tags($page->html);
83         $page->save();
84         return redirect($page->getUrl());
85     }
86
87     /**
88      * Display the specified resource.
89      *
90      * @param $bookSlug
91      * @param $pageSlug
92      * @return Response
93      */
94     public function show($bookSlug, $pageSlug)
95     {
96         $book = $this->bookRepo->getBySlug($bookSlug);
97         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
98         $breadCrumbs = $this->pageRepo->getBreadCrumbs($page);
99         //dd($sidebarBookTree);
100         return view('pages/show', ['page' => $page, 'breadCrumbs' => $breadCrumbs, 'book' => $book]);
101     }
102
103     /**
104      * Show the form for editing the specified resource.
105      *
106      * @param $bookSlug
107      * @param $pageSlug
108      * @return Response
109      */
110     public function edit($bookSlug, $pageSlug)
111     {
112         $book = $this->bookRepo->getBySlug($bookSlug);
113         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
114         return view('pages/edit', ['page' => $page]);
115     }
116
117     /**
118      * Update the specified resource in storage.
119      *
120      * @param  Request $request
121      * @param $bookSlug
122      * @param $pageSlug
123      * @return Response
124      */
125     public function update(Request $request, $bookSlug, $pageSlug)
126     {
127         $book = $this->bookRepo->getBySlug($bookSlug);
128         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
129         $page->fill($request->all());
130         $slug = Str::slug($page->name);
131         while($this->pageRepo->countBySlug($slug, $book->id) > 0 && $slug != $pageSlug) {
132             $slug .= '1';
133         }
134         $page->text = strip_tags($page->html);
135         $page->save();
136         return redirect($page->getUrl());
137     }
138
139     /**
140      * Redirect from a special link url which
141      * uses the page id rather than the name.
142      * @param $pageId
143      * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
144      */
145     public function redirectFromLink($pageId)
146     {
147         $page = $this->pageRepo->getById($pageId);
148         return redirect($page->getUrl());
149     }
150
151     /**
152      * Search all available pages, Across all books.
153      * @param Request $request
154      * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
155      */
156     public function searchAll(Request $request)
157     {
158         $searchTerm = $request->get('term');
159         if(empty($searchTerm)) return redirect()->back();
160
161         $pages = $this->pageRepo->getBySearch($searchTerm);
162         return view('pages/search-results', ['pages' => $pages, 'searchTerm' => $searchTerm]);
163     }
164
165     /**
166      * Shows the view which allows pages to be re-ordered and sorted.
167      * @param $bookSlug
168      * @return \Illuminate\View\View
169      */
170     public function sortPages($bookSlug)
171     {
172         $book = $this->bookRepo->getBySlug($bookSlug);
173         $tree = $this->bookRepo->getTree($book);
174         return view('pages/sort', ['book' => $book, 'tree' => $tree]);
175     }
176
177     public function savePageSort($bookSlug, Request $request)
178     {
179         $book = $this->bookRepo->getBySlug($bookSlug);
180         if(!$request->has('sort-tree')) {
181             return redirect($book->getUrl());
182         }
183
184         $sortMap = json_decode($request->get('sort-tree'));
185         $this->pageRepo->applySortMap($sortMap, $book->id);
186         return redirect($book->getUrl());
187     }
188
189     public function showDelete($bookSlug, $pageSlug)
190     {
191         $book = $this->bookRepo->getBySlug($bookSlug);
192         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
193         return view('pages/delete', ['book' => $book, 'page' => $page]);
194     }
195
196     /**
197      * Remove the specified resource from storage.
198      *
199      * @param $bookSlug
200      * @param $pageSlug
201      * @return Response
202      * @internal param int $id
203      */
204     public function destroy($bookSlug, $pageSlug)
205     {
206         $book = $this->bookRepo->getBySlug($bookSlug);
207         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
208         $page->delete();
209         return redirect($book->getUrl());
210     }
211 }