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