]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/PageController.php
Addded sorting logic to pages
[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             'priority' => 'integer',
67             'parent' => 'integer|exists:pages,id'
68         ]);
69         $book = $this->bookRepo->getBySlug($bookSlug);
70         $page = $this->pageRepo->newFromInput($request->all());
71         $slug = Str::slug($page->name);
72         while($this->pageRepo->countBySlug($slug, $book->id) > 0) {
73             $slug .= '1';
74         }
75         $page->slug =$slug;
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         return view('pages/show', ['page' => $page, 'breadCrumbs' => $breadCrumbs, 'book' => $book]);
100     }
101
102     /**
103      * Show the form for editing the specified resource.
104      *
105      * @param $bookSlug
106      * @param $pageSlug
107      * @return Response
108      */
109     public function edit($bookSlug, $pageSlug)
110     {
111         $book = $this->bookRepo->getBySlug($bookSlug);
112         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
113         return view('pages/edit', ['page' => $page]);
114     }
115
116     /**
117      * Update the specified resource in storage.
118      *
119      * @param  Request $request
120      * @param $bookSlug
121      * @param $pageSlug
122      * @return Response
123      */
124     public function update(Request $request, $bookSlug, $pageSlug)
125     {
126         $book = $this->bookRepo->getBySlug($bookSlug);
127         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
128         $page->fill($request->all());
129         $slug = Str::slug($page->name);
130         while($this->pageRepo->countBySlug($slug, $book->id) > 0 && $slug != $pageSlug) {
131             $slug .= '1';
132         }
133         $page->text = strip_tags($page->html);
134         $page->save();
135         return redirect($page->getUrl());
136     }
137
138     /**
139      * Redirect from a special link url which
140      * uses the page id rather than the name.
141      * @param $pageId
142      * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
143      */
144     public function redirectFromLink($pageId)
145     {
146         $page = $this->pageRepo->getById($pageId);
147         return redirect($page->getUrl());
148     }
149
150     /**
151      * Search all available pages, Across all books.
152      * @param Request $request
153      * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
154      */
155     public function searchAll(Request $request)
156     {
157         $searchTerm = $request->get('term');
158         if(empty($searchTerm)) return redirect()->back();
159
160         $pages = $this->pageRepo->getBySearch($searchTerm);
161         return view('pages/search-results', ['pages' => $pages, 'searchTerm' => $searchTerm]);
162     }
163
164     /**
165      * Shows the view which allows pages to be re-ordered and sorted.
166      * @param $bookSlug
167      * @return \Illuminate\View\View
168      */
169     public function sortPages($bookSlug)
170     {
171         $book = $this->bookRepo->getBySlug($bookSlug);
172         $tree = $this->bookRepo->getTree($book);
173         return view('pages/sort', ['book' => $book, 'tree' => $tree]);
174     }
175
176     public function savePageSort($bookSlug, Request $request)
177     {
178         $book = $this->bookRepo->getBySlug($bookSlug);
179         if(!$request->has('sort-tree')) {
180             return redirect($book->getUrl());
181         }
182
183         $sortMap = json_decode($request->get('sort-tree'));
184         $this->pageRepo->applySortMap($sortMap, $book->id);
185         return redirect($book->getUrl());
186     }
187
188     /**
189      * Remove the specified resource from storage.
190      *
191      * @param  int  $id
192      * @return Response
193      */
194     public function destroy($id)
195     {
196         //
197     }
198 }