Added custom meta titles to many pages. Closes #30.

This commit is contained in:
Dan Brown 2015-12-05 14:41:51 +00:00
parent f1c2866fbc
commit c32d70abc4
13 changed files with 56 additions and 11 deletions

View File

@ -97,18 +97,29 @@ abstract class Entity extends Model
*/ */
public static function isA($type) public static function isA($type)
{ {
return static::getName() === strtolower($type); return static::getClassName() === strtolower($type);
} }
/** /**
* Gets the class name. * Gets the class name.
* @return string * @return string
*/ */
public static function getName() public static function getClassName()
{ {
return strtolower(array_slice(explode('\\', static::class), -1, 1)[0]); return strtolower(array_slice(explode('\\', static::class), -1, 1)[0]);
} }
/**
*Gets a limited-length version of the entities name.
* @param int $length
* @return string
*/
public function getShortName($length = 25)
{
if(strlen($this->name) <= $length) return $this->name;
return substr($this->name, 0, $length-3) . '...';
}
/** /**
* Perform a full-text search on this entity. * Perform a full-text search on this entity.
* @param string[] $fieldsToSearch * @param string[] $fieldsToSearch

View File

@ -44,6 +44,7 @@ class BookController extends Controller
$books = $this->bookRepo->getAllPaginated(10); $books = $this->bookRepo->getAllPaginated(10);
$recents = $this->signedIn ? $this->bookRepo->getRecentlyViewed(4, 0) : false; $recents = $this->signedIn ? $this->bookRepo->getRecentlyViewed(4, 0) : false;
$popular = $this->bookRepo->getPopular(4, 0); $popular = $this->bookRepo->getPopular(4, 0);
$this->setPageTitle('Books');
return view('books/index', ['books' => $books, 'recents' => $recents, 'popular' => $popular]); return view('books/index', ['books' => $books, 'recents' => $recents, 'popular' => $popular]);
} }
@ -55,6 +56,7 @@ class BookController extends Controller
public function create() public function create()
{ {
$this->checkPermission('book-create'); $this->checkPermission('book-create');
$this->setPageTitle('Create New Book');
return view('books/create'); return view('books/create');
} }
@ -89,8 +91,9 @@ class BookController extends Controller
public function show($slug) public function show($slug)
{ {
$book = $this->bookRepo->getBySlug($slug); $book = $this->bookRepo->getBySlug($slug);
Views::add($book);
$bookChildren = $this->bookRepo->getChildren($book); $bookChildren = $this->bookRepo->getChildren($book);
Views::add($book);
$this->setPageTitle($book->getShortName());
return view('books/show', ['book' => $book, 'current' => $book, 'bookChildren' => $bookChildren]); return view('books/show', ['book' => $book, 'current' => $book, 'bookChildren' => $bookChildren]);
} }
@ -104,6 +107,7 @@ class BookController extends Controller
{ {
$this->checkPermission('book-update'); $this->checkPermission('book-update');
$book = $this->bookRepo->getBySlug($slug); $book = $this->bookRepo->getBySlug($slug);
$this->setPageTitle('Edit Book ' . $book->getShortName());
return view('books/edit', ['book' => $book, 'current' => $book]); return view('books/edit', ['book' => $book, 'current' => $book]);
} }
@ -139,6 +143,7 @@ class BookController extends Controller
{ {
$this->checkPermission('book-delete'); $this->checkPermission('book-delete');
$book = $this->bookRepo->getBySlug($bookSlug); $book = $this->bookRepo->getBySlug($bookSlug);
$this->setPageTitle('Delete Book ' . $book->getShortName());
return view('books/delete', ['book' => $book, 'current' => $book]); return view('books/delete', ['book' => $book, 'current' => $book]);
} }
@ -153,9 +158,16 @@ class BookController extends Controller
$book = $this->bookRepo->getBySlug($bookSlug); $book = $this->bookRepo->getBySlug($bookSlug);
$bookChildren = $this->bookRepo->getChildren($book); $bookChildren = $this->bookRepo->getChildren($book);
$books = $this->bookRepo->getAll(); $books = $this->bookRepo->getAll();
$this->setPageTitle('Sort Book ' . $book->getShortName());
return view('books/sort', ['book' => $book, 'current' => $book, 'books' => $books, 'bookChildren' => $bookChildren]); return view('books/sort', ['book' => $book, 'current' => $book, 'books' => $books, 'bookChildren' => $bookChildren]);
} }
/**
* Shows the sort box for a single book.
* Used via AJAX when loading in extra books to a sort.
* @param $bookSlug
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getSortItem($bookSlug) public function getSortItem($bookSlug)
{ {
$book = $this->bookRepo->getBySlug($bookSlug); $book = $this->bookRepo->getBySlug($bookSlug);

View File

@ -40,6 +40,7 @@ class ChapterController extends Controller
{ {
$this->checkPermission('chapter-create'); $this->checkPermission('chapter-create');
$book = $this->bookRepo->getBySlug($bookSlug); $book = $this->bookRepo->getBySlug($bookSlug);
$this->setPageTitle('Create New Chapter');
return view('chapters/create', ['book' => $book, 'current' => $book]); return view('chapters/create', ['book' => $book, 'current' => $book]);
} }
@ -79,6 +80,7 @@ class ChapterController extends Controller
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id); $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$sidebarTree = $this->bookRepo->getChildren($book); $sidebarTree = $this->bookRepo->getChildren($book);
Views::add($chapter); Views::add($chapter);
$this->setPageTitle($chapter->getShortName());
return view('chapters/show', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter, 'sidebarTree' => $sidebarTree]); return view('chapters/show', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter, 'sidebarTree' => $sidebarTree]);
} }
@ -93,6 +95,7 @@ class ChapterController extends Controller
$this->checkPermission('chapter-update'); $this->checkPermission('chapter-update');
$book = $this->bookRepo->getBySlug($bookSlug); $book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id); $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->setPageTitle('Edit Chapter' . $chapter->getShortName());
return view('chapters/edit', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]); return view('chapters/edit', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
} }
@ -127,6 +130,7 @@ class ChapterController extends Controller
$this->checkPermission('chapter-delete'); $this->checkPermission('chapter-delete');
$book = $this->bookRepo->getBySlug($bookSlug); $book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id); $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->setPageTitle('Delete Chapter' . $chapter->getShortName());
return view('chapters/delete', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]); return view('chapters/delete', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
} }

View File

@ -42,6 +42,15 @@ abstract class Controller extends BaseController
$this->signedIn = auth()->check(); $this->signedIn = auth()->check();
} }
/**
* Adds the page title into the view.
* @param $title
*/
public function setPageTitle($title)
{
view()->share('pageTitle', $title);
}
/** /**
* Checks for a permission. * Checks for a permission.
* *

View File

@ -46,6 +46,7 @@ class PageController extends Controller
$this->checkPermission('page-create'); $this->checkPermission('page-create');
$book = $this->bookRepo->getBySlug($bookSlug); $book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $chapterSlug ? $this->chapterRepo->getBySlug($chapterSlug, $book->id) : false; $chapter = $chapterSlug ? $this->chapterRepo->getBySlug($chapterSlug, $book->id) : false;
$this->setPageTitle('Create New Page');
return view('pages/create', ['book' => $book, 'chapter' => $chapter]); return view('pages/create', ['book' => $book, 'chapter' => $chapter]);
} }
@ -89,6 +90,7 @@ class PageController extends Controller
$page = $this->pageRepo->getBySlug($pageSlug, $book->id); $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$sidebarTree = $this->bookRepo->getChildren($book); $sidebarTree = $this->bookRepo->getChildren($book);
Views::add($page); Views::add($page);
$this->setPageTitle($page->getShortName());
return view('pages/show', ['page' => $page, 'book' => $book, 'current' => $page, 'sidebarTree' => $sidebarTree]); return view('pages/show', ['page' => $page, 'book' => $book, 'current' => $page, 'sidebarTree' => $sidebarTree]);
} }
@ -104,6 +106,7 @@ class PageController extends Controller
$this->checkPermission('page-update'); $this->checkPermission('page-update');
$book = $this->bookRepo->getBySlug($bookSlug); $book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id); $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->setPageTitle('Editing Page ' . $page->getShortName());
return view('pages/edit', ['page' => $page, 'book' => $book, 'current' => $page]); return view('pages/edit', ['page' => $page, 'book' => $book, 'current' => $page]);
} }
@ -148,6 +151,7 @@ class PageController extends Controller
$this->checkPermission('page-delete'); $this->checkPermission('page-delete');
$book = $this->bookRepo->getBySlug($bookSlug); $book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id); $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->setPageTitle('Delete Page ' . $page->getShortName());
return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]); return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]);
} }
@ -179,6 +183,7 @@ class PageController extends Controller
{ {
$book = $this->bookRepo->getBySlug($bookSlug); $book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id); $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->setPageTitle('Revisions For ' . $page->getShortName());
return view('pages/revisions', ['page' => $page, 'book' => $book, 'current' => $page]); return view('pages/revisions', ['page' => $page, 'book' => $book, 'current' => $page]);
} }
@ -195,6 +200,7 @@ class PageController extends Controller
$page = $this->pageRepo->getBySlug($pageSlug, $book->id); $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$revision = $this->pageRepo->getRevisionById($revisionId); $revision = $this->pageRepo->getRevisionById($revisionId);
$page->fill($revision->toArray()); $page->fill($revision->toArray());
$this->setPageTitle('Page Revision For ' . $page->getShortName());
return view('pages/revision', ['page' => $page, 'book' => $book]); return view('pages/revision', ['page' => $page, 'book' => $book]);
} }

View File

@ -45,6 +45,7 @@ class SearchController extends Controller
$pages = $this->pageRepo->getBySearch($searchTerm); $pages = $this->pageRepo->getBySearch($searchTerm);
$books = $this->bookRepo->getBySearch($searchTerm); $books = $this->bookRepo->getBySearch($searchTerm);
$chapters = $this->chapterRepo->getBySearch($searchTerm); $chapters = $this->chapterRepo->getBySearch($searchTerm);
$this->setPageTitle('Search For ' . $searchTerm);
return view('search/all', ['pages' => $pages, 'books' => $books, 'chapters' => $chapters, 'searchTerm' => $searchTerm]); return view('search/all', ['pages' => $pages, 'books' => $books, 'chapters' => $chapters, 'searchTerm' => $searchTerm]);
} }

View File

@ -18,6 +18,7 @@ class SettingController extends Controller
public function index() public function index()
{ {
$this->checkPermission('settings-update'); $this->checkPermission('settings-update');
$this->setPageTitle('Settings');
return view('settings/index'); return view('settings/index');
} }

View File

@ -35,6 +35,7 @@ class UserController extends Controller
public function index() public function index()
{ {
$users = $this->user->all(); $users = $this->user->all();
$this->setPageTitle('Users');
return view('users/index', ['users' => $users]); return view('users/index', ['users' => $users]);
} }
@ -90,6 +91,7 @@ class UserController extends Controller
$user = $this->user->findOrFail($id); $user = $this->user->findOrFail($id);
$activeSocialDrivers = $socialAuthService->getActiveDrivers(); $activeSocialDrivers = $socialAuthService->getActiveDrivers();
$this->setPageTitle('User Profile');
return view('users/edit', ['user' => $user, 'activeSocialDrivers' => $activeSocialDrivers]); return view('users/edit', ['user' => $user, 'activeSocialDrivers' => $activeSocialDrivers]);
} }
@ -139,6 +141,7 @@ class UserController extends Controller
return $this->currentUser->id == $id; return $this->currentUser->id == $id;
}); });
$user = $this->user->findOrFail($id); $user = $this->user->findOrFail($id);
$this->setPageTitle('Delete User ' . $user->name);
return view('users/delete', ['user' => $user]); return view('users/delete', ['user' => $user]);
} }

View File

@ -32,7 +32,6 @@ class Page extends Entity
return $this->chapter()->count() > 0; return $this->chapter()->count() > 0;
} }
public function revisions() public function revisions()
{ {
return $this->hasMany('BookStack\PageRevision')->orderBy('created_at', 'desc'); return $this->hasMany('BookStack\PageRevision')->orderBy('created_at', 'desc');
@ -40,7 +39,6 @@ class Page extends Entity
public function getUrl() public function getUrl()
{ {
// TODO - Extract this and share with chapters
$bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug; $bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
return '/books/' . $bookSlug . '/page/' . $this->slug; return '/books/' . $bookSlug . '/page/' . $this->slug;
} }

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>BookStack</title> <title>{{ isset($pageTitle) ? $pageTitle . ' | ' : '' }}{{ Setting::get('app-name', 'BookStack') }}</title>
<!-- Meta --> <!-- Meta -->
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">

View File

@ -2,7 +2,7 @@
<h3 class="text-book"><i class="zmdi zmdi-book"></i>{{ $book->name }}</h3> <h3 class="text-book"><i class="zmdi zmdi-book"></i>{{ $book->name }}</h3>
<ul class="sortable-page-list sort-list"> <ul class="sortable-page-list sort-list">
@foreach($bookChildren as $bookChild) @foreach($bookChildren as $bookChild)
<li data-id="{{$bookChild->id}}" data-type="{{ $bookChild->getName() }}" class="text-{{ $bookChild->getName() }}"> <li data-id="{{$bookChild->id}}" data-type="{{ $bookChild->getClassName() }}" class="text-{{ $bookChild->getClassName() }}">
<i class="zmdi {{ $bookChild->isA('chapter') ? 'zmdi-collection-bookmark':'zmdi-file-text'}}"></i>{{ $bookChild->name }} <i class="zmdi {{ $bookChild->isA('chapter') ? 'zmdi-collection-bookmark':'zmdi-file-text'}}"></i>{{ $bookChild->name }}
@if($bookChild->isA('chapter')) @if($bookChild->isA('chapter'))
<ul> <ul>

View File

@ -7,12 +7,12 @@
<div class="row"> <div class="row">
<div class="col-sm-6 faded"> <div class="col-sm-6 faded">
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{{$book->getUrl()}}" class="text-book text-button"><i class="zmdi zmdi-book"></i>{{ $book->name }}</a> <a href="{{$book->getUrl()}}" class="text-book text-button"><i class="zmdi zmdi-book"></i>{{ $book->getShortName() }}</a>
@if($page->hasChapter()) @if($page->hasChapter())
<span class="sep">&raquo;</span> <span class="sep">&raquo;</span>
<a href="{{ $page->chapter->getUrl() }}" class="text-chapter text-button"> <a href="{{ $page->chapter->getUrl() }}" class="text-chapter text-button">
<i class="zmdi zmdi-collection-bookmark"></i> <i class="zmdi zmdi-collection-bookmark"></i>
{{$page->chapter->name}} {{$page->chapter->getShortName()}}
</a> </a>
@endif @endif
</div> </div>

View File

@ -6,8 +6,8 @@
@foreach($sidebarTree as $bookChild) @foreach($sidebarTree as $bookChild)
<li class="list-item-{{ $bookChild->getName() }} {{ $bookChild->getName() }}"> <li class="list-item-{{ $bookChild->getClassName() }} {{ $bookChild->getClassName() }}">
<a href="{{$bookChild->getUrl()}}" class="{{ $bookChild->getName() }} {{ $current->matches($bookChild)? 'selected' : '' }}"> <a href="{{$bookChild->getUrl()}}" class="{{ $bookChild->getClassName() }} {{ $current->matches($bookChild)? 'selected' : '' }}">
@if($bookChild->isA('chapter'))<i class="zmdi zmdi-collection-bookmark"></i>@else <i class="zmdi zmdi-file-text"></i>@endif{{ $bookChild->name }} @if($bookChild->isA('chapter'))<i class="zmdi zmdi-collection-bookmark"></i>@else <i class="zmdi zmdi-file-text"></i>@endif{{ $bookChild->name }}
</a> </a>