mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-06-04 00:44:41 +08:00
Got the tree view working
This commit is contained in:
@ -78,7 +78,9 @@ class BookController extends Controller
|
||||
public function show($slug)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($slug);
|
||||
return view('books/show', ['book' => $book]);
|
||||
$pageTree = $this->pageRepo->getTreeByBookId($book->id);
|
||||
// dd($pageTree);
|
||||
return view('books/show', ['book' => $book, 'pageTree' => $pageTree]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -41,12 +41,14 @@ class PageController extends Controller
|
||||
* Show the form for creating a new resource.
|
||||
*
|
||||
* @param $bookSlug
|
||||
* @param bool $pageSlug
|
||||
* @return Response
|
||||
*/
|
||||
public function create($bookSlug)
|
||||
public function create($bookSlug, $pageSlug = false)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
return view('pages/create', ['book' => $book]);
|
||||
$page = $pageSlug ? $this->pageRepo->getBySlug($pageSlug, $book->id) : false;
|
||||
return view('pages/create', ['book' => $book, 'parentPage' => $page]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -61,7 +63,8 @@ class PageController extends Controller
|
||||
$this->validate($request, [
|
||||
'name' => 'required|string|max:255',
|
||||
'html' => 'required|string',
|
||||
'priority' => 'integer'
|
||||
'priority' => 'integer',
|
||||
'parent' => 'integer|exists:pages,id'
|
||||
]);
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->newFromInput($request->all());
|
||||
@ -70,6 +73,11 @@ class PageController extends Controller
|
||||
$slug .= '1';
|
||||
}
|
||||
$page->slug =$slug;
|
||||
|
||||
if($request->has('parent')) {
|
||||
$page->page_id = $request->get('parent');
|
||||
}
|
||||
|
||||
$page->book_id = $book->id;
|
||||
$page->text = strip_tags($page->html);
|
||||
$page->save();
|
||||
@ -87,7 +95,8 @@ class PageController extends Controller
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
return view('pages/show', ['page' => $page]);
|
||||
$breadCrumbs = $this->pageRepo->getBreadCrumbs($page);
|
||||
return view('pages/show', ['page' => $page, 'breadCrumbs' => $breadCrumbs, 'book' => $book]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -25,6 +25,7 @@ Route::group(['prefix' => 'books'], function() {
|
||||
Route::get('/{bookSlug}/page/create', 'PageController@create');
|
||||
Route::post('/{bookSlug}/page', 'PageController@store');
|
||||
Route::get('/{bookSlug}/{pageSlug}', 'PageController@show');
|
||||
Route::get('/{bookSlug}/{pageSlug}/create', 'PageController@create');
|
||||
Route::get('/{bookSlug}/{pageSlug}/edit', 'PageController@edit');
|
||||
Route::put('/{bookSlug}/{pageSlug}', 'PageController@update');
|
||||
});
|
||||
|
20
app/Page.php
20
app/Page.php
@ -8,13 +8,33 @@ class Page extends Model
|
||||
{
|
||||
protected $fillable = ['name', 'html', 'priority'];
|
||||
|
||||
protected $simpleAttributes = ['name', 'id', 'slug'];
|
||||
|
||||
public function toSimpleArray()
|
||||
{
|
||||
$array = array_intersect_key($this->toArray(), array_flip($this->simpleAttributes));
|
||||
$array['url'] = $this->getUrl();
|
||||
return $array;
|
||||
}
|
||||
|
||||
public function book()
|
||||
{
|
||||
return $this->belongsTo('Oxbow\Book');
|
||||
}
|
||||
|
||||
public function children()
|
||||
{
|
||||
return $this->hasMany('Oxbow\Page');
|
||||
}
|
||||
|
||||
public function parent()
|
||||
{
|
||||
return $this->belongsTo('Oxbow\Page', 'page_id');
|
||||
}
|
||||
|
||||
public function getUrl()
|
||||
{
|
||||
return '/books/' . $this->book->slug . '/' . $this->slug;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -53,4 +53,11 @@ class BookRepo
|
||||
$book->delete();
|
||||
}
|
||||
|
||||
public function getTree($book)
|
||||
{
|
||||
$tree = $book->toArray();
|
||||
$tree['pages'] = $this->pageRepo->getTreeByBookId($book->id);
|
||||
return $tree;
|
||||
}
|
||||
|
||||
}
|
@ -59,4 +59,62 @@ class PageRepo
|
||||
return $query->get();
|
||||
}
|
||||
|
||||
public function getBreadCrumbs($page)
|
||||
{
|
||||
$tree = [];
|
||||
$cPage = $page;
|
||||
while($cPage->parent && $cPage->parent->id !== 0) {
|
||||
$cPage = $cPage->parent;
|
||||
$tree[] = $cPage;
|
||||
}
|
||||
return count($tree) > 0 ? array_reverse($tree) : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a tree of child pages, Nested by their
|
||||
* set parent pages.
|
||||
* @param $bookId
|
||||
* @param bool $currentPageId
|
||||
* @return array
|
||||
*/
|
||||
public function getTreeByBookId($bookId, $currentPageId = false)
|
||||
{
|
||||
$topLevelPages = $this->getTopLevelPages($bookId);
|
||||
$pageTree = [];
|
||||
|
||||
foreach($topLevelPages as $key => $topPage) {
|
||||
$pageTree[$key] = $this->toArrayTree($topPage, $currentPageId);
|
||||
}
|
||||
|
||||
return $pageTree;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a page tree array with the supplied page
|
||||
* as the parent of the tree.
|
||||
* @param $page
|
||||
* @param bool $currentPageId
|
||||
* @return mixed
|
||||
*/
|
||||
private function toArrayTree($page, $currentPageId = false)
|
||||
{
|
||||
$cPage = $page->toSimpleArray();
|
||||
$cPage['current'] = ($currentPageId !== false && $cPage['id'] === $currentPageId);
|
||||
$cPage['pages'] = [];
|
||||
foreach($page->children as $key => $childPage) {
|
||||
$cPage['pages'][$key] = $this->toArrayTree($childPage);
|
||||
}
|
||||
$cPage['hasChildren'] = count($cPage['pages']) > 0;
|
||||
return $cPage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the pages at the top of the page hierarchy.
|
||||
* @param $bookId
|
||||
*/
|
||||
private function getTopLevelPages($bookId)
|
||||
{
|
||||
return $this->page->where('book_id', '=', $bookId)->where('page_id', '=', 0)->get();
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user