diff --git a/.gitignore b/.gitignore index 29f36a71..10a843ad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +/resources/views/modules +**/views/**/custom/* +!**/views/**/custom/.gitkeep /public/uploads/* !/public/uploads/.gitkeep /resources/views/vendor diff --git a/app/Helpers/Template.php b/app/Helpers/Template.php new file mode 100644 index 00000000..bf395cfb --- /dev/null +++ b/app/Helpers/Template.php @@ -0,0 +1,42 @@ +exists($namespace . 'visitor.' . $prefix . $template)) { + $view = $namespace . 'visitor.' . $prefix . $template; + break; + } + } + + if (is_null($view)) { + throw new InvalidArgumentException('Cannot find template for ' . $namespace . $template); + } + + return $view; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 83df967a..b041ba0c 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -2,10 +2,11 @@ namespace App\Http\Controllers; -use Illuminate\Foundation\Bus\DispatchesJobs; -use Illuminate\Routing\Controller as BaseController; -use Illuminate\Foundation\Validation\ValidatesRequests; +use App\Helpers\Template; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Foundation\Bus\DispatchesJobs; +use Illuminate\Foundation\Validation\ValidatesRequests; +use Illuminate\Routing\Controller as BaseController; class Controller extends BaseController { @@ -16,15 +17,16 @@ class Controller extends BaseController * * This method will be used for switching among templates. * - * @todo add template support - * - * @param null $view + * @param $template * @param array $data * @param array $mergeData * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - protected function view($view = null, $data = [], $mergeData = []) { + public static function VisitorsView($template, $data = [], $mergeData = []) + { + $view = Template::name($template); + return view($view, $data, $mergeData); } } diff --git a/app/Http/Controllers/Visitor/ContentPage.php b/app/Http/Controllers/Visitor/ContentPage.php index fc2b19ab..6ee4ac70 100644 --- a/app/Http/Controllers/Visitor/ContentPage.php +++ b/app/Http/Controllers/Visitor/ContentPage.php @@ -9,11 +9,28 @@ use Illuminate\Support\Facades\Auth; class ContentPage extends Controller { + /** + * @var Content + */ + protected $content; + + /** + * @param Content $content + */ + function __construct(Content $content) + { + + $this->content = $content; + } + public function getPage($url) { - $page = Content::where('url', $url) - ->where('status', '!=', Content::STATUS_DELETED) - ->first(); + $page = $this->content->getByURL($url); + + // no page available + if (!$page) { + abort(404); + } return $this->renderPage($page); } @@ -38,6 +55,5 @@ class ContentPage extends Controller // render page return $handler->render($page, ''); - // return call_user_func([$handler, 'render'], $page); } } diff --git a/app/Http/Controllers/Visitor/Homepage.php b/app/Http/Controllers/Visitor/Homepage.php index f5dbcb83..9e81cc44 100644 --- a/app/Http/Controllers/Visitor/Homepage.php +++ b/app/Http/Controllers/Visitor/Homepage.php @@ -3,24 +3,24 @@ namespace App\Http\Controllers\Visitor; use App\Http\Requests; -use App\Models\Content; -use Symfony\Component\Process\Exception\InvalidArgumentException; class Homepage extends ContentPage { public function getIndex() { // try to find some homepage - $page = Content::where('is_homepage', 1) - ->where('status', '!=', Content::STATUS_DELETED) - ->first(); + $page = $this->content->getHomepage(); // test if we have any homepage if (!$page) { - throw new InvalidArgumentException('Cannot load home page!'); + return view('errors.homepageNotAvailable'); } // render page - return $this->renderPage($page); + try { + return $this->renderPage($page); + } catch (\Exception $e) { + return view('errors.homepageNotAvailable'); + } } } diff --git a/app/Http/routes.php b/app/Http/routes.php index 75e479f9..61dc7b9a 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -4,21 +4,8 @@ * This routing groups is used for routing along public part of website */ -Route::group(['middleware' => ['web']], function () { - - Route::get('/', 'Visitor\Homepage@getIndex') - ->name('page.index'); - - // display login form - Route::get('login', function () { - return view('admin.loginForm.form'); - }) - ->name('loginForm'); - - // handle login - Route::post('login', 'Admin\Login@postLogin') - ->name('login'); -}); +Route::pattern('id', '\d+'); +Route::pattern('url', '[0-9\-a-z]+'); /*******************************************************************************/ @@ -193,3 +180,29 @@ Route::group([ }) ->name('logout'); }); + +/**************************************************************************************/ + +/** + * This section must be specified as last one + */ + +Route::group(['middleware' => ['web']], function () { + + Route::get('', 'Visitor\Homepage@getIndex') + ->name('page.index'); + + // display login form + Route::get('login', function () { + return view('admin.loginForm.form'); + }) + ->name('loginForm'); + + // handle login + Route::post('login', 'Admin\Login@postLogin') + ->name('login'); + + // route for all content pages. This rule must be specified last (because it matches every route) + Route::get('{url}', 'Visitor\ContentPage@getPage') + ->name('page.content'); +}); \ No newline at end of file diff --git a/app/Models/Content.php b/app/Models/Content.php index b86249cc..7f25e950 100644 --- a/app/Models/Content.php +++ b/app/Models/Content.php @@ -31,6 +31,41 @@ class Content extends Model const STATUS_PROTECTED = 'protected'; const STATUS_PUBLIC = 'public'; + /** + * Getter for query with setup filter for non-deleted and non-draft pages + */ + protected function getPageQuery() + { + return Content::where('status', '!=', Content::STATUS_DELETED) + ->where('status', '!=', Content::STATUS_DRAFT); + } + + /** + * Getter for homepage content page + * + * @return Content + */ + public function getHomepage() + { + return $this->getPageQuery() + ->where('is_homepage', 1) + ->first(); + } + + /** + * Getter for any page specified by its url. + * + * @param $url + * + * @return Content + */ + public function getByURL($url) + { + return $this->getPageQuery() + ->where('url', $url) + ->first(); + } + /** * Getter for overview of all content pages of given handler (module type) * diff --git a/app/Providers/GlobalViewDataProvider.php b/app/Providers/GlobalViewDataProvider.php index 9eb03876..290de0ba 100644 --- a/app/Providers/GlobalViewDataProvider.php +++ b/app/Providers/GlobalViewDataProvider.php @@ -16,6 +16,14 @@ class GlobalViewDataProvider extends ServiceProvider { view()->share('vendorName', 'ja s.r.o.'); + // extend Blade "@extends" macro - with this macro allows to use "hierarchy" in templates + Blade::extend(function ($view) { + $pattern = $this->createPattern('extendVisitor'); + $code = '@extends(\App\Helpers\Template::name($2))'; + + return preg_replace($pattern, $code, $view); + }); + // register extension for rendering widget areas Blade::extend(function ($view) { $pattern = $this->createPattern('widgetArea'); @@ -37,11 +45,8 @@ class GlobalViewDataProvider extends ServiceProvider ?> '; - return preg_replace($pattern, $code, $view); }); - - } /** @@ -51,8 +56,9 @@ class GlobalViewDataProvider extends ServiceProvider * * @return string */ - private function createPattern($function){ - return '/(? env('UPLOAD_URL', PHP_SAPI === 'cli' ? '' : url('uploads')), 'thumbnail_url' => env('THUMBNAIL_URL', PHP_SAPI === 'cli' ? '' : url('uploads/thumbnails')), + + 'theme' => 'default_theme', /* |-------------------------------------------------------------------------- | Logging Configuration diff --git a/resources/lang/en/visitor/common.php b/resources/lang/en/visitor/common.php new file mode 100644 index 00000000..8522c059 --- /dev/null +++ b/resources/lang/en/visitor/common.php @@ -0,0 +1,4 @@ + 'Welcome to my page' +]; \ No newline at end of file diff --git a/resources/views/errors/homepageNotAvailable.blade.php b/resources/views/errors/homepageNotAvailable.blade.php new file mode 100644 index 00000000..674673c1 --- /dev/null +++ b/resources/views/errors/homepageNotAvailable.blade.php @@ -0,0 +1,5 @@ +@extendVisitor("errorLayout") + +@section('content') +
Home is not available at the moment.. Sorry for any inconvenience.
+@endsection \ No newline at end of file diff --git a/resources/views/visitor/theme_name/.gitkeep b/resources/views/visitor/default_theme/.gitkeep similarity index 100% rename from resources/views/visitor/theme_name/.gitkeep rename to resources/views/visitor/default_theme/.gitkeep diff --git a/resources/views/visitor/default_theme/layout.blade.php b/resources/views/visitor/default_theme/layout.blade.php new file mode 100644 index 00000000..7490b817 --- /dev/null +++ b/resources/views/visitor/default_theme/layout.blade.php @@ -0,0 +1,53 @@ + + + + + + + @yield('head_meta') + @yield('pageName', @trans('visitor/common.welcome')) | {{$vendorName}} + + + + @yield('head_stylesheets') + + + + +
+ +

Default theme template

+
+ @yield('content') +
+
+ + diff --git a/resources/views/visitor/errorLayout.blade.php b/resources/views/visitor/errorLayout.blade.php new file mode 100644 index 00000000..beb4cb26 --- /dev/null +++ b/resources/views/visitor/errorLayout.blade.php @@ -0,0 +1,55 @@ + + + + + + + @yield('head_meta') + @yield('pageName', @trans('visitor/common.welcome')) | {{$vendorName}} + + + + @yield('head_stylesheets') + + + + + + +
+
+ @yield('content') +
+
+ + diff --git a/resources/views/visitor/layout.blade.php b/resources/views/visitor/layout.blade.php new file mode 100644 index 00000000..beb4cb26 --- /dev/null +++ b/resources/views/visitor/layout.blade.php @@ -0,0 +1,55 @@ + + + + + + + @yield('head_meta') + @yield('pageName', @trans('visitor/common.welcome')) | {{$vendorName}} + + + + @yield('head_stylesheets') + + + + + + +
+
+ @yield('content') +
+
+ +