Author SHA1 Message Date
Michal Kváček e8065c99c7 FEATURE: refactorize settings 2017-08-02 10:27:58 +02:00
Michal Kváček e5d9ce682d FEATURE #1865: add logging for uploaded file 2017-08-01 23:33:01 +02:00
Michal Kváček 7a38f357dc FEATURE #2045: generate thumbnails in queue 2017-08-01 23:00:44 +02:00
Michal Kváček 8c15a63c2a FEATURE #1753: add commands for enablind/disabling modules 2017-08-01 22:58:59 +02:00
Michal Kváček c2502a2355 FIX: fix invalid pingpong parent classes in few controllers 2017-08-01 19:56:01 +02:00
Michal Kváček 2d60010f9e FEATURE: use even more route model binding 2017-08-01 19:51:12 +02:00
Michal Kváček 3275e5aeed FEATURE: use more route model binding 2017-08-01 19:10:55 +02:00
Michal Kváček a7e91ef499 FEATURE #2472: fix few minor bugs in template management 2017-07-31 18:26:26 +02:00
Michal Kváček 638f6ef134 FEATURE #2472: update to laravel 5.4 - not stable at allg a -A 2017-07-31 16:10:23 +02:00
Michal Kváček e9e9f0976c FEATURE #1753: remove pingpong menus and install nwidart laravel-menus 2017-07-31 15:46:24 +02:00
Michal Kváček 5707750f5b FEATURE #1753: change parent class of module service providers 2017-07-31 15:35:40 +02:00
Michal Kváček 72c64dc6d1 FEATURE #1753: remove pingpong/modules and use custom solution 2017-07-31 15:32:33 +02:00
Michal Kváček f876a08429 REFACTORING: move creating directories into repository 2017-07-30 16:06:28 +02:00
Michal Kváček f48c0cfac3 FIX: fix setting same height 2017-04-24 00:26:28 +02:00
Michal Kváček e262473f36 FEATURE #2042: refactorize widgets 2017-04-24 00:01:03 +02:00
Michal Kváček 4a5c9ab1e6 FEATURE #1831: add recaptcha module 2017-04-24 00:00:42 +02:00
Michal Kváček e41c589225 FEATURE: move recaptcha config into core application 2017-04-05 02:01:20 +02:00
Michal Kváček 870ca540c4 FEATURE: make content list in admin nicer 2017-04-05 01:40:47 +02:00
Michal Kváček 2e8f8dca1f Merge branch 'pragtenniscamp.eu' into dev 2017-03-24 01:51:02 +01:00
Michal Kváček 8167b151d5 FIX: upload all title photos into root directory 2017-03-24 01:38:23 +01:00
Michal Kváček ad8a6e3c61 FEATURE: add title photo to contact template and change background image 2017-03-23 08:06:02 +01:00
Michal Kváček 74f1501af6 Merge branch 'pragtenniscamp.eu' into dev 2017-03-23 01:34:06 +01:00
Michal Kváček 217d78f214 FIX: fix year in footer in binarity template 2017-03-23 01:11:43 +01:00
Michal Kváček 16532faa5b FEATURE: remove trainer team from homepage 2017-03-23 01:04:53 +01:00
Michal Kváček ead55a8165 FIX: fix comments overview 2017-03-23 01:01:26 +01:00
Michal Kváček e943120dc6 FIX: fix blog overview template 2017-03-23 00:52:51 +01:00
Michal Kváček dd978c05f7 FIX: fix blog overview template 2017-03-23 00:51:28 +01:00
Michal Kváček 348883603a FIX: fix blocked javascript with ad block 2017-03-23 00:43:59 +01:00
Michal Kváček 5de8e01d77 FIX: fix year in footer 2017-03-23 00:38:08 +01:00
Michal Kváček 5d623a1a62 FIX: fix typo in service provider name 2017-03-23 00:21:09 +01:00
Michal Kváček 69253693ce FEATURE: add shortcodes into binarity template 2017-03-23 00:19:05 +01:00
Michal Kváček 42066d4ae9 FIX: fix paginated results in root pages in content editor 2017-03-23 00:01:47 +01:00
Michal Kváček 52f39fda0c FIX: fix reference list 2017-03-22 23:51:39 +01:00
Michal Kváček 9cb4deecd4 FEATURE: add success message after sending e-mail from contact form 2017-03-13 21:55:56 +01:00
Michal Kváček fcd7651841 FEATURE: add template for email from contactform 2017-03-13 21:48:34 +01:00
Michal Kváček 09daba1dc1 FEATURE: style little bit contact form for pragtenniscamp.eu 2017-03-13 19:41:25 +01:00
Michal Kváček 66e5d649be FEATURE: make smaller line height in trainee team 2017-03-13 13:55:56 +01:00
Michal Kváček 78532a6832 FIX: fix typos in template 2017-03-13 13:50:26 +01:00
Michal Kváček 1f633c3281 FEATURE: add template for hotels 2017-03-13 13:27:49 +01:00
Michal Kváček 8658ea1d39 FEATURE: prepare hotels template 2017-03-13 12:08:45 +01:00
Michal Kváček ce58b325c8 FIX: fix latent bug in save pipeline - trim backslashes from handler name 2017-03-13 12:08:26 +01:00
Michal Kváček ed8e2565ff FIX: fix template edit 2017-03-13 11:48:32 +01:00
Michal Kváček 87af6a018c FEATURE #2351 @45m: minor UI tweaks, add error templates 2017-03-10 13:42:55 +01:00
Michal Kváček 0e2aecb529 FEATURE: add pipeline for saving also into prague-tennis-camp template 2017-03-10 09:52:31 +01:00
Michal Kváček 9bec808d38 FEATURE #2354 @2h30m: add pipeline for edit and create new content 2017-03-10 09:52:12 +01:00
Michal Kváček 55f9c0a679 FEATURE #2350 @1h: move beforeRender methods into pipeline 2017-03-09 00:09:26 +01:00
Michal Kváček 03ce64a731 FEATURE #2350: remove not-used functions from handlers 2017-03-09 00:09:03 +01:00
Michal Kváček 450000fadd FEATURE #2350 @2h: add pipeline for displaying content 2017-03-08 23:38:37 +01:00
Michal Kváček 44fb6b1be5 Merge branch 'praguetenniscamp.cz' into dev 2017-03-08 19:54:50 +01:00
Michal Kváček 09c87661d3 FEATURE: temporarily load trainees into all pages 2017-03-03 00:17:17 +01:00
Michal Kváček 0007425c86 FEATURE #2351 @10m: add template for photo as background on homepage 2017-03-03 00:16:10 +01:00
Michal Kváček 2a15f3eab5 FEATURE #2351 @30m: modify responsive version 2017-03-02 23:47:27 +01:00
Michal Kváček 57f9c21a43 FIX: fix saving address widget 2017-03-02 23:16:58 +01:00
Michal Kváček eff61a1481 FEATURE #2351 @3h: add colors 2017-03-02 23:16:42 +01:00
Michal Kváček 4128fcf88e FEATURE: move creating thumbnails into event listener 2017-03-02 10:33:45 +01:00
Michal Kváček 4353345b3e FEATURE: try to color template 2017-03-02 10:27:22 +01:00
Michal Kváček 455b9d6d4e FIX: fix creating widgets 2017-02-23 18:26:59 +01:00
Michal Kváček 77685b491e Merge some fix into praguetenniscamp.cz 2017-02-23 18:26:43 +01:00
Michal Kváček f90df0f4bc FIX: fix unassigning related files 2017-02-23 18:24:35 +01:00
Michal Kváček 93fc9316a4 FEATURE: add command for displaying info about currently set template 2017-02-23 18:23:59 +01:00
Michal Kváček 26854b7207 FIX: fix contact form widget 2017-02-23 18:23:30 +01:00
Michal Kváček 8db748089b FIX: fix unassigning related files 2017-02-23 18:23:06 +01:00
Michal Kváček 507e186713 FEATURE #2341 @4h: add basics for template 2017-02-23 18:22:33 +01:00
Michal Kváček 5132278ee1 FIX: fix installer 2017-02-22 02:33:43 +01:00
Michal Kváček c64f825886 FIX: fix saving 'viewed' column with updated_at 2017-02-22 01:46:13 +01:00
248 changed files with 27547 additions and 4053 deletions
+1 -1
View File
@@ -16,4 +16,4 @@ MAIL_PASSWORD=
SITE_URL=/ SITE_URL=/
UPLOAD_URL=/public/uploads UPLOAD_URL=/public/uploads
THUMBNAILS_URL=/uploads/thumbnails THUMBNAIL_URL=/public/uploads/thumbnails
@@ -5,27 +5,6 @@ use App\Http\Requests\Request;
use App\Models\Content\Content; use App\Models\Content\Content;
interface AdvancedContentModifier { interface AdvancedContentModifier {
/**
* Save module-specific values into database
*
* @param Content $content
* @param array $inputData
*
* @return mixed
*/
public static function createNew(Content &$content, array $inputData);
/**
* Method used for editing existing content page.
*
* Reason why it is separated from createNew() method is simple - we need to save history of changes.
*
* @param Content $content
* @param $request
*
* @return mixed
*/
public static function edit(Content $content, $request);
/** /**
* Method called right after content page is marked as deleted * Method called right after content page is marked as deleted
* *
@@ -0,0 +1,16 @@
<?php
namespace App\CMS\Contracts\Content\DisplayPipeline;
use App\Models\Content\Content;
interface Pipeline {
/**
* Add new process into pipeline
*
* @param string $process
*
* @return void
*/
function add($process);
function run(Content $page);
}
@@ -0,0 +1,15 @@
<?php
namespace App\CMS\Contracts\Content\DisplayPipeline;
use App\Models\Content\Content;
interface Process {
/**
* Process and modify given page
*
* @param Content $page
*
* @return mixed
*/
function handle(Content & $page);
}
@@ -0,0 +1,25 @@
<?php
namespace App\CMS\Contracts\Content\SavePipeline;
use App\Models\Content\Content;
interface Pipeline {
/**
* Add new process into pipeline
*
* @param string $process
*
* @return void
*/
function add($process);
/**
* Save content page
*
* @param Content $page
* @param array $input
*
* @return Content
*/
function run(Content & $page, array $input);
}
@@ -0,0 +1,16 @@
<?php
namespace App\CMS\Contracts\Content\SavePipeline;
use App\Models\Content\Content;
interface Process {
/**
* Process and modify given page
*
* @param Content $page
* @param array $input
*
* @return mixed
*/
function handle(Content & $page, array & $input);
}
-10
View File
@@ -6,16 +6,6 @@ use App\Models\Content\Content;
interface AppHandler extends BaseModuleHandler interface AppHandler extends BaseModuleHandler
{ {
/**
* Render given module into visitor area.
*
* @param Content $content DB model from table contents
* @param array $parameters parameters used for modifications/custom settings of given model
*
* @return mixed
*/
public function render(Content $content, $parameters);
public static function getHistoryHandler(); public static function getHistoryHandler();
/** /**
@@ -27,28 +27,4 @@ interface TemplateHandler extends BaseModuleHandler
* @return array * @return array
*/ */
public static function getPublicTemplatePaths(); public static function getPublicTemplatePaths();
/**
* Prepare Content object to be rendered using Blade template
*
* @param Content $content
*/
public static function beforeRender(Content & $content);
/**
* Modify input data into format which can be understood by edit template
*
* @param Content $content
*/
public static function beforePopulatingEditForm(Content & $content);
/**
* Slightly modify Content object before saving into database.
*
* This way we can do almost whatever we want - even in template
*
* @param Content $content
* @param $request
*/
public static function beforeSave(Content & $content, $request);
} }
+1 -1
View File
@@ -15,7 +15,7 @@ interface Template
public function setModel(TemplateModel $model); public function setModel(TemplateModel $model);
public function getPathToTemplate(); public function getPathToTemplate($mode = null);
public function getForModule(ModuleModel $module); public function getForModule(ModuleModel $module);
} }
-13
View File
@@ -20,19 +20,6 @@ abstract class Handler extends BaseHandler implements AppHandler
return History::class; return History::class;
} }
/**
* Render given module into visitor area.
*
* @param Content $content DB model from table contents
* @param array $parameters parameters used for modifications/custom settings of given model
*
* @return mixed
*/
public function render(Content $content, $parameters)
{
return Controller::VisitorsView($content->template, ['page' => $content, 'extra' => $parameters]);
}
public static function getExtendedFormSections() public static function getExtendedFormSections()
{ {
return [ return [
@@ -1,7 +1,7 @@
<?php <?php
namespace App\CMS\Handlers\Registrators; namespace App\CMS\Handlers\Registrators;
use App\CMS\Enumerations\Exceptions\EnumerationExistsException; use App\CMS\Exceptions\Enumerations\EnumerationExistsException;
use App\CMS\Handlers\Contracts\SearchHandler; use App\CMS\Handlers\Contracts\SearchHandler;
use App\CMS\Handlers\Contracts\SearchPresenterHandler; use App\CMS\Handlers\Contracts\SearchPresenterHandler;
use App\CMS\Handlers\Registrators\Items\SearchEngine; use App\CMS\Handlers\Registrators\Items\SearchEngine;
+1 -41
View File
@@ -22,16 +22,9 @@ class CurrentTemplate implements TemplateHandler
{ {
if (!self::$initialized) { if (!self::$initialized) {
self::$template = Cache::rememberForever('current-template', function () { self::$template = Cache::rememberForever('current-template', function () {
$template = Module::where('is_template', true) return Module::where('is_template', true)
->where('enabled', true) ->where('enabled', true)
->first(); ->first();
// todo remove after adding $casts into Module model
if ($template) {
$template->module_settings = json_decode($template->module_settings);
}
return $template;
}); });
@@ -96,37 +89,4 @@ class CurrentTemplate implements TemplateHandler
{ {
return call_user_func([self::handler(), 'getPublicTemplatePaths']); return call_user_func([self::handler(), 'getPublicTemplatePaths']);
} }
/**
* Prepare Content object to be rendered using Blade template
*
* @param Content $content
*/
public static function beforeRender(Content & $content)
{
call_user_func_array([self::handler(), 'beforeRender'], [&$content]);
}
/**
* Modify input data into format which can be understood by edit template
*
* @param Content $content
*/
public static function beforePopulatingEditForm(Content & $content)
{
call_user_func_array([self::handler(), 'beforePopulatingEditForm'], [&$content]);
}
/**
* Slightly modify Content object before saving into database.
*
* This way we can do almost whatever we want - even in template
*
* @param Content $content
* @param $request
*/
public static function beforeSave(Content & $content, $request)
{
call_user_func_array([self::handler(), 'beforeSave'], [&$content, $request]);
}
} }
-3
View File
@@ -29,11 +29,8 @@ class PageRenderer
/** /**
* @var $handler AppHandler * @var $handler AppHandler
*/ */
// get handler
$handler = new $page->moduleHandler; $handler = new $page->moduleHandler;
$page->content = Shortcode::compile($page->content);
// render page // render page
return $handler->render($page, $parameters); return $handler->render($page, $parameters);
} }
+2 -2
View File
@@ -2,6 +2,7 @@
namespace App\CMS\Helpers; namespace App\CMS\Helpers;
use App\CMS\Repositories\Settings\Settings as SettingsRepository;
use App\Models\Settings as SettingsModel; use App\Models\Settings as SettingsModel;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
@@ -78,8 +79,7 @@ class Settings
{ {
if (!self::$initialized) { if (!self::$initialized) {
self::$settings = Cache::remember('settings', config('cache.settingCacheLifetime'), function () { self::$settings = Cache::remember('settings', config('cache.settingCacheLifetime'), function () {
$model = new SettingsModel(); app(SettingsRepository::class)->getAll();
return $model->getAll();
}); });
} }
} }
+12 -7
View File
@@ -1,6 +1,8 @@
<?php <?php
namespace App\CMS\Helpers; namespace App\CMS\Helpers;
use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository;
use App\Models\Widgets\WidgetArea; use App\Models\Widgets\WidgetArea;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
@@ -25,15 +27,16 @@ class WidgetAreas
protected static function loadWidgetArea($uniqueCode) protected static function loadWidgetArea($uniqueCode)
{ {
$widgets = Cache::remember('widget-' . $uniqueCode, setting('widgetCacheLifetime', 5), function () use ($uniqueCode) { WidgetArea::where('code', $uniqueCode)
$widgetArea = new WidgetArea(); ->increment('viewed');
$widgets = Cache::remember('widget-area-' . $uniqueCode, setting('widgetCacheLifetime', 5), function () use ($uniqueCode) {
$widgetArea = app(\App\CMS\Repositories\Widgets\WidgetArea::class);
return $widgetArea->getWidgets($uniqueCode) return $widgetArea->getWidgets($uniqueCode)
->get(); ->get();
}); });
WidgetArea::where('code', $uniqueCode)
->increment('viewed');
self::saveRenderedWidgetArea($widgets); self::saveRenderedWidgetArea($widgets);
} }
@@ -44,7 +47,7 @@ class WidgetAreas
} }
$widgets = Cache::remember('widgets', setting('widgetCacheLifetime', 5), function () { $widgets = Cache::remember('widgets', setting('widgetCacheLifetime', 5), function () {
$widgetArea = new WidgetArea(); $widgetArea = app(WidgetAreaRepository::class);
return $widgetArea->getWidgets() return $widgetArea->getWidgets()
->get(); ->get();
}); });
@@ -58,7 +61,7 @@ class WidgetAreas
* *
* @param $uniqueCode * @param $uniqueCode
* *
* @return mixed * @return void
*/ */
public static function render($uniqueCode) public static function render($uniqueCode)
{ {
@@ -66,6 +69,8 @@ class WidgetAreas
self::initWidgetAreas(); self::initWidgetAreas();
} }
// dd($uniqueCode);
if (!isset(self::$widgetAreas[$uniqueCode])) { if (!isset(self::$widgetAreas[$uniqueCode])) {
self::loadWidgetArea($uniqueCode); self::loadWidgetArea($uniqueCode);
} }
@@ -37,32 +37,18 @@ class EditContent implements Interaction
* @param array $data * @param array $data
* @param array $parameters * @param array $parameters
* *
* @return mixed|void * @return mixed
*/ */
public function handle($data, $parameters) public function handle($data, $parameters)
{ {
/** /**
* @var $page Content * @var $page Content
*/ */
list($page, $titlePhoto, $relatedFiles) = $parameters; list($page) = $parameters;
// let template to modify request and content page app('saveContentPipeline')->run($page, $data);
CurrentTemplate::beforeSave($page, $data);
// upload file - if provided return $page;
$data['titlePhoto'] = isset($data['existingTitlePhoto']) ? $data['existingTitlePhoto'] : null;
if (!is_null($titlePhoto)) {
$file = $this->file->upload($titlePhoto);
$data['titlePhoto'] = $file ? $file['filename'] : null;
}
$page->update($data);
$this->module->callOnString($page->moduleHandler, 'edit', [$page, $data]);
// move to interaction
$keepAssigned = isset($data->keepAssigned) ? $data->keepAssigned : [];
$page->uploadRelatedFiles($relatedFiles, $keepAssigned);
} }
/** /**
@@ -43,29 +43,14 @@ class NewContent implements Interaction
*/ */
public function handle($data, $parameters) public function handle($data, $parameters)
{ {
list($moduleHandler, $titlePhoto, $relatedFiles) = $parameters; list($moduleHandler) = $parameters;
// upload file - if provided
$file = !is_null($titlePhoto) ? $this->file->upload($titlePhoto) : null;
$data['userId'] = \Auth::user()->id; $data['userId'] = \Auth::user()->id;
$data['language'] = LaravelLocalization::getCurrentLocale(); $data['language'] = LaravelLocalization::getCurrentLocale();
$data['titlePhoto'] = $file ? $file['filename'] : null;
$data['moduleHandler'] = $moduleHandler; $data['moduleHandler'] = $moduleHandler;
$page = Content::create($data); $page = new Content();
app('saveContentPipeline')->run($page, $data);
// save module-specific stuff
$this->module->callOnString($moduleHandler, 'createNew', [&$page, $data]);
// let template to modify data and content page
CurrentTemplate::beforeSave($page, $data);
// save content of page before (possible) uploading related files
$page->save();
// upload files assigned to content page
$page->uploadRelatedFiles($relatedFiles);
return $page; return $page;
} }
@@ -31,22 +31,13 @@ class CreateDirectory implements Interaction
{ {
$data['parentDirectory'] = isset($data['parentDirectory']) ? $data['parentDirectory'] : null; $data['parentDirectory'] = isset($data['parentDirectory']) ? $data['parentDirectory'] : null;
// todo this should probably go into validation, but we are not able to get $data in getValidationRules
// check if created folder does not exist in current directory // check if created folder does not exist in current directory
if ($this->repository->checkIfNameExists($data['name'], $data['parentDirectory'])) { if ($this->repository->checkIfNameExists($data['name'], $data['parentDirectory'])) {
throw new SubdirectoryExistsInDirectory(); throw new SubdirectoryExistsInDirectory();
} }
// todo use Directory::create() and rename columns/fields in request
// create new database entry // create new database entry
$directory = new Directory(); return $this->repository->create($data);
$directory->name = $data['name'];
$directory->parent_id = $data['parentDirectory'];
$directory->user_id = \Auth::user()->id;
$directory->description = $data['description'];
$directory->save();
return $directory;
} }
/** /**
@@ -1,8 +1,9 @@
<?php <?php
namespace App\CMS\MenuPresenters; namespace App\CMS\MenuPresenters;
use Pingpong\Menus\MenuItem; use Nwidart\Menus\MenuItem;
use Pingpong\Menus\Presenters\Presenter; use Nwidart\Menus\Presenters\Presenter;
class FoundationDrilldownMenuPresenter extends Presenter class FoundationDrilldownMenuPresenter extends Presenter
{ {
@@ -1,7 +1,8 @@
<?php <?php
namespace App\CMS\MenuPresenters; namespace App\CMS\MenuPresenters;
use Pingpong\Menus\Presenters\Presenter; use Nwidart\Menus\Presenters\Presenter;
class FoundationDropdownMenuPresenter extends Presenter class FoundationDropdownMenuPresenter extends Presenter
{ {
@@ -27,7 +28,7 @@ class FoundationDropdownMenuPresenter extends Presenter
public function getMenuWithoutDropdownWrapper($item) public function getMenuWithoutDropdownWrapper($item)
{ {
$link = '<a href="' . $item->getUrl() . '">' . $item->getIcon() . ' ' . $item->title . '</a>'; $link = '<a href="' . $item->getUrl() . '">' . $item->getIcon() . ' ' . $item->title . '</a>';
return '<li' . $this->getActiveState($item) . '>' . $link . '</li>'.PHP_EOL; return '<li' . $this->getActiveState($item) . '>' . $link . '</li>' . PHP_EOL;
} }
/** /**
@@ -43,7 +44,7 @@ class FoundationDropdownMenuPresenter extends Presenter
*/ */
public function getDividerWrapper() public function getDividerWrapper()
{ {
return '<li class="divider"></li>'.PHP_EOL; return '<li class="divider"></li>' . PHP_EOL;
} }
/** /**
@@ -1,8 +1,8 @@
<?php <?php
namespace App\CMS\MenuPresenters; namespace App\CMS\MenuPresenters;
use Pingpong\Menus\MenuItem; use Nwidart\Menus\MenuItem;
use Pingpong\Menus\Presenters\Presenter; use Nwidart\Menus\Presenters\Presenter;
class MetismenuPresenter extends Presenter class MetismenuPresenter extends Presenter
{ {
@@ -1,8 +1,9 @@
<?php <?php
namespace App\CMS\MenuPresenters; namespace App\CMS\MenuPresenters;
use Pingpong\Menus\MenuItem; use Nwidart\Menus\MenuItem;
use Pingpong\Menus\Presenters\Presenter; use Nwidart\Menus\Presenters\Presenter;
class ProfileMenuPresenter extends Presenter class ProfileMenuPresenter extends Presenter
{ {
@@ -1,13 +1,13 @@
<?php <?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider; namespace App\CMS\Modules\ServiceProviders;
abstract class ModuleServiceProvider extends ServiceProvider use Illuminate\Support\ServiceProvider as LaravelServiceProvider;
abstract class ServiceProvider extends LaravelServiceProvider
{ {
/** /**
* Indicates if loading of the provider is deferred. * Indicates if loading of the provider is deferred.
*
* @var bool * @var bool
*/ */
protected $defer = false; protected $defer = false;
@@ -20,7 +20,6 @@ abstract class ModuleServiceProvider extends ServiceProvider
/** /**
* Boot the application events. * Boot the application events.
*
* @return void * @return void
*/ */
public function boot() public function boot()
@@ -35,7 +34,6 @@ abstract class ModuleServiceProvider extends ServiceProvider
/** /**
* Register config. * Register config.
*
* @return void * @return void
*/ */
protected function registerConfig() protected function registerConfig()
@@ -50,7 +48,6 @@ abstract class ModuleServiceProvider extends ServiceProvider
/** /**
* Register views. * Register views.
*
* @return void * @return void
*/ */
protected function registerViews() protected function registerViews()
@@ -69,7 +66,6 @@ abstract class ModuleServiceProvider extends ServiceProvider
/** /**
* Register translations. * Register translations.
*
* @return void * @return void
*/ */
protected function registerTranslations() protected function registerTranslations()
+12
View File
@@ -0,0 +1,12 @@
<?php
return [
'name' => '$Module$',
'translatedName' => '$module$::$module$.name',
'translatedDescription' => '$module$::$module$.description',
'alias' => 'categories',
'handler' => \Modules\$Module$\Handlers\$Module$Handler::class,
'providers' => [\Modules\$Module$\Providers\$Module$ServiceProvider::class],
'files' => ['Http/routes.php'],
'order' => 0,
];
@@ -0,0 +1,8 @@
<?php
namespace Modules\$ModuleNamespace$\Entities;
use Illuminate\Database\Eloquent\Model;
class $Entity$ extends Model {
// ...
}
@@ -0,0 +1,40 @@
<?php
namespace Modules\$ModuleNamespace$\Handlers;
use App\CMS\Contracts\Content\ContentTitles;
use App\Models\Content\Content;
class $Module$ContentHandler extends $Module$Handler implements ContentTitles
{
/**
* Get translated title for pages overview of given type.
* This value is used for rendering list of all content pages of given type in administration.
* @return string
*/
public static function getOverviewTitle()
{
// TODO: Implement getOverviewTitle() method.
}
/**
* Title displayed above for for creating new content page
* @return string
*/
public static function getCreateNewTitle()
{
// TODO: Implement getCreateNewTitle() method.
}
/**
* Title for form displayed for editin content page
*
* @param Content $content
*
* @return mixed
*/
public static function getEditTitle(Content $content)
{
// TODO: Implement getEditTitle() method.
}
}
@@ -0,0 +1,38 @@
<?php
namespace Modules\$ModuleNamespace$\Handlers;
use App\CMS\Handlers\Handler;
use App\Models\User;
class $Module$Handler extends Handler
{
/**
* Register admin menu
*
* @param User $user
*/
public static function registerAdminMenu(User $user)
{
// register links in admin menu
$menu = \Menu::instance('mainMenu');
$menu->dropdown(trans('$module$::$module$.name'), function ($submenu) use ($user) {
$submenu->route('$module$.overview', trans('$module$::$module$.overview'), [], 20, ['icon' => 'fa fa-fw fa-list']);
$submenu->route('$module$.new', trans('$module$::$module$.new'), [], 21, ['icon' => 'fa fa-fw fa-plus']);
}, 15, ['icon' => 'fa fa-fw']);
// TODO: add admin menu entries
}
/**
* Does this module support categories?
* @return boolean
*/
public static function supportCategories()
{
return true;
}
}
@@ -0,0 +1,103 @@
<?php
namespace Modules\$ModuleNamespace$\Http\Controllers\Admin;
use App\Http\Controllers\Admin\Controller;
use Modules\$ModuleNamespace$\Http\Requests\Update$Entity$;
use Modules\$ModuleNamespace$\Http\Requests\Create$Entity$;
use Modules\$ModuleNamespace$\Repositories\$Module$Repository;
use $EntityNamespace$\$Entity$ as $Entity$Entity;
class $Module$ extends Controller
{
/**
* @var $Module$Repository
*/
private $$module$Repository;
public function __construct($Module$Repository $$module$Repository)
{
$this->$module$Repository = $$module$Repository;
}
/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index()
{
$items = $Entity$Entity::all();
return view('$module$::admin/index', compact('items'));
}
/**
* Display form for updating entity
*
* @param $Entity$Entity $entity
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function edit($Entity$Entity $entity)
{
return view('$module$::admin/update', compact('entity'));
}
/**
* Update existing entity
*
* @param Update$Entity$ $request
* @param $Entity$Entity $item
*
* @return \Illuminate\Http\RedirectResponse
*/
public function update(Update$Entity$ $request, $Entity$Entity $entity)
{
// ...
$this->$module$Repository->update($entity, $request->all());
return redirect()
->back()
->with('success', trans('$module$.$module.successfullyUpdated'));
}
/**
* Display form for creating new entity
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function create() {
$entity = new $Entity$Entity();
return view('$module$::admin/create', compact('entity'));
}
/**
* Create new instance of entity
*/
public function store(Create$Entity$ $request) {
// ...
$this->$module$Repository->create($request->all());
return redirect()
->back()
->with('success', trans('$module$.$module.successfullyUpdated'));
}
/**
* Delete entity
*
* @param $Entity$ $entity
*
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy($Entity$ $entity) {
$entity->delete();
return redirect()
->back()
->with('success', trans('$module$.$module.successfullyDeleted'));
}
}
@@ -0,0 +1,11 @@
<?php
namespace Modules\$ModuleNamespace$\Http\Requests;
use App\Http\Requests\Request;
class Create$Entity$ extends Request {
public function rules()
{
return parent::rules();
}
}
@@ -0,0 +1,11 @@
<?php
namespace Modules\$ModuleNamespace$\Http\Requests;
use App\Http\Requests\Request;
class Update$Entity$ extends Request {
public function rules()
{
return parent::rules();
}
}
+25
View File
@@ -0,0 +1,25 @@
<?php
\Route::group([
'prefix' => \LaravelLocalization::setLocale() . '/admin/$module$',
'middleware' => ['admin'],
'namespace' => 'Modules\$Module$\Http\Controllers\Admin'
], function () {
Route::get('/', '$Module$@index')
->name('$module$.overview');
Route::get('/new', '$Module$@create')
->name('$module$.new');
Route::post('/new', '$Module$@store')
->name('$module$.postNew');
Route::get('/edit/{id}', '$Module$@edit')
->name('$module$.edit');
Route::post('/edit/{id}', '$Module$@update')
->name('$module$.postEdit');
Route::get('/delete/{id}', '$Module$@delete')
->name('$module$.delete');
});
@@ -0,0 +1,31 @@
<?php
namespace Modules\$Module$\Providers;
use App\CMS\Contracts\Modules\ServiceProvider;
/**
* Class $Module$ServiceProvider
*
* Service provider for module $Module$
*
* @package Modules\$Module$\Providers
*/
class $Module$ServiceProvider extends ServiceProvider
{
/**
* Set module Alias
*/
protected function setModuleAlias()
{
$this->alias = strtolower('$module$');
}
/**
* Set path to module
*/
protected function setModulePath()
{
$this->path = __DIR__;
}
}
@@ -0,0 +1,24 @@
<?php
namespace Modules\$ModuleNamespace$\Repositories;
use $EntityNamespace$\$Entity$ as $Entity$Entity;
class $Module$Repository {
/**
* Create new instance of entity
*
* @param $data
*/
public function create($data) {
$Entity$Entity::create($data);
}
/**
* Update entity
*
* @param $Entity$Entity $entity
*/
public function update($Entity$Entity $entity, $data) {
$entity->update($data);
}
}
@@ -0,0 +1,13 @@
<?php
return [
'name' => '$Module$',
'new' => 'Vytvořit nový',
'description' => '',
'successfullyUpdated' => 'Úspěšně upraveno.',
'successfullyCreated' => 'Úspěšně vytvořeno.',
'successfullyDeleted' => 'Úspěšně smazáno.',
'overview' => 'Přehled',
'noItems' => 'Žádná data.',
'save' => 'Uložit'
];
@@ -0,0 +1,7 @@
@extends('admin.layoutWithNavigation')
@section('pageHeading', @trans('$module$::$module$.name'))
@section('content')
@include('$module$::admin/form', ['action' => route('$module$.new')])
@endsection
@@ -0,0 +1,7 @@
@extends('admin.layoutWithNavigation')
@section('pageHeading', @trans('$module$::$module$.name'))
@section('content')
@include('$module$::admin/form', ['action' => route('$module$.update')])
@endsection
@@ -0,0 +1,6 @@
<form action="{{$action}}" method="post">
{{--...--}}
<input type="submit" class="btn btn-primary" value="@lang('$module$::$module$.save')">
</form>
@@ -0,0 +1,17 @@
@extends('admin.layoutWithNavigation')
@section('pageHeading', @trans('$module$::$module$.overview'))
@section('content')
@if (!empty($items))
<table>
@foreach($items as $item)
@endforeach
</table>
@else
<div class="alert alert-info">
<em>@trans('$module$::$module$.noItems')</em>
</div>
@endif
@endsection
+71
View File
@@ -0,0 +1,71 @@
<?php
namespace App\CMS\Pipeline;
use App\CMS\Pipeline\Exceptions\InvalidProcessType;
abstract class AbstractPipeline {
protected $processes = [];
protected $beforeStart = null;
protected $beforeRender = null;
protected $acceptedProcessInterface = null;
/**
* check if given classname implements valid Process interface
*
* @param $classname
*
* @throws InvalidProcessType
*/
protected function checkValidProcess($classname)
{
if (is_null($this->acceptedProcessInterface))
return;
if (!in_array($this->acceptedProcessInterface, class_implements($classname))) {
throw new InvalidProcessType($classname);
}
}
/**
* Add new process into pipeline
*
* @param $process
*
* @return void
* @throws InvalidProcessType
*/
function add($process)
{
$this->checkValidProcess($process);
$this->processes[] = $process;
}
/**
* @param null $beforeStart
*/
public function setBeforeStart($beforeStart)
{
$this->checkValidProcess($beforeStart);
if (!is_null($this->beforeStart)) {
array_unshift($this->processes, $this->beforeStart);
}
$this->beforeStart = $beforeStart;
}
/**
* @param null $beforeRender
*/
public function setBeforeRender($beforeRender)
{
$this->checkValidProcess($beforeRender);
if (!is_null($this->beforeRender)) {
array_push($this->processes, $this->beforeRender);
}
$this->beforeRender = $beforeRender;
}
}
@@ -0,0 +1,58 @@
<?php
namespace App\CMS\Pipeline\DisplayPipeline;
use App\CMS\Contracts\Content\DisplayPipeline\Pipeline;
use App\CMS\Contracts\Content\DisplayPipeline\Process;
use App\CMS\Pipeline\AbstractPipeline;
use App\Models\Content\Content;
class DisplayPipeline extends AbstractPipeline implements Pipeline
{
/**
* DisplayPipeline constructor.
*/
public function __construct()
{
$this->acceptedProcessInterface = Process::class;
}
/**
* Run pipeline
*
* @param Content $page
*
* @return Content
*/
function run(Content $page)
{
$this->runBeforeStart($page);
foreach ($this->processes as $process) {
/**
* @var $run Process
*/
$run = new $process;
$run->handle($page);
}
$this->runBeforeRender($page);
return $page;
}
protected function runBeforeStart($page)
{
if (!is_null($this->beforeStart)) {
$process = new $this->beforeStart;
$process->handle($page);
}
}
protected function runBeforeRender($page)
{
if (!is_null($this->beforeRender)) {
$process = new $this->beforeRender;
$process->handle($page);
}
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\CMS\Pipeline\DisplayPipeline\Process;
use App\CMS\Contracts\Content\DisplayPipeline\Process;
use App\Models\Content\Content;
class AddViewedToPage implements Process {
/**
* Process and modify given page
*
* @param Content $page
*
* @return mixed
*/
function handle(Content & $page)
{
$page->view();
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\CMS\Pipeline\DisplayPipeline\Process;
use App\CMS\Contracts\Content\DisplayPipeline\Process;
use App\Models\Content\Content;
use Webwizo\Shortcodes\Facades\Shortcode;
class CompileShortcodes implements Process {
/**
* Process and modify given page
*
* @param Content $page
*
* @return mixed
*/
function handle(Content & $page)
{
$page->pageContent = Shortcode::compile($page->pageContent);
}
}
@@ -0,0 +1,6 @@
<?php
namespace App\CMS\Pipeline\Exceptions;
class InvalidProcessType extends \Exception
{
}
@@ -0,0 +1,20 @@
<?php
namespace App\CMS\Pipeline\SavePipeline\Process;
use App\CMS\Contracts\Content\SavePipeline\Process;
use App\Models\Content\Content;
class SaveCommonFields implements Process {
/**
* Process and modify given page
*
* @param Content $page
* @param array $input
*
* @return void
*/
function handle(Content & $page, array &$input)
{
($page->exists == false) ? $page = Content::create($input): $page->update($input);
}
}
@@ -0,0 +1,80 @@
<?php
namespace App\CMS\Pipeline\SavePipeline\Process;
use App\CMS\Contracts\Content\SavePipeline\Process;
use App\Models\Content\Content;
use App\Models\Content\ContentHasFile;
use App\Models\FileManager\Directory;
use App\Models\FileManager\File;
class UploadRelatedFiles implements Process
{
/**
* Process and modify given page
*
* @param Content $page
* @param array $input
*
* @return void
*/
function handle(Content & $page, array & $input)
{
if (!isset($input['files'])) {
return;
}
$files = $input['files'];
$assignedFiles = isset($input['keepAssigned']) ? $input['keepAssigned'] : [];
// check if any file was removed
$this->removeRelatedFiles($page, $assignedFiles);
// allow uploading only on created pages
if (!$page->id || !$files[0]) {
return;
}
// find or create new directory for files assigned to content
$directory = Directory::firstOrCreate([
'name' => '.content_files',
'hidden' => true
]);
$data = new \stdClass();
$data->directoryId = $directory->id;
$fileModel = app(File::class);
foreach ($files as $file) {
if (!$file) {
continue;
}
$uploaded = $fileModel->upload($file, $data);
// add assignement
ContentHasFile::create([
'file_id' => $uploaded['id'],
'content_id' => $page->id
]);
}
}
/**
* Delete files from association
*
* @param Content $page
* @param $assignedFiles
*/
private function removeRelatedFiles(Content $page, $assignedFiles)
{
$allFiles = $page->files()
->whereNotIn('id', array_keys($assignedFiles))
->get();
foreach ($allFiles as $file) {
ContentHasFile::where('content_id', $page->id)
->where('file_id', $file->id)
->delete();
}
}
}
@@ -0,0 +1,38 @@
<?php
namespace App\CMS\Pipeline\SavePipeline\Process;
use App\CMS\Contracts\Content\SavePipeline\Process;
use App\CMS\Helpers\RootDirectory;
use App\Models\Content\Content;
use App\Models\FileManager\File;
class UploadTitlePhoto implements Process
{
/**
* Process and modify given page
*
* @param Content $page
* @param array $input
*
* @return void
*/
function handle(Content & $page, array & $input)
{
$fileModel = app(File::class);
$titlePhoto = isset($input['titlePhotoFile']) ? $input['titlePhotoFile'] : null;
// upload file - if provided
$page->titlePhoto = isset($input['existingTitlePhoto']) ? $input['existingTitlePhoto'] : null;
if (!is_null($titlePhoto)) {
$root = RootDirectory::get();
$data = ['directoryId' => $root->id];
$file = $fileModel->upload($titlePhoto, (object)$data);
$page->titlePhoto = $file ? $file['filename'] : null;
}
$page->save();
}
}
@@ -0,0 +1,69 @@
<?php
namespace App\CMS\Pipeline\SavePipeline;
use App\CMS\Contracts\Content\SavePipeline\Pipeline;
use App\CMS\Contracts\Content\SavePipeline\Process;
use App\CMS\Pipeline\AbstractPipeline;
use App\Models\Content\Content;
class SavePipeline extends AbstractPipeline implements Pipeline
{
/**
* SavePipeline constructor.
*/
public function __construct()
{
$this->acceptedProcessInterface = Process::class;
}
/**
* Save content page
*
* @param Content $page
* @param array $input
*
* @return Content
*/
function run(Content & $page, array $input)
{
$this->runBeforeStart($page, $input);
foreach ($this->processes as $process) {
/**
* @var $run Process
*/
$run = new $process;
$run->handle($page, $input);
}
$this->runAfter($page, $input);
return $page;
}
/**
* Run process as first - if specified
*
* @param Content $page
* @param array $input
*/
protected function runBeforeStart(Content $page, array $input)
{
if (!is_null($this->beforeStart)) {
app($this->beforeStart)->handle($page, $input);
}
}
/**
* Run some process in the end - if exists
*
* @param Content $page
* @param array $input
*/
protected function runAfter(Content $page, array $input)
{
if (!is_null($this->beforeRender)) {
app($this->beforeRender)->handle($page, $input);
}
}
}
+7 -10
View File
@@ -46,7 +46,7 @@ class Content extends Repository implements IContent
public function all() public function all()
{ {
return $this->getPageQuery() return $this->getPageQuery()
->get(); ->get();
} }
/** /**
@@ -63,7 +63,7 @@ class Content extends Repository implements IContent
$page->status = IContent::STATUS_DRAFT; $page->status = IContent::STATUS_DRAFT;
$page->moduleSettings = []; $page->moduleSettings = [];
} else { } else {
$page = $this->model->findOrFail($id); $page = $this->model->findOrFail($id);
} }
return $page; return $page;
@@ -76,9 +76,8 @@ class Content extends Repository implements IContent
public function getHomepage() public function getHomepage()
{ {
return $this->getPageQuery() return $this->getPageQuery()
->where('isHomepage', 1) ->where('isHomepage', 1)
->first(); ->first();
} }
/** /**
@@ -91,8 +90,8 @@ class Content extends Repository implements IContent
public function getByURL($url) public function getByURL($url)
{ {
return $this->getPageQuery() return $this->getPageQuery()
->where('url', $url) ->where('url', $url)
->first(); ->first();
} }
/** /**
@@ -126,8 +125,6 @@ class Content extends Repository implements IContent
$query = $query->whereIn('contents.status', $statuses); $query = $query->whereIn('contents.status', $statuses);
} }
$pages = $query->paginate(setting('paginatedResults', 20)); return $query;
return $pages;
} }
} }
+28 -1
View File
@@ -1,4 +1,5 @@
<?php <?php
namespace App\CMS\Repositories\FileManager; namespace App\CMS\Repositories\FileManager;
use App\CMS\Helpers\RootDirectory; use App\CMS\Helpers\RootDirectory;
@@ -25,7 +26,33 @@ class Directory
return $exists->exists(); return $exists->exists();
} }
public function update(DirectoryModel $directory, $data) { /**
* Create new directory
*
* @param $data
*
* @return DirectoryModel
*/
public function create($data)
{
$directory = new DirectoryModel();
$directory->name = $data['name'];
$directory->parent_id = $data['parentDirectory'];
$directory->user_id = \Auth::user()->id;
$directory->description = $data['description'];
$directory->save();
return $directory;
}
/**
* Update given directory
*
* @param DirectoryModel $directory
* @param $data
*/
public function update(DirectoryModel $directory, $data)
{
$directory->name = $data['name']; $directory->name = $data['name'];
$directory->description = $data['description']; $directory->description = $data['description'];
$directory->save(); $directory->save();
+16
View File
@@ -0,0 +1,16 @@
<?php
namespace App\CMS\Repositories\FileManager;
use App\Models\FileManager\File as FileModel;
class File {
/**
* Update given instance of File
*
* @param FileModel $file
* @param $data
*/
public function update(FileModel $file, $data) {
$file->update($data);
}
}
@@ -1,27 +1,26 @@
<?php <?php
namespace App\Models\ModelTraits;
namespace App\CMS\Repositories\Settings;
use App\Models\Settings as SettingsModel; use App\Models\Settings as SettingsModel;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization; use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
trait Settings class Settings
{ {
/** /**
* Prepares common query for selecting settings * Prepares common query for selecting settings
*
* @return mixed * @return mixed
*/ */
protected function getSettingsQuery() protected function getSettingsQuery()
{ {
return SettingsModel::select(['key', 'value', 'language']) return SettingsModel::select(['key', 'value', 'language'])
->where('language', LaravelLocalization::getCurrentLocale()) ->where('language', LaravelLocalization::getCurrentLocale())
->orWhere('language', null) ->orWhere('language', null)
->orderBy('language', 'ASC'); ->orderBy('language', 'ASC');
} }
/** /**
* Load all settings * Load all settings
*
* @return \stdClass * @return \stdClass
*/ */
public function getAll() public function getAll()
@@ -34,7 +33,6 @@ trait Settings
/** /**
* Get all settings with language info * Get all settings with language info
*
* @return \stdClass * @return \stdClass
*/ */
public function getAllWithLanguage() public function getAllWithLanguage()
@@ -55,7 +53,6 @@ trait Settings
/** /**
* Load only config for views * Load only config for views
*
* @return \stdClass * @return \stdClass
*/ */
public function getForView() public function getForView()
@@ -83,4 +80,29 @@ trait Settings
return $data; return $data;
} }
/**
* Save settings
*
* @param array $data
*/
public function save(array $data)
{
$commonSettings = isset($data['commonSettings']) ? $data['commonSettings'] : [];
unset($data['commonSettings']);
foreach ($data as $key => $value) {
// select language for this setting key
$language = isset($commonSettings[$key]) ? null : LaravelLocalization::getCurrentLocale();
$setting = SettingsModel::firstOrNew(['language' => $language, 'key' => $key]);
if ($setting->value == $value) {
continue;
}
// set value and save or delete
$setting->value = $value;
empty($value) ? $setting->delete() : $setting->save();
}
}
} }
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace App\CMS\Repositories\Users;
use App\CMS\Repositories\Repository;
use App\Models\User as UserModel;
use Illuminate\Support\Facades\Hash;
class User extends Repository {
/**
* Update given user
*
* @param UserModel $user
* @param $data
*/
public function update(UserModel $user, $data) {
// update username if set
if (isset($data['username'])) {
$user->username = $data['username'];
}
// change name (if set)
if (isset($data['name'])) {
$user->name = $data['name'];
}
if (isset($data['role'])) {
$user->role = $data['role'];
}
if (isset($data['status'])) {
$user->status = $data['status'];
}
if (isset($data['password'])) {
$user->password = Hash::make($data['password']);
}
$user->email = $data['email'];
$user->save();
}
/**
* Create new user
*
* @param $data
*
* @return UserModel
*/
public function create($data)
{
// create new user
$user = new UserModel();
$user->name = $data['name'];
$user->email = $data['email'];
$user->username = $data['username'];
$user->role = $data['role'];
$user->password = Hash::make($data['password']);
// store user into database
$user->save();
return $user;
}
}
+52
View File
@@ -0,0 +1,52 @@
<?php
namespace App\CMS\Repositories\Widgets;
use App\Http\Requests\Request;
use App\Models\Widgets\Widget as WidgetModel;
use App\Models\Widgets\WidgetType;
use Illuminate\Support\Facades\Event;
class Widget
{
public function createNew(WidgetType $widgetType, Request $request)
{
$data = $request->except('_token');
// create new widget
$widget = new WidgetModel();
$widget->widget_type_handler = $widgetType->handler;
$widget->user_id = \Auth::user()->id;
$widget->name = $data['name'];
$widget->description = $data['description'];
$widget->container_class = $data['containerClass'];
$widget->container_id = empty($data['containerId']) ? null : $data['containerId'];
$widget->settings = call_user_func([$widgetType->handler, 'save'], $request);
// save into database
$widget->save();
// fire event with newly created widget
Event::fire(new \App\Events\CreateNewWidget($widget));
return $widget;
}
public function edit(WidgetModel $widget, Request $request)
{
// update name
$widget->name = $request->name;
$widget->container_class = $request->containerClass;
$widget->container_id = empty($request->containerId) ? null : $request->containerId;
$widget->description = $request->description;
// try to save this widget
$widget->settings = call_user_func([$widget->widget_type_handler, 'save'], $request);
// save into database
$widget->save();
// fire event with editing widget
Event::fire(new \App\Events\EditWidget($widget));
}
}
@@ -0,0 +1,55 @@
<?php
namespace App\CMS\Repositories\Widgets;
use App\Events\CreateNewWidgetArea;
use App\Http\Requests\Request;
use App\Models\Widgets\Widget;
use App\Models\Widgets\WidgetArea as WidgetAreaModel;
use Illuminate\Support\Facades\Event;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class WidgetArea
{
public function getWidgets($uniqueCode = false)
{
$widgets = Widget::select('widgets.*', 'widgets.widget_type_handler', 'widget_areas.code as widget_area_code', 'widgets.name as widget_name', 'widgets.settings')
->join('widget_in_widget_area', 'widget_in_widget_area.widget_id', '=', 'widgets.id')
->join('widget_areas', 'widget_in_widget_area.widget_area_id', '=', 'widget_areas.id')
->where('language', LaravelLocalization::getCurrentLocale())
->orderBy('widget_in_widget_area.position');
if (!$uniqueCode) {
$widgets = $widgets->where('widget_areas.viewed', '>=', setting('preloadFrequentedWidgetAreasTreshold', 10));
} else {
$widgets = $widgets->where('code', $uniqueCode);
}
return $widgets;
}
public function update(\App\Models\Widgets\WidgetArea $area, Request $request) {
$area->name = $request->name;
$area->description = $request->description;
$area->save();
// fire event with new widget area
Event::fire(new \App\Events\EditWidgetArea($area));
}
/**
* Create new instance of widget area
*
* @param Request $request
*/
public function create(Request $request)
{
$area = WidgetAreaModel::create([
'code' => $request->code,
'name' => $request->name,
'description' => $request->description
]);
// fire event with new widget area
Event::fire(new CreateNewWidgetArea($area));
}
}
+5 -2
View File
@@ -1,13 +1,15 @@
<?php <?php
namespace App\CMS\Widgets\Menu; namespace App\CMS\Widgets\Menu;
use App\CMS\Contracts\Repositories\Content as IContent;
use App\CMS\Contracts\Widgets\PublicWidget; use App\CMS\Contracts\Widgets\PublicWidget;
use App\CMS\Widgets\Contracts\WidgetRenderer; use App\CMS\Contracts\Widgets\WidgetRenderer;
use App\CMS\Widgets\Exceptions\MissingParameterException; use App\CMS\Widgets\Exceptions\MissingParameterException;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\Content\Content; use App\Models\Content\Content;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization; use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use App\CMS\Contracts\Repositories\Content as IContent; use Modules\Blog\Article\Handlers\Article;
class Menu implements PublicWidget class Menu implements PublicWidget
{ {
@@ -76,6 +78,7 @@ class Menu implements PublicWidget
$pages = Content::where('language', LaravelLocalization::getCurrentLocale()) $pages = Content::where('language', LaravelLocalization::getCurrentLocale())
->whereIn('id', $ids) ->whereIn('id', $ids)
->whereIn('status', $allowedStatuses) ->whereIn('status', $allowedStatuses)
->where('moduleHandler', '!=', Article::class)
->get(); ->get();
$used = []; $used = [];
foreach ($pages as $page) { foreach ($pages as $page) {
+10 -13
View File
@@ -1,4 +1,5 @@
<?php <?php
namespace App\CMS\Widgets\Menu\Presenters; namespace App\CMS\Widgets\Menu\Presenters;
use App\CMS\Contracts\Repositories\Content as ContentContract; use App\CMS\Contracts\Repositories\Content as ContentContract;
@@ -6,9 +7,7 @@ use App\CMS\Contracts\Widgets\WidgetRenderer;
use App\CMS\Widgets\Menu\Menu as WidgetMenu; use App\CMS\Widgets\Menu\Menu as WidgetMenu;
use App\Models\Widgets\Widget; use App\Models\Widgets\Widget;
use App\Models\Widgets\WidgetType; use App\Models\Widgets\WidgetType;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
class Menu implements WidgetRenderer class Menu implements WidgetRenderer
@@ -36,8 +35,8 @@ class Menu implements WidgetRenderer
return $a->order - $b->order; return $a->order - $b->order;
}); });
$route = Request::route() $routeName = Route::current()
->getName(); ->getName();
$parameters = Route::current() $parameters = Route::current()
->parameters(); ->parameters();
@@ -55,7 +54,7 @@ class Menu implements WidgetRenderer
} }
$page = $pages[$pageId]; $page = $pages[$pageId];
$active = ($page->isHomepage && $route == 'page.index') || ($route == 'page.content' && isset($parameters['url']) && $parameters['url'] == $page->url); $active = ($page->isHomepage && $routeName == 'page.index') || ($routeName == 'page.content' && isset($parameters['url']) && $parameters['url'] == $page->url);
$route = $page->isHomepage ? route('page.index') : route('page.content', ['url' => $page->url]); $route = $page->isHomepage ? route('page.index') : route('page.content', ['url' => $page->url]);
$code .= '<li'; $code .= '<li';
@@ -83,15 +82,14 @@ class Menu implements WidgetRenderer
$content = app(ContentContract::class); $content = app(ContentContract::class);
// get list of all pages // get list of all pages
$pages = $content->getOverview(); $pages = $content->getOverview()
$widget->settings = new \stdClass(); ->get();
$widget->settings->links = [];
return view('admin.widgets.menu.new', [ return view('admin.widgets.menu.new', [
'type' => $type, 'type' => $type,
'widget' => $widget, 'widget' => $widget,
'pages' => $pages, 'pages' => $pages,
'links' => []
]); ]);
} }
@@ -110,7 +108,8 @@ class Menu implements WidgetRenderer
$content = App::make(ContentContract::class); $content = App::make(ContentContract::class);
// get list of all pages // get list of all pages
$pages = $content->getOverview(); $pages = $content->getOverview()
->get();
// make object from JSON // make object from JSON
if (!isset($widget->settings->links)) { if (!isset($widget->settings->links)) {
@@ -124,8 +123,6 @@ class Menu implements WidgetRenderer
return $a->order - $b->order; return $a->order - $b->order;
}); });
$widget->settings->links = (object)$links; return view('admin.widgets.menu.edit', ['widget' => $widget, 'pages' => $pages, 'links' => (object)$links]);
return view('admin.widgets.menu.edit', ['widget' => $widget, 'pages' => $pages]);
} }
} }
+116
View File
@@ -0,0 +1,116 @@
<?php
namespace App\Console\Commands\Modules;
use Illuminate\Console\Command;
use Illuminate\Support\Str;
class CreateNew extends Command
{
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'module:new
{name : module name}
{parentModule? : name of parent module}
{--entity= : entity}';
/**
* The console command description.
* @var string
*/
protected $description = 'Create new CMS module.';
protected $moduleName;
protected $moduleNamespace;
protected $entity;
protected $entityNamespace;
/**
* Execute the console command.
*/
public function handle()
{
$defaultEntityNamespace = $this->loadArguments();
$path = preg_replace('|/{2,}|i', '/', config('modules.paths.modules') . '/' . $this->moduleNamespace);
if (is_dir($path)) {
$this->error('Module already exists in ' . $path);
return;
}
// copy stub files
\File::copyDirectory(config('modules.paths.stubs'), $path);
$files = \File::allFiles($path);
foreach ($files as $file) {
$newName = str_replace('stub', 'php', $this->replacePlaceholders($file->getPathname()));
// ignore new entity when using existing entity
if ($this->entityNamespace != $defaultEntityNamespace && Str::contains('Entities', $file)) {
\File::delete($file);
continue;
}
// rename file
\File::move($file, $newName);
// change its content
$content = file_get_contents($newName);
$content = $this->replacePlaceholders($content);
file_put_contents($newName, $content);
}
$this->info('Module successfully created.');
}
/**
* Find and replace all placeholders in given content
*
* @param $content
*
* @return mixed
*/
private function replacePlaceholders($content)
{
$replace = [
'$Module$' => $this->moduleName,
'$ModuleNamespace$' => str_replace('/', '\\', $this->moduleNamespace),
'$module$' => strtolower($this->moduleName),
'$EntityNamespace$' => $this->entityNamespace,
'$Entity$' => $this->entity
];
foreach ($replace as $what => $for) {
$content = str_replace($what, $for, $content);
}
return $content;
}
/**
* Load command arguments
* @return string
*/
private function loadArguments()
{
$parent = $this->argument('parentModule');
$this->moduleName = $moduleName = $this->argument('name');
$this->moduleNamespace = trim($parent . '/' . $moduleName, '/');
$entity = $this->option('entity');
$defaultEntityNamespace = '\\Modules\\' . str_replace('/', '\\', $this->moduleNamespace) . '\Entities\\';
if (!empty($entity)) {
$parts = explode('\\', $entity);
$this->entity = $parts[count($parts) - 1];
unset($parts[count($parts) - 1]);
$this->entityNamespace = implode('\\', $parts);
} else {
$this->entityNamespace = $defaultEntityNamespace;
$this->entity = $this->moduleName;
}
return $defaultEntityNamespace;
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Console\Commands\Modules;
use App\Models\Module;
use Illuminate\Console\Command;
class DisableModule extends Command
{
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'module:disable {module}';
/**
* The console command description.
* @var string
*/
protected $description = 'Disable module';
/**
* Execute the console command.
* @return mixed
*/
public function handle()
{
$moduleName = $this->argument('module');
$module = Module::where('static_name', $moduleName)
->firstOrFail();
if ($module->has_submodules) {
$submodules = $module->submodules;
foreach ($submodules as $submodule) {
$this->call('module:disable', ['module' => $submodule->static_name]);
}
}
$module->enabled = false;
$module->save();
$this->line('Module ' . $module->static_name . ' disabled.');
}
}
@@ -0,0 +1,48 @@
<?php
namespace App\Console\Commands\Modules;
use App\Models\Module;
use Illuminate\Console\Command;
class EnableModule extends Command
{
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'module:enable {module}';
/**
* The console command description.
* @var string
*/
protected $description = 'Enable module';
/**
* Execute the console command.
* @return mixed
*/
public function handle()
{
$moduleName = $this->argument('module');
$module = Module::where('static_name', $moduleName)
->firstOrFail();
if ($module->has_submodules) {
$submodules = $module->submodules;
foreach ($submodules as $submodule) {
$this->call('module:enable', ['module' => $submodule->static_name]);
}
}
if ($module->parent_id) {
$module->parent->update(['enabled' => true]);
}
$module->enabled = true;
$module->save();
$this->line('Module ' . $module->static_name . ' enabled.');
}
}
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Console\Commands; namespace App\Console\Commands\Modules;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\File;
@@ -12,7 +12,7 @@ class InstallAllModules extends Command
* *
* @var string * @var string
*/ */
protected $signature = 'install-all-modules'; protected $signature = 'module:install-all';
/** /**
* The console command description. * The console command description.
* *
@@ -20,16 +20,6 @@ class InstallAllModules extends Command
*/ */
protected $description = 'Crawl /modules directory and install all modules'; protected $description = 'Crawl /modules directory and install all modules';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/** /**
* Execute the console command. * Execute the console command.
* *
@@ -45,7 +35,7 @@ class InstallAllModules extends Command
// try to install each module // try to install each module
try { try {
$this->call('install-module', ['name' => $moduleName]); $this->call('module:install', ['name' => $moduleName]);
} catch (\Exception $e) { } catch (\Exception $e) {
$this->line('Module ' . $moduleName . ' already installed.'); $this->line('Module ' . $moduleName . ' already installed.');
} }
@@ -1,8 +1,9 @@
<?php <?php
namespace App\Console\Commands; namespace App\Console\Commands\Modules;
use App\Models\Module; use App\Models\Module;
use App\ModuleManager\Installer;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Contracts\Filesystem\FileNotFoundException; use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
@@ -17,7 +18,7 @@ class InstallModule extends Command
* *
* @var string * @var string
*/ */
protected $signature = 'install-module {name} {parentModuleId?}'; protected $signature = 'module:install {name} {parentModuleId?}';
/** /**
* The console command description. * The console command description.
* *
@@ -154,14 +155,12 @@ class InstallModule extends Command
if (is_null($module)) { if (is_null($module)) {
// insert module into database // insert module into database
$settings = [ $settings = [
'staticName' => $this->moduleName,
'providers' => $providers, 'providers' => $providers,
'aliases' => isset($config['aliases']) ? $config['aliases'] : [],
'order' => isset($config['order']) ? $config['order'] : 0, 'order' => isset($config['order']) ? $config['order'] : 0,
'files' => isset($config['files']) ? $config['files'] : [] 'files' => isset($config['files']) ? $config['files'] : []
]; ];
$module = Module::install($name, $alias, $description, $handler, $this->parentModuleId, $settings); $module = Installer::install($name, $alias, $this->moduleName, $description, $handler, $this->parentModuleId, $settings);
} }
// try to install submodules // try to install submodules
@@ -184,7 +183,7 @@ class InstallModule extends Command
$submodule = str_replace($this->modulesPath . DIRECTORY_SEPARATOR, '', $submodulePath); $submodule = str_replace($this->modulesPath . DIRECTORY_SEPARATOR, '', $submodulePath);
try { try {
$this->call('install-module', ['name' => $submodule, 'parentModuleId' => $parentModule->id]); $this->call('module:install', ['name' => $submodule, 'parentModuleId' => $parentModule->id]);
} catch (\Exception $e) { } catch (\Exception $e) {
$this->error($e->getMessage()); $this->error($e->getMessage());
} }
@@ -0,0 +1,42 @@
<?php
namespace App\Console\Commands\Modules;
use App\Models\Module;
use Illuminate\Console\Command;
class ModuleMigrate extends Command
{
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'module:migrate {module}';
/**
* The console command description.
* @var string
*/
protected $description = 'Run migrations in specified module';
/**
* Execute the console command.
* @return mixed
*/
public function handle()
{
$moduleName = $this->argument('module');
$module = Module::where('static_name', $moduleName)
->firstOrFail();
if ($module->has_submodules) {
$submodules = $module->submodules;
foreach ($submodules as $submodule) {
$this->call('module:migrate', ['module' => $submodule->static_name]);
}
}
$this->line('Migrating ' . $module->static_name);
$this->call('migrate', ['--path' => config('modules.paths.modules').'/'.$moduleName.'/Database']);
}
}
@@ -12,7 +12,6 @@ class PublishTemplateResources extends Command
* @var string * @var string
*/ */
protected $signature = 'template:publish'; protected $signature = 'template:publish';
/** /**
* The console command description. * The console command description.
* *
@@ -27,6 +26,7 @@ class PublishTemplateResources extends Command
*/ */
public function handle() public function handle()
{ {
$this->call('cache:clear');
$this->call('vendor:publish', ['--tag' => 'module-views', '--force' => true]); $this->call('vendor:publish', ['--tag' => 'module-views', '--force' => true]);
$this->call('vendor:publish', ['--tag' => 'public-assets', '--force' => true]); $this->call('vendor:publish', ['--tag' => 'public-assets', '--force' => true]);
} }
+9 -6
View File
@@ -3,6 +3,8 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\Models\Module; use App\Models\Module;
use App\ModuleManager\Installer;
use App\ModuleManager\Uninstaller;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -43,14 +45,13 @@ class SetTemplate extends Command
$config['staticName'] = $template; $config['staticName'] = $template;
if ($current) { if ($current) {
$info = json_decode($current->module_settings); $this->line('Template is already installed. Currently using template ' . trans($current->name) . ' located in /templates/' . $current->static_name . '.');
$this->line('Template is already installed. Currently using template ' . trans($current->name) . ' located in /templates/' . $info->staticName . '.');
$confirm = $this->confirm('Uninstall it and install *' . trans($config['name']) . '*? All data associated with installed template will be lost!'); $confirm = $this->confirm('Uninstall it and install *' . trans($config['name']) . '*? All data associated with installed template will be lost!');
if ($confirm) { if ($confirm) {
$this->line('Uninstalling ' . $current->name . '.'); $this->line('Uninstalling ' . $current->name . '.');
$current->uninstall();
Uninstaller::uninstall($current);
} else { } else {
$this->line('Aborting installation.'); $this->line('Aborting installation.');
return; return;
@@ -58,7 +59,7 @@ class SetTemplate extends Command
} }
try { try {
Module::install($config['name'], $config['alias'], $config['description'], $config['handler'], false, $config); Installer::install($config['name'], $config['alias'], $current->static_name, $config['description'], $config['handler'], false, $config);
} catch (\Exception $e) { } catch (\Exception $e) {
$this->error('Cannot install template ' . $template . '. Message: ' . $e->getMessage()); $this->error('Cannot install template ' . $template . '. Message: ' . $e->getMessage());
return; return;
@@ -72,6 +73,8 @@ class SetTemplate extends Command
// run again artisan for publishing resources // run again artisan for publishing resources
// it cannot be done using $this->call, because we need to load different template into service providers // it cannot be done using $this->call, because we need to load different template into service providers
exec('php artisan vendor:publish'); if ($publish) {
exec('php artisan vendor:publish');
}
} }
} }
+41
View File
@@ -0,0 +1,41 @@
<?php
namespace App\Console\Commands;
use App\CMS\Helpers\CurrentTemplate;
use Illuminate\Console\Command;
class TemplateInfo extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'template:info';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Show details about currently set template';
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$template = CurrentTemplate::get();
if (is_null($template)) {
$this->error('No template set.');
return;
}
$this->line($template->name);
$this->line($template->handler);
}
}
+42
View File
@@ -0,0 +1,42 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class UninstallModule extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:name';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
}
}
+13 -6
View File
@@ -2,7 +2,12 @@
namespace App\Console; namespace App\Console;
use App\Console\Commands\Modules\CreateNew;
use App\Console\Commands\Modules\DisableModule;
use App\Console\Commands\Modules\EnableModule;
use App\Console\Commands\Modules\ModuleMigrate;
use App\Console\Commands\PublishTemplateResources; use App\Console\Commands\PublishTemplateResources;
use App\Console\Commands\TemplateInfo;
use Illuminate\Console\Scheduling\Schedule; use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel; use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
@@ -10,20 +15,24 @@ class Kernel extends ConsoleKernel
{ {
/** /**
* The Artisan commands provided by your application. * The Artisan commands provided by your application.
*
* @var array * @var array
*/ */
protected $commands = [ protected $commands = [
Commands\NewUser::class, Commands\NewUser::class,
Commands\ChangePassword::class, Commands\ChangePassword::class,
Commands\InstallModule::class, CreateNew::class,
Commands\InstallAllModules::class, ModuleMigrate::class,
EnableModule::class,
DisableModule::class,
Commands\Modules\InstallModule::class,
Commands\Modules\InstallAllModules::class,
Commands\TranslateDirectory::class, Commands\TranslateDirectory::class,
Commands\TranslateAll::class, Commands\TranslateAll::class,
Commands\InitDatabaseSchema::class, Commands\InitDatabaseSchema::class,
Commands\SetTemplate::class, Commands\SetTemplate::class,
Commands\AddLanguage::class, Commands\AddLanguage::class,
PublishTemplateResources::class PublishTemplateResources::class,
TemplateInfo::class
]; ];
/** /**
@@ -35,7 +44,5 @@ class Kernel extends ConsoleKernel
*/ */
protected function schedule(Schedule $schedule) protected function schedule(Schedule $schedule)
{ {
// $schedule->command('inspire')
// ->hourly();
} }
} }
+1 -2
View File
@@ -2,7 +2,7 @@
namespace App\Events; namespace App\Events;
use App\Models\WidgetArea; use App\Models\Widgets\WidgetArea;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
class DeleteWidgetArea extends Event class DeleteWidgetArea extends Event
@@ -20,7 +20,6 @@ class DeleteWidgetArea extends Event
*/ */
public function __construct(WidgetArea $widgetArea) public function __construct(WidgetArea $widgetArea)
{ {
//
$this->widgetArea = $widgetArea; $this->widgetArea = $widgetArea;
} }
} }
+1 -3
View File
@@ -2,10 +2,8 @@
namespace App\Events; namespace App\Events;
use App\Events\Event; use App\Models\Widgets\WidgetArea;
use App\Models\WidgetArea;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class EditWidgetArea extends Event class EditWidgetArea extends Event
{ {
+10 -14
View File
@@ -2,37 +2,33 @@
namespace App\Events; namespace App\Events;
use App\Models\FileManager\File as FileModel;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class UploadFile extends Event class UploadFile extends Event
{ {
use SerializesModels; use SerializesModels;
public $uploadedFile;
/** /**
* @var UploadedFile * @var FileModel
*/ */
private $uploadedFile; public $file;
/**
* @var
*/
private $id;
/** /**
* Create a new event instance. * Create a new event instance.
* *
* @param File $uploadedFile * @param FileModel $file
* @param $id * @param $id
*
* @internal param File $uploadedFile
*/ */
public function __construct(File $uploadedFile, $id) public function __construct(FileModel $file)
{ {
$this->uploadedFile = $uploadedFile; $this->file = $file;
$this->id = $id;
} }
/** /**
* Get the channels the event should be broadcast on. * Get the channels the event should be broadcast on.
*
* @return array * @return array
*/ */
public function broadcastOn() public function broadcastOn()
@@ -7,6 +7,8 @@ use App\CMS\Interactions\Admin\Content\ChangeStatus;
use App\CMS\Interactions\Admin\Content\DeletePage; use App\CMS\Interactions\Admin\Content\DeletePage;
use App\CMS\Interactions\Admin\Content\SetHomepage; use App\CMS\Interactions\Admin\Content\SetHomepage;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Models\Content\Content;
use App\Models\Content\ContentHistory;
class ContentActions extends Controller class ContentActions extends Controller
{ {
@@ -25,15 +27,13 @@ class ContentActions extends Controller
* This method is called in static page overview from quick actions. It checks if status is valid, if page exists * This method is called in static page overview from quick actions. It checks if status is valid, if page exists
* and updates status. * and updates status.
* *
* @param $id * @param Content $page
* @param $status * @param $status
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
public function changeStatus($id, $status) public function changeStatus(Content $page, $status)
{ {
$page = $this->content->getOne($id);
Interaction::handle(ChangeStatus::class, ['status' => $status], $page); Interaction::handle(ChangeStatus::class, ['status' => $status], $page);
// redirect back to overview with info for user // redirect back to overview with info for user
@@ -45,14 +45,12 @@ class ContentActions extends Controller
/** /**
* Delete page * Delete page
* *
* @param $id * @param Content $page
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
public function delete($id) public function delete(Content $page)
{ {
$page = $this->content->getOne($id);
Interaction::handle(DeletePage::class, [], $page); Interaction::handle(DeletePage::class, [], $page);
// redirect back to overview with info for user // redirect back to overview with info for user
@@ -66,14 +64,12 @@ class ContentActions extends Controller
/** /**
* Sets page as homepage * Sets page as homepage
* *
* @param $id * @param Content $page
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
public function setHomepage($id) public function setHomepage(Content $page)
{ {
$page = $this->content->getOne($id);
Interaction::handle(SetHomepage::class, [], $page); Interaction::handle(SetHomepage::class, [], $page);
// redirect back to overview with info for user // redirect back to overview with info for user
@@ -5,6 +5,7 @@ use App\CMS\Contracts\Repositories\Content as IContent;
use App\CMS\Contracts\Repositories\Module as IModule; use App\CMS\Contracts\Repositories\Module as IModule;
use App\CMS\Enumerations\ContentStatuses; use App\CMS\Enumerations\ContentStatuses;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Models\Module;
class ContentOverview extends Controller class ContentOverview extends Controller
{ {
@@ -26,20 +27,21 @@ class ContentOverview extends Controller
/** /**
* Overview for all content pages. * Overview for all content pages.
* *
* @param null|int $moduleId * @param Module|null $module
* @param null $status * @param null $status
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @internal param int|null $moduleId
*/ */
public function index($moduleId = null, $status = null) public function index(Module $module = null, $status = null)
{ {
// get module settings // get module settings
$module = $this->module->getOne($moduleId);
$pageHeading = $this->module->getOverviewTitle($module); $pageHeading = $this->module->getOverviewTitle($module);
// get pages for overview // get pages for overview
$handler = $module !== null ? $module->handler : null; $handler = $module->exists ? $module->handler : null;
$pages = $this->content->getOverview($handler, [$status]); $pages = $this->content->getOverview($handler, [$status])
->paginate(setting('paginatedResults', 20));
// get homepage - for checking if homepage is set and available // get homepage - for checking if homepage is set and available
$homepage = $this->content->getHomepage(); $homepage = $this->content->getHomepage();
@@ -4,13 +4,14 @@ namespace App\Http\Controllers\Admin\Contents;
use App\CMS\Contracts\Repositories\Content as IContent; use App\CMS\Contracts\Repositories\Content as IContent;
use App\CMS\Contracts\Repositories\Module as IModuleRepository; use App\CMS\Contracts\Repositories\Module as IModuleRepository;
use App\CMS\Contracts\Repositories\Template as ITemplate; use App\CMS\Contracts\Repositories\Template as ITemplate;
use Modules\Categories\Contracts\Repositories\Category as ICategory;
use App\CMS\Enumerations\ContentStatuses; use App\CMS\Enumerations\ContentStatuses;
use App\Cms\Handlers\Interactions\Interaction; use App\Cms\Handlers\Interactions\Interaction;
use App\Cms\Interactions\Admin\Content\NewContent; use App\Cms\Interactions\Admin\Content\NewContent;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\CreateNewContentRequest; use App\Http\Requests\CreateNewContentRequest;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\Module;
use Modules\Categories\Contracts\Repositories\Category as ICategory;
/** /**
* Class CreateNewContent * Class CreateNewContent
@@ -67,9 +68,8 @@ class CreateNewContent extends Controller
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function create($module) public function create(Module $module)
{ {
$module = $this->module->getOne($module);
$statuses = ContentStatuses::getWithTranslations(); $statuses = ContentStatuses::getWithTranslations();
$pageHeading = $this->module->getCreateContentTitle($module); $pageHeading = $this->module->getCreateContentTitle($module);
$templates = $this->template->getForModule($module); $templates = $this->template->getForModule($module);
@@ -85,7 +85,8 @@ class CreateNewContent extends Controller
'module' => $module, 'module' => $module,
'categories' => $categories, 'categories' => $categories,
'page' => $page, 'page' => $page,
'rootPages' => $this->content->getOverview(), 'rootPages' => $this->content->getOverview()
->get(),
'formSectionNames' => call_user_func([$module->handler, 'getExtendedFormSections']), 'formSectionNames' => call_user_func([$module->handler, 'getExtendedFormSections']),
'formSections' => call_user_func([$module->handler, 'getExtendedFormInputsCreate']), 'formSections' => call_user_func([$module->handler, 'getExtendedFormInputsCreate']),
]); ]);
@@ -94,20 +95,16 @@ class CreateNewContent extends Controller
/** /**
* Save new content page * Save new content page
* *
* @param CreateNewContentRequest $request * @param CreateNewContentRequest|Request $request
* @param $moduleId * @param Module $module
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @internal param $moduleId
*/ */
public function store(Request $request, $moduleId) public function store(Request $request, Module $module)
{ {
$module = $this->module->getOne($moduleId);
$titlePhoto = $request->file('titlePhoto');
$relatedFiles = $request->all()['files'];
// create new page // create new page
Interaction::handle(NewContent::class, $request->all(), $module->handler, $titlePhoto, $relatedFiles); Interaction::handle(NewContent::class, $request->all(), $module->handler);
return redirect() return redirect()
->route('content.overview') ->route('content.overview')
@@ -17,6 +17,7 @@ use App\Models\Content\ContentHistory;
use App\Models\FileManager\File; use App\Models\FileManager\File;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use Modules\Categories\Contracts\Repositories\Category as ICategory; use Modules\Categories\Contracts\Repositories\Category as ICategory;
use Modules\Categories\Repositories\Category;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class EditContent extends Controller class EditContent extends Controller
@@ -58,7 +59,7 @@ class EditContent extends Controller
* @param ICategory $category * @param ICategory $category
* @param ITemplate $template * @param ITemplate $template
*/ */
public function __construct(ContentHistory $history, File $file, IContent $content, IModuleRepository $module, ICategory $category, ITemplate $template) public function __construct(ContentHistory $history, File $file, IContent $content, IModuleRepository $module, Category $category, ITemplate $template)
{ {
$this->history = $history; $this->history = $history;
$this->file = $file; $this->file = $file;
@@ -71,14 +72,13 @@ class EditContent extends Controller
/** /**
* Display form for editing static page * Display form for editing static page
* *
* @param $id * @param Content $page
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function edit($id) public function edit(Content $page)
{ {
$statuses = ContentStatuses::getWithTranslations(); $statuses = ContentStatuses::getWithTranslations();
$page = $this->content->getOne($id);
// get module ID // get module ID
$module = $this->module->getByHandler($page->moduleHandler); $module = $this->module->getByHandler($page->moduleHandler);
@@ -87,9 +87,6 @@ class EditContent extends Controller
$categories = $this->category->getForModule($module); $categories = $this->category->getForModule($module);
$history = $this->history->getStructuredHistoryOf($page); $history = $this->history->getStructuredHistoryOf($page);
// modify data for edit form according to installed template
CurrentTemplate::beforePopulatingEditForm($page);
// render view // render view
return view('admin.content.edit', [ return view('admin.content.edit', [
'pageHeading' => $pageHeading, 'pageHeading' => $pageHeading,
@@ -97,7 +94,7 @@ class EditContent extends Controller
'page' => $page, 'page' => $page,
'module' => $module, 'module' => $module,
'categories' => $categories, 'categories' => $categories,
'rootPages' => $this->content->getOverview(), 'rootPages' => $this->content->getOverview()->get(),
'templates' => $templates, 'templates' => $templates,
'formSectionNames' => $this->module->call($module, 'getExtendedFormSections'), 'formSectionNames' => $this->module->call($module, 'getExtendedFormSections'),
'formSections' => $this->module->call($module, 'getExtendedFormInputsEdit'), 'formSections' => $this->module->call($module, 'getExtendedFormInputsEdit'),
@@ -108,34 +105,16 @@ class EditContent extends Controller
/** /**
* Edit static page and save changes into history. * Edit static page and save changes into history.
* *
* @param EditContentRequest $request * @param EditContentRequest|Request $request
* @param $id * @param Content $page
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @internal param $id
*/ */
public function update(Request $request, $id) public function update(Request $request, Content $page)
{ {
try {
/**
* @var $page Content
*/
$page = $this->content->getOne($id);
} catch (NotFoundHttpException $e) {
// log attempt of invalid edit
Event::fire(new AttemptToEditInvalidContent($id));
// page for editing not found
return redirect()
->route('content.overview')
->with('error', trans('admin/contents.invalidPage'));
}
// edit page // edit page
$titlePhoto = $request->file('titlePhoto'); Interaction::handle(EditContentInteraction::class, $request->all(), $page);
$relatedFiles = $request->all()['files'];
Interaction::handle(EditContentInteraction::class, $request->all(), $page, $titlePhoto, $relatedFiles);
// something was changed, inform user // something was changed, inform user
return redirect() return redirect()
+12 -11
View File
@@ -19,30 +19,31 @@ class History extends Controller
} }
/** /**
* @param $id * @param Content $page
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function getOverview($id) public function getOverview(Content $page)
{ {
// test if given content id is static page and if exists $history = $this->history->getStructuredHistoryOf($page);
$content = Content::findOrFail($id);
$history = $this->history->getStructuredHistoryOf($content);
return view('admin/history.overview', [ return view('admin/history.overview', [
'history' => $history, 'history' => $history,
'page' => $content 'page' => $page
]); ]);
} }
public function getDiff($revision, $id) /**
* @param ContentHistory $revision
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getDiff(ContentHistory $revision)
{ {
$change = $this->history->findOrFail($id); $diff = $this->history->getDiff($revision);
$diff = $this->history->getDiff($change);
return view('admin/history.diff', [ return view('admin/history.diff', [
'change' => $change, 'change' => $revision,
'diff' => $diff 'diff' => $diff
]); ]);
} }
@@ -8,6 +8,7 @@ use App\CMS\Interactions\Admin\FileManager\CreateDirectory;
use App\CMS\Repositories\FileManager\Directory as DirectoryRepository; use App\CMS\Repositories\FileManager\Directory as DirectoryRepository;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests; use App\Http\Requests;
use App\Models\FileManager\Directory;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class CreateNewDirectory extends Controller class CreateNewDirectory extends Controller
@@ -30,9 +31,10 @@ class CreateNewDirectory extends Controller
/** /**
* Create new directory * Create new directory
* *
* @param Requests\CreateNewDirectoryRequest $request * @param Requests\CreateNewDirectoryRequest|Request $request
* *
* @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse * @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
* @internal param Directory $parentDirectory
*/ */
public function store(Request $request) public function store(Request $request)
{ {
@@ -5,19 +5,20 @@ namespace App\Http\Controllers\Admin\FileManager;
use App\CMS\Repositories\FileManager\Directory as DirectoryRepository; use App\CMS\Repositories\FileManager\Directory as DirectoryRepository;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests; use App\Http\Requests;
use App\Http\Requests\EditDirectoryRequest;
use App\Models\FileManager\Directory; use App\Models\FileManager\Directory;
class EditDirectory extends Controller class EditDirectory extends Controller
{ {
/** /**
* @param Requests\EditDirectoryRequest $request * @param EditDirectoryRequest $request
* @param Directory $directory * @param Directory $directory
* *
* @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse * @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
* @internal param $directoryId * @internal param $directoryId
* *
*/ */
public function update(Requests\EditDirectoryRequest $request, Directory $directory) public function update(EditDirectoryRequest $request, Directory $directory)
{ {
$repository = app(DirectoryRepository::class); $repository = app(DirectoryRepository::class);
if ($repository->checkIfNameExists($request->name, $directory->parent_id, $directory->id)) { if ($repository->checkIfNameExists($request->name, $directory->parent_id, $directory->id)) {
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Admin\FileManager;
use App\CMS\Helpers\FileManager; use App\CMS\Helpers\FileManager;
use App\CMS\Helpers\RootDirectory; use App\CMS\Helpers\RootDirectory;
use App\CMS\Repositories\FileManager\File as FileRepository;
use App\Events\EditFile; use App\Events\EditFile;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditUploadedFileRequest; use App\Http\Requests\EditUploadedFileRequest;
@@ -14,14 +15,12 @@ class EditUploadedFile extends Controller
{ {
/** /**
* Edit form * Edit form
*
* Render edit form for displaying details and updating given file * Render edit form for displaying details and updating given file
* *
* @param File $file * @param File $file
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\View\View
* @internal param int $id file id * @internal param int $id file id
*
*/ */
public function show(File $file) public function show(File $file)
{ {
@@ -35,7 +34,6 @@ class EditUploadedFile extends Controller
/** /**
* Updates file * Updates file
*
* User can change only keywords, original filename and description. Mime type, hash and other fields remain * User can change only keywords, original filename and description. Mime type, hash and other fields remain
* unchanged * unchanged
* *
@@ -44,16 +42,11 @@ class EditUploadedFile extends Controller
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @internal param $id * @internal param $id
*
*/ */
public function update(EditUploadedFileRequest $request, File $file) public function update(EditUploadedFileRequest $request, File $file)
{ {
// set values from form $repository = app(FileRepository::class);
$file->name = $request->name; $repository->update($file, $request->all());
$file->keywords = $request->keywords;
$file->description = $request->description;
$file->directory_id = $request->directory_id;
$file->save();
// fire action // fire action
Event::fire(new EditFile($file)); Event::fire(new EditFile($file));
@@ -47,7 +47,7 @@ class UploadFile extends Controller
*/ */
private function internalUpload(Request $request) private function internalUpload(Request $request)
{ {
try { // try {
$uploadedFiles = []; $uploadedFiles = [];
$files = $request->all()['files']; $files = $request->all()['files'];
@@ -62,9 +62,9 @@ class UploadFile extends Controller
return redirect() return redirect()
->back() ->back()
->with('success', trans_choice('admin/fileManager.uploadSuccessfull', $successfullUploads)); ->with('success', trans_choice('admin/fileManager.uploadSuccessfull', $successfullUploads));
} catch (FileException $e) { // } catch (FileException $e) {
return $this->invalidUpload('invalidFile'); // return $this->invalidUpload('invalidFile');
} // }
} }
/** /**
@@ -32,12 +32,12 @@ class UploadedFilesOverview extends Controller
*/ */
public function index(Directory $directory = null) public function index(Directory $directory = null)
{ {
// include hidden directories? // dd($directory);
$includeHidden = Input::get('hidden');
// include hidden directories?
$subdirectories = $this->directoryRepository->getAllSubdirectories($directory); $subdirectories = $this->directoryRepository->getAllSubdirectories($directory);
if (!$includeHidden) { if (!Input::get('hidden', true)) {
$subdirectories = $subdirectories->where('hidden', false); $subdirectories = $subdirectories->where('hidden', false);
} }
+4 -24
View File
@@ -2,15 +2,15 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\CMS\Repositories\Settings\Settings as SettingsRepository;
use App\Http\Requests; use App\Http\Requests;
use App\Models\Settings as SettingsModel; use App\Models\Settings as SettingsModel;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class Settings extends Controller class Settings extends Controller
{ {
/** /**
* @var SettingsModel * @var SettingsRepository
*/ */
protected $settings; protected $settings;
@@ -19,14 +19,13 @@ class Settings extends Controller
* *
* @param SettingsModel $settings * @param SettingsModel $settings
*/ */
public function __construct(SettingsModel $settings) public function __construct(SettingsRepository $settings)
{ {
$this->settings = $settings; $this->settings = $settings;
} }
/** /**
* Get overview (with form) for editing settings * Get overview (with form) for editing settings
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function getOverview() public function getOverview()
@@ -45,7 +44,6 @@ class Settings extends Controller
/** /**
* Save all settings (ignore empty ones) * Save all settings (ignore empty ones)
*
* When settings used to be non-empty string and user deletes it, key is also deleted from database * When settings used to be non-empty string and user deletes it, key is also deleted from database
* *
* @param Requests\SaveSettingsRequest $request * @param Requests\SaveSettingsRequest $request
@@ -54,25 +52,7 @@ class Settings extends Controller
*/ */
public function saveSettings(Requests\SaveSettingsRequest $request) public function saveSettings(Requests\SaveSettingsRequest $request)
{ {
$data = $request->all(); $this->settings->save($request->except(['_token']));
$commonSettings = isset($data['commonSettings']) ? $data['commonSettings'] : [];
// remove CSRF token field
unset($data['_token'], $data['commonSettings']);
foreach ($data as $key => $value) {
// select language for this setting key
$language = isset($commonSettings[$key]) ? null : LaravelLocalization::getCurrentLocale();
$setting = SettingsModel::firstOrNew(['language' => $language, 'key' => $key]);
if ($setting->value == $value) {
continue;
}
// set value and save or delete
$setting->value = $value;
empty($value) ? $setting->delete() : $setting->save();
}
return redirect() return redirect()
->route('settings.overview') ->route('settings.overview')
@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Admin\Templates; namespace App\Http\Controllers\Admin\Templates;
use App\Cms\Repositories\Templates\Template as TemplateRepository;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\CopyTemplateRequest; use App\Http\Requests\CopyTemplateRequest;
use App\Models\Templates\Template; use App\Models\Templates\Template;
@@ -10,7 +11,6 @@ class CopyTemplate extends Controller
{ {
/** /**
* Method for copying given template. * Method for copying given template.
*
* This method is supposed to be called by POST method. * This method is supposed to be called by POST method.
* *
* @param CopyTemplateRequest $request * @param CopyTemplateRequest $request
@@ -32,15 +32,22 @@ class CopyTemplate extends Controller
$namespace .= '::'; $namespace .= '::';
} }
$repository = app(TemplateRepository::class);
$repository->setModel($template);
// get template absolute paths // get template absolute paths
$realTemplatePath = $template->getPathToTemplate(); $realTemplatePath = $repository->getPathToTemplate();
$customTemplatePath = $template->getPathToTemplate(Template::CUSTOM_EDIT_DIRECTORY); $customTemplatePath = $repository->getPathToTemplate(TemplateRepository::CUSTOM_EDIT_DIRECTORY);
$path = dirname($customTemplatePath); $path = dirname($customTemplatePath);
// create file copy // create file copy
$data = file_get_contents($realTemplatePath); $data = file_get_contents($realTemplatePath);
$written = file_put_contents($path . DIRECTORY_SEPARATOR . $newName . Template::TEMPLATE_SUFFIX, $data);
if (!is_dir($path)) {
mkdir($path, 0777, true);
}
$written = file_put_contents($path . DIRECTORY_SEPARATOR . $newName . TemplateRepository::TEMPLATE_SUFFIX, $data);
// were data written? // were data written?
if ($written === false) { if ($written === false) {
return $this->copyFailed($request, $template); return $this->copyFailed($request, $template);
@@ -67,7 +74,6 @@ class CopyTemplate extends Controller
* @param Template $template * @param Template $template
* *
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
*
*/ */
private function copyFailed(CopyTemplateRequest $request, Template $template) private function copyFailed(CopyTemplateRequest $request, Template $template)
{ {
@@ -12,6 +12,21 @@ use Illuminate\Support\Facades\File;
class EditTemplate extends Controller class EditTemplate extends Controller
{ {
/**
* @var TemplateRepositoryContract
*/
private $templateRepository;
/**
* EditTemplate constructor.
*
* @param TemplateRepositoryContract $templateRepository
*/
public function __construct(TemplateRepositoryContract $templateRepository)
{
$this->templateRepository = $templateRepository;
}
/** /**
* Render form for editing template * Render form for editing template
* *
@@ -19,18 +34,12 @@ class EditTemplate extends Controller
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function getEdit($template) public function getEdit(Template $template)
{ {
/** $this->templateRepository->setModel($template);
* @var $template Template
*/
$template = Template::findOrFail($template);
$repo = app(TemplateRepositoryContract::class);
$repo->setModel($template);
// load template content // load template content
$absolutePath = $repo->getPathToTemplate(); $absolutePath = $this->templateRepository->getPathToTemplate();
$content = @file_get_contents($absolutePath); $content = @file_get_contents($absolutePath);
return view('admin.templates.edit', [ return view('admin.templates.edit', [
@@ -45,15 +54,13 @@ class EditTemplate extends Controller
* Save meta information about template and edited content * Save meta information about template and edited content
* *
* @param EditTemplateRequest $request * @param EditTemplateRequest $request
* @param $templateId * @param Template $template
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @internal param $templateId
*/ */
public function postEdit(EditTemplateRequest $request, $templateId) public function postEdit(EditTemplateRequest $request, Template $template)
{ {
// find template
$template = Template::findOrFail($templateId);
// setup meta information // setup meta information
$template->name = $request->name; $template->name = $request->name;
@@ -78,9 +85,11 @@ class EditTemplate extends Controller
*/ */
private function saveContent(Template $template, EditTemplateRequest $request) private function saveContent(Template $template, EditTemplateRequest $request)
{ {
$this->templateRepository->setModel($template);
// get templates with paths // get templates with paths
$originalTemplate = $template->getPathToTemplate(); $originalTemplate = $this->templateRepository->getPathToTemplate();
$customTemplate = $template->getPathToTemplate(Template::CUSTOM_EDIT_DIRECTORY); $customTemplate = $this->templateRepository->getPathToTemplate(TemplateRepositoryContract::CUSTOM_EDIT_DIRECTORY);
// get paths // get paths
$originalDir = dirname($originalTemplate); $originalDir = dirname($originalTemplate);
@@ -7,16 +7,21 @@ use App\Models\Templates\TemplatePath;
class TemplateOverview extends Controller class TemplateOverview extends Controller
{ {
public function getPath($path) /**
* Display overview of all templates in given path
*
* @param TemplatePath $templatePath
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getPath(TemplatePath $templatePath)
{ {
$path = TemplatePath::findOrFail($path);
return view('admin.templates.list', [ return view('admin.templates.list', [
'directory' => $path, 'directory' => $templatePath,
'isWritable' => is_writable(base_path($path->path)), 'isWritable' => is_writable(base_path($templatePath->path)),
'templates' => $path->templates() 'templates' => $templatePath->templates()
->get(), ->get(),
'subdirectories' => $path->subdirectories() 'subdirectories' => $templatePath->subdirectories()
->get() ->get()
]); ]);
} }
@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Admin\Users; namespace App\Http\Controllers\Admin\Users;
use App\CMS\Enumerations\UserRoles; use App\CMS\Enumerations\UserRoles;
use App\CMS\Repositories\Users\User as UserRepository;
use App\Events\CreateNewUser as CreateNewUserEvent; use App\Events\CreateNewUser as CreateNewUserEvent;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\CreateNewUserRequest; use App\Http\Requests\CreateNewUserRequest;
@@ -28,28 +29,21 @@ class CreateNewUser extends Controller
/** /**
* Create new user * Create new user
*
* This method saves new user into database * This method saves new user into database
* *
* @param CreateNewUserRequest $request * @param CreateNewUserRequest $request
* @param UserRepository $userRepository
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
protected function postRegistration(CreateNewUserRequest $request) protected function postRegistration(CreateNewUserRequest $request, UserRepository $userRepository)
{ {
// when user did not provide any username, use his email // when user did not provide any username, use his email
$username = isset($request->username) && !empty($request->username) ? $request->username : $request->email; $username = isset($request->username) && !empty($request->username) ? $request->username : $request->email;
// create new user $data = $request->all();
$user = new User(); $data['username'] = $username;
$user->name = $request->name; $user = $userRepository->create($data);
$user->email = $request->email;
$user->username = $username;
$user->role = $request->role;
$user->password = Hash::make($request->password);
// store user into database
$user->save();
// fire event // fire event
Event::fire(new CreateNewUserEvent($user)); Event::fire(new CreateNewUserEvent($user));
+33 -37
View File
@@ -4,26 +4,45 @@ namespace App\Http\Controllers\Admin\Users;
use App\CMS\Enumerations\UserRoles; use App\CMS\Enumerations\UserRoles;
use App\CMS\Enumerations\UserStates; use App\CMS\Enumerations\UserStates;
use App\CMS\Repositories\Users\User as UserRepository;
use App\Events\EditUser as EditUserEvent; use App\Events\EditUser as EditUserEvent;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditUserRequest; use App\Http\Requests\EditUserRequest;
use App\Models\User; use App\Models\User;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Hash;
class EditUser extends Controller class EditUser extends Controller
{ {
public function getEditUser($id = null) /**
* @var UserRepository
*/
private $userRepository;
/**
* EditUser constructor.
*
* @param UserRepository $userRepository
*/
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
/**
* Display form for editing user
*
* @param User|null $user
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getEditUser(User $user = null)
{ {
// when no user specified, lets assume we want to edit "me" // when no user specified, lets assume we want to edit "me"
if (!$id) { if (!$user->exists()) {
$id = Auth::user()->id; $user = Auth::user();
} }
// try to find given user
$user = User::findOrFail($id);
$states = UserStates::getWithTranslations(); $states = UserStates::getWithTranslations();
$roles = UserRoles::getWithTranslations(); $roles = UserRoles::getWithTranslations();
@@ -35,49 +54,26 @@ class EditUser extends Controller
} }
/** /**
* Edit user - store information
*
* @param EditUserRequest $request * @param EditUserRequest $request
* @param $id * @param User $user
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @internal param $id
*/ */
public function postEdit(EditUserRequest $request, $id) public function postEdit(EditUserRequest $request, User $user)
{ {
$loggedUser = Auth::user(); $loggedUser = Auth::user();
$user = User::findOrFail($id);
// non-admin user is trying to edit someone else // non-admin user is trying to edit someone else
if ($loggedUser->role != User::ROLE_ADMIN && $id != $loggedUser->id) { if ($loggedUser->role != User::ROLE_ADMIN && $user->id != $loggedUser->id) {
return redirect() return redirect()
->back() ->back()
->with('error', trans('auth.accessDenied')); ->with('error', trans('auth.accessDenied'));
} }
// update username if set $this->userRepository->update($user, $request->all());
if (isset($request->username)) {
$user->username = $request->username;
}
// change name (if set)
if (isset($request->name)) {
$user->name = $request->name;
}
if (isset($request->role)) {
$user->role = $request->role;
}
if (isset($request->status)) {
$user->status = $request->status;
}
if (isset($request->password)) {
$user->password = Hash::make($request->password);
}
$user->email = $request->email;
$user->save();
// fire event about editing user // fire event about editing user
Event::fire(new EditUserEvent($user)); Event::fire(new EditUserEvent($user));
@@ -22,18 +22,14 @@ class UserDetail extends Controller
$this->log = $log; $this->log = $log;
} }
public function getDetail($id = null) public function getDetail(User $user = null)
{ {
// when no user specified, lets assume we want to edit "me" // when no user specified, lets assume we want to edit "me"
if (!$id) { if (!$user->exists()) {
$id = Auth::user()->id; $id = Auth::user();
} }
// try to find given user $actions = $this->log->getUserActions($user->id, 10);
$user = User::findOrFail($id);
$actions = $this->log->getUserActions($id, 10);
$roles = UserRoles::getWithTranslations(); $roles = UserRoles::getWithTranslations();
$states = UserStates::getWithTranslations(); $states = UserStates::getWithTranslations();
@@ -2,19 +2,34 @@
namespace App\Http\Controllers\Admin\Widgets\Areas; namespace App\Http\Controllers\Admin\Widgets\Areas;
use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\NewWidgetAreaRequest; use App\Http\Requests\NewWidgetAreaRequest;
use App\Models\Widgets\WidgetArea; use App\Models\Widgets\WidgetArea;
use Illuminate\Support\Facades\Event;
class CreateNewWidgetArea extends Controller class CreateNewWidgetArea extends Controller
{ {
/**
* @var WidgetAreaRepository
*/
private $widgetAreaRepository;
/**
* CreateNewWidgetArea constructor.
*
* @param WidgetAreaRepository $widgetAreaRepository
*/
public function __construct(WidgetAreaRepository $widgetAreaRepository)
{
$this->widgetAreaRepository = $widgetAreaRepository;
}
/** /**
* Form for new widget area * Form for new widget area
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function getNew() public function create()
{ {
return view('admin.widgets.area.new', ['area' => new WidgetArea()]); return view('admin.widgets.area.new', ['area' => new WidgetArea()]);
} }
@@ -24,18 +39,9 @@ class CreateNewWidgetArea extends Controller
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
public function postNew(NewWidgetAreaRequest $request) public function store(NewWidgetAreaRequest $request)
{ {
$parameters = [ $this->widgetAreaRepository->create($request);
'code' => $request->code,
'name' => $request->name,
'description' => $request->description
];
$area = WidgetArea::create($parameters);
// fire event with new widget area
Event::fire(new \App\Events\CreateNewWidgetArea($area));
// redirect with success notification // redirect with success notification
return redirect() return redirect()
@@ -2,6 +2,8 @@
namespace App\Http\Controllers\Admin\Widgets\Areas; namespace App\Http\Controllers\Admin\Widgets\Areas;
use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository;
use App\Events\DeleteWidgetArea;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditWidgetAreaRequest; use App\Http\Requests\EditWidgetAreaRequest;
use App\Models\Widgets\Widget; use App\Models\Widgets\Widget;
@@ -13,22 +15,38 @@ use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class EditWidgetArea extends Controller class EditWidgetArea extends Controller
{ {
/**
* @var WidgetAreaRepository
*/
private $widgetAreaRepository;
/**
* EditWidgetArea constructor.
*
* @param WidgetAreaRepository $widgetAreaRepository
*/
public function __construct(WidgetAreaRepository $widgetAreaRepository)
{
$this->widgetAreaRepository = $widgetAreaRepository;
}
/** /**
* Display form for editing given widget area * Display form for editing given widget area
* *
* @param $id * @param WidgetArea $widgetArea
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*
*/ */
public function getEdit($id) public function edit(WidgetArea $widgetArea)
{ {
$area = WidgetArea::findOrFail($id); return view("test");
$associatedWidgetIds = WidgetInWidgetArea::getWidgetIdsFromArea($area->id); $associatedWidgetIds = WidgetInWidgetArea::getWidgetIdsFromArea($widgetArea->id);
$widgets = Widget::where('language', LaravelLocalization::getCurrentLocale()) $widgets = Widget::where('language', LaravelLocalization::getCurrentLocale())
->paginate(25); ->paginate(25);
return view('admin.widgets.area.edit', [ return view('admin.widgets.area.edit', [
'area' => $area, 'area' => $widgetArea,
'widgets' => $widgets, 'widgets' => $widgets,
'associatedWidgetIds' => $associatedWidgetIds 'associatedWidgetIds' => $associatedWidgetIds
]); ]);
@@ -36,26 +54,14 @@ class EditWidgetArea extends Controller
/** /**
* @param EditWidgetAreaRequest $request * @param EditWidgetAreaRequest $request
* @param $id * @param WidgetArea $widgetArea
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*
*/ */
public function postEdit(EditWidgetAreaRequest $request, $id) public function update(EditWidgetAreaRequest $request, WidgetArea $widgetArea)
{ {
try { $this->widgetAreaRepository->update($widgetArea, $request);
$area = WidgetArea::findOrFail($id);
} catch (ModelNotFoundException $e) {
return $this->invalidArea();
}
$area->name = $request->name;
$area->description = $request->description;
$area->timestamps = true;
$area->save();
// fire event with new widget area
Event::fire(new \App\Events\EditWidgetArea($area));
return redirect() return redirect()
->route('widgetareas.overview') ->route('widgetareas.overview')
@@ -65,47 +71,28 @@ class EditWidgetArea extends Controller
/** /**
* Hard deletes widget area * Hard deletes widget area
* *
* @param $id * @param WidgetArea $widgetArea
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
public function deleteArea($id) public function delete(WidgetArea $widgetArea)
{ {
// try to find area
try {
$area = WidgetArea::findOrFail($id);
} catch (ModelNotFoundException $e) {
return $this->invalidArea();
}
// check if widget area is deletable // check if widget area is deletable
if (!$area->deletable) { if (!$widgetArea->deletable) {
return redirect() return redirect()
->back() ->back()
->with('error', trans('admin/widgetAreas.notDeletableArea')); ->with('error', trans('admin/widgetAreas.notDeletableArea'));
} }
// delete area // delete area
$area->delete(); $widgetArea->delete();
// fire event with new widget area // fire event with new widget area
Event::fire(new \App\Events\DeleteWidgetArea($area)); Event::fire(new DeleteWidgetArea($widgetArea));
// redirect and inform user // redirect and inform user
return redirect() return redirect()
->route('widgetareas.overview') ->route('widgetareas.overview')
->with('success', trans('admin/widgetAreas.successfullyDeleted')); ->with('success', trans('admin/widgetAreas.successfullyDeleted'));
} }
/**
* Redirect user to overview with message about invalid widget area
*
* @return \Illuminate\Http\RedirectResponse
*/
private function invalidArea()
{
return redirect()
->route('widgetareas.overview')
->with('error', trans('admin/widgetAreas.invalidArea'));
}
} }
@@ -2,11 +2,11 @@
namespace App\Http\Controllers\Admin\Widgets; namespace App\Http\Controllers\Admin\Widgets;
use App\CMS\Repositories\Widgets\Widget;
use App\CMS\Widgets\Exceptions\MissingParameterException;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\NewWidgetRequest; use App\Http\Requests\NewWidgetRequest;
use App\Models\Widgets\Widget;
use App\Models\Widgets\WidgetType; use App\Models\Widgets\WidgetType;
use App\CMS\Widgets\Exceptions\MissingParameterException;
class CreateNewWidget extends Controller class CreateNewWidget extends Controller
{ {
@@ -23,14 +23,13 @@ class CreateNewWidget extends Controller
/** /**
* Form for new widget area * Form for new widget area
* *
* @param $type * @param WidgetType $widgetType
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*
*/ */
public function getNew($type) public function getNew(WidgetType $widgetType)
{ {
$widgetType = WidgetType::findOrFail($type);
$presenter = call_user_func([$widgetType->handler, 'getPresenter']); $presenter = call_user_func([$widgetType->handler, 'getPresenter']);
return call_user_func([$presenter, 'renderAddForm'], $widgetType); return call_user_func([$presenter, 'renderAddForm'], $widgetType);
@@ -40,23 +39,22 @@ class CreateNewWidget extends Controller
* Create new instance of given widget type * Create new instance of given widget type
* *
* @param NewWidgetRequest $request * @param NewWidgetRequest $request
* @param $type *
* @param WidgetType $widgetType
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
public function postNew(NewWidgetRequest $request, $type) public function postNew(NewWidgetRequest $request, WidgetType $widgetType)
{ {
$widgetType = WidgetType::findOrFail($type);
// try to save this widget // try to save this widget
try { try {
$this->widget->createNew($widgetType, $request); $this->widget->createNew($widgetType, $request);
} catch (MissingParameterException $e) { } catch (MissingParameterException $e) {
// user omitted some value // user omitted some value
return $this->invalidWidget($type, $e->getMessage()); return redirect()
} catch (\Exception $e) { ->back()
// something went wrong ->withInput()
return $this->invalidWidget($type, trans('admin/widgets.cannotSave', ['exception' => $e->getMessage()])); ->with('error', $e->getMessage());
} }
// redirect with success notification // redirect with success notification
@@ -64,12 +62,4 @@ class CreateNewWidget extends Controller
->route('widgets.overview') ->route('widgets.overview')
->with('success', trans('admin/widgets.successfullyCreated')); ->with('success', trans('admin/widgets.successfullyCreated'));
} }
private function invalidWidget($widgetType, $error)
{
return redirect()
->route('widgets.new', ['type' => $widgetType])
->withInput()
->with('error', $error);
}
} }
@@ -1,26 +1,39 @@
<?php <?php
namespace App\Http\Controllers\Admin\Widgets; namespace App\Http\Controllers\Admin\Widgets;
use App\CMS\Repositories\Widgets\Widget as WidgetRepository;
use App\CMS\Widgets\Exceptions\MissingParameterException; use App\CMS\Widgets\Exceptions\MissingParameterException;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditWidgetRequest; use App\Http\Requests\EditWidgetRequest;
use App\Models\Widgets\Widget; use App\Models\Widgets\Widget;
use Illuminate\Support\Facades\Event;
class EditWidget extends Controller class EditWidget extends Controller
{ {
/**
* @var WidgetRepository
*/
private $widgetRepository;
/**
* EditWidget constructor.
*
* @param WidgetRepository $widgetRepository
*/
public function __construct(WidgetRepository $widgetRepository)
{
$this->widgetRepository = $widgetRepository;
}
/** /**
* Render edit form * Render edit form
* *
* @param $id * @param Widget $widget
* *
* @return mixed * @return mixed
*/ */
public function getEdit($id) public function getEdit(Widget $widget)
{ {
$widget = Widget::findOrFail($id);
$widget->settings = json_decode($widget->settings);
$presenter = call_user_func([$widget->widget_type_handler, 'getPresenter']); $presenter = call_user_func([$widget->widget_type_handler, 'getPresenter']);
return call_user_func([$presenter, 'renderEditForm'], $widget); return call_user_func([$presenter, 'renderEditForm'], $widget);
@@ -30,24 +43,14 @@ class EditWidget extends Controller
* Save changes into database * Save changes into database
* *
* @param EditWidgetRequest $request * @param EditWidgetRequest $request
* @param $widget * @param Widget $widget
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
public function postEdit(EditWidgetRequest $request, $widget) public function postEdit(EditWidgetRequest $request, Widget $widget)
{ {
// create new widget
$widget = Widget::findOrFail($widget);
// update name
$widget->name = $request->name;
$widget->container_class = $request->containerClass;
$widget->container_id = empty($request->containerId) ? null : $request->containerId;
$widget->description = $request->description;
// try to save this widget
try { try {
$widget->settings = json_encode(call_user_func([$widget->widget_type_handler, 'save'], $request)); $this->widgetRepository->edit($widget, $request);
} catch (MissingParameterException $e) { } catch (MissingParameterException $e) {
// user omitted some value // user omitted some value
return $this->invalidWidget($e->getMessage()); return $this->invalidWidget($e->getMessage());
@@ -56,12 +59,6 @@ class EditWidget extends Controller
return $this->invalidWidget(trans('admin/widgets.cannotSave', ['exception' => $e->getMessage()])); return $this->invalidWidget(trans('admin/widgets.cannotSave', ['exception' => $e->getMessage()]));
} }
// save into database
$widget->save();
// fire event with editing widget
Event::fire(new \App\Events\EditWidget($widget));
// redirect with success notification // redirect with success notification
return redirect() return redirect()
->back() ->back()
@@ -71,15 +68,12 @@ class EditWidget extends Controller
/** /**
* Deletes widget * Deletes widget
* *
* @param $id * @param Widget $widget
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
public function deleteWidget($id) public function deleteWidget(Widget $widget)
{ {
// create new widget
$widget = Widget::findOrFail($id);
// check if widget area is deletable // check if widget area is deletable
if (!$widget->deletable) { if (!$widget->deletable) {
return redirect() return redirect()
@@ -7,7 +7,7 @@ use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class WidgetsOverview extends Controller class WidgetsOverview extends Controller
{ {
public function getOverview() public function index()
{ {
$widgets = Widget::where('language', LaravelLocalization::getCurrentLocale()) $widgets = Widget::where('language', LaravelLocalization::getCurrentLocale())
->paginate(25); ->paginate(25);
+1 -1
View File
@@ -23,7 +23,7 @@ class Controller extends BaseController
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public static function VisitorsView($template, $data = [], $mergeData = []) public static function visitorsView($template, $data = [], $mergeData = [])
{ {
$view = Template::name($template); $view = Template::name($template);
+17 -8
View File
@@ -3,7 +3,6 @@
namespace App\Http\Controllers\Visitor; namespace App\Http\Controllers\Visitor;
use App\CMS\Contracts\Repositories\Content; use App\CMS\Contracts\Repositories\Content;
use App\CMS\Helpers\PageRenderer;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Content\Content as ContentModel; use App\Models\Content\Content as ContentModel;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@@ -24,11 +23,20 @@ class ContentPage extends Controller
$this->content = $content; $this->content = $content;
} }
/**
* Load page by URL
*
* This method also caches content
*
* @param $url
*
* @return mixed
*/
public function getPage($url) public function getPage($url)
{ {
$contentModel = $this->content; $contentRepository = $this->content;
$page = Cache::remember('content-' . $url, setting('contentCacheLifetime', 5), function () use ($contentModel, $url) { $page = Cache::remember('content-' . $url, setting('contentCacheLifetime', 5), function () use ($contentRepository, $url) {
return $contentModel->getByURL($url); return $contentRepository->getByURL($url);
}); });
// no page available // no page available
@@ -42,7 +50,7 @@ class ContentPage extends Controller
/** /**
* Method used for rendering page for visitor * Method used for rendering page for visitor
* *
* @param Content $page * @param ContentModel $page
* *
* @return mixed * @return mixed
* @throws \Exception * @throws \Exception
@@ -54,9 +62,10 @@ class ContentPage extends Controller
abort(404); abort(404);
} }
// add one new "view" for page $displayPipeline = app('displayPipeline');
$page->view(); $page = $displayPipeline->run($page);
return Controller::visitorsView($page->template, ['page' => $page]);
return PageRenderer::render($page);
} }
} }
+1 -1
View File
@@ -10,7 +10,7 @@ class Homepage extends ContentPage
{ {
// try to find some homepage // try to find some homepage
$contentModel = $this->content; $contentModel = $this->content;
$page = Cache::remember('hp', setting('homepageCacheLifetime', 5), function () use ($contentModel) { $page = Cache::remember('homepage', setting('homepageCacheLifetime', 5), function () use ($contentModel) {
return $contentModel->getHomepage(); return $contentModel->getHomepage();
}); });
+2 -6
View File
@@ -18,9 +18,7 @@ class Kernel extends HttpKernel
{ {
/** /**
* The application's global HTTP middleware stack. * The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application. * These middleware are run during every request to your application.
*
* @var array * @var array
*/ */
protected $middleware = [ protected $middleware = [
@@ -33,7 +31,6 @@ class Kernel extends HttpKernel
]; ];
/** /**
* The application's route middleware groups. * The application's route middleware groups.
*
* @var array * @var array
*/ */
protected $middlewareGroups = [ protected $middlewareGroups = [
@@ -53,9 +50,7 @@ class Kernel extends HttpKernel
]; ];
/** /**
* The application's route middleware. * The application's route middleware.
*
* These middleware may be assigned to groups or used individually. * These middleware may be assigned to groups or used individually.
*
* @var array * @var array
*/ */
protected $routeMiddleware = [ protected $routeMiddleware = [
@@ -66,6 +61,7 @@ class Kernel extends HttpKernel
'throttle' => ThrottleRequests::class, 'throttle' => ThrottleRequests::class,
'localize' => LaravelLocalizationRoutes::class, 'localize' => LaravelLocalizationRoutes::class,
'localizationRedirect' => LaravelLocalizationRedirectFilter::class, 'localizationRedirect' => LaravelLocalizationRedirectFilter::class,
'localeSessionRedirect' => LocaleSessionRedirect::class 'localeSessionRedirect' => LocaleSessionRedirect::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
]; ];
} }
+2 -2
View File
@@ -11,7 +11,7 @@ Route::pattern('url', '[0-9\-a-z]+');
/*******************************************************************************/ /*******************************************************************************/
Route::group(['prefix' => LaravelLocalization::setLocale()], function () { Route::group(['prefix' => LaravelLocalization::setLocale(), 'middleware' => ['bindings']], function () {
/** /**
* This route group serves to handle request in admin * This route group serves to handle request in admin
*/ */
@@ -65,7 +65,7 @@ Route::group(['prefix' => LaravelLocalization::setLocale()], function () {
->name('login'); ->name('login');
// route for sitemap // route for sitemap
Route::get('sitemap.xml', 'Sitemap@getMap') Route::get('sitemap.xml', 'Visitor\Sitemap@getMap')
->name('sitemap'); ->name('sitemap');
// route for all content pages. This rule must be specified last (because it matches every route) // route for all content pages. This rule must be specified last (because it matches every route)
+8 -8
View File
@@ -9,34 +9,34 @@ Route::group(['namespace' => 'Contents'], function () {
->name('content.new'); ->name('content.new');
// form for editing existing static page // form for editing existing static page
Route::get('content/edit/{id}', 'EditContent@edit') Route::get('content/edit/{page}', 'EditContent@edit')
->name('content.edit'); ->name('content.edit');
// post method for creating new static page // post method for creating new static page
Route::post('content/new/{moduleId}', 'CreateNewContent@store') Route::post('content/new/{module}', 'CreateNewContent@store')
->name('content.newPost'); ->name('content.newPost');
// post method for creating new static page // post method for creating new static page
Route::post('content/edit/{id}', 'EditContent@update') Route::post('content/edit/{page}', 'EditContent@update')
->name('content.editPost'); ->name('content.editPost');
// change status of page (protected, public or draft) // change status of page (protected, public or draft)
Route::get('content/status/{id}/{status}', 'ContentActions@changeStatus') Route::get('content/status/{page}/{status}', 'ContentActions@changeStatus')
->name('content.changeStatus'); ->name('content.changeStatus');
// set homepage // set homepage
Route::get('content/homepage/{id}', 'ContentActions@setHomepage') Route::get('content/homepage/{page}', 'ContentActions@setHomepage')
->name('content.setHomepage'); ->name('content.setHomepage');
// delete page // delete page
Route::get('content/delete/{id}', 'ContentActions@delete') Route::get('content/delete/{page}', 'ContentActions@delete')
->name('content.delete'); ->name('content.delete');
// history of changes for specified page // history of changes for specified page
Route::get('history/{id}', 'History@getOverview') Route::get('history/{page}', 'History@getOverview')
->name('content.history'); ->name('content.history');
// history of changes for specified page // history of changes for specified page
Route::get('history/{revision}/{id}', 'History@getDiff') Route::get('history/{revision}', 'History@getDiff')
->name('history.diff'); ->name('history.diff');
}); });
-3
View File
@@ -5,9 +5,6 @@ Route::group(['namespace' => 'FileManager'], function () {
->name('upload.overview'); ->name('upload.overview');
// uploader methods // uploader methods
Route::get('directories/new/{parentDirectory?}', 'CreateNewDirectory@create')
->name('upload.newDirectory');
Route::get('directories/edit/{directory}', 'EditDirectory@edit') Route::get('directories/edit/{directory}', 'EditDirectory@edit')
->name('upload.editDirectory'); ->name('upload.editDirectory');

Some files were not shown because too many files have changed in this diff Show More