Author SHA1 Message Date
Michal Kváček 5abd7d9151 FIX: fix content dependency on categories 2017-08-24 02:50:30 +02:00
Michal Kváček ac8e3aeacc FEATURE: do not require template to be set in admin 2017-08-24 02:08:28 +02:00
Michal Kváček 49bd38db50 FEATURE: hopefully last changes about permissions 2017-08-24 02:04:20 +02:00
Michal Kváček b35149ad67 FEATURE: add permissions into widgets and fix few bugs 2017-08-24 01:54:58 +02:00
Michal Kváček e0f5cba9a4 FEATURE: add form for setting default permissions and fix few bugs 2017-08-23 21:34:56 +02:00
Michal Kváček 0aaa626124 FEATURE: add another permissions 2017-08-22 23:27:23 +02:00
Michal Kváček 1050271915 Merge branch 'authorization' into separate_modules 2017-08-22 22:36:00 +02:00
Michal Kváček e0b5559b96 FEATURE: hide menu entry when no content modules are available 2017-08-22 22:35:48 +02:00
Michal Kváček 3955d7290f FEATURE: remove gallery and move it into own repository 2017-08-22 20:19:06 +02:00
Michal Kváček 81ef15b8d6 FEATURE: remove contact form and move it into own repository 2017-08-22 20:18:20 +02:00
Michal Kváček f06d9b35d8 FEATURE: remove static pages and move it into own repository 2017-08-22 20:16:56 +02:00
Michal Kváček c4c328d21d FEATURE: add /modules into .gitignore 2017-08-22 14:11:57 +02:00
Michal Kváček fc8b76960a FEATURE: move categories into own repository 2017-08-22 14:11:48 +02:00
Michal Kváček b2e99bef05 FEATURE: move module blog into own repository 2017-08-22 14:08:28 +02:00
Michal Kváček 7d847cbab9 FIX: fix few bugs in routes 2017-08-11 04:13:33 +02:00
Michal Kváček ef432702b4 FEATURE #2048: add missing policies 2017-08-11 02:57:54 +02:00
Michal Kváček 7f43316602 FEATURE #2048: another work done on permissions 2017-08-11 02:24:44 +02:00
Michal Kváček 335ec4a167 FEATURE #2048: prepare routes for ACL, add some more permissions 2017-08-11 02:07:31 +02:00
Michal Kváček cccdbda543 FEATURE #2048: add basics of permissions management 2017-08-10 23:18:53 +02:00
Michal Kváček f702ba3a29 FEATURE #1854: add widget settings 2017-08-10 21:27:39 +02:00
Michal Kváček 6af0c16a9a FEATURE #1853: move widget areas 'views' into middleware 2017-08-10 19:59:40 +02:00
Michal Kváček c2209538db FEATURE: refactorize code little bit more 2017-08-04 18:43:18 +02:00
Michal Kváček 25d9ded124 FIX: fix bug related to settings cache 2017-08-02 18:35:48 +02:00
Michal Kváček 3a1e4b9c5b FIX #2056: areYouSure now reacts also on changes in CKEditor 2017-08-02 14:10:37 +02:00
Michal Kváček 3d73bffa6e FIX: fix minor bug in user management 2017-08-02 13:52:19 +02:00
Michal Kváček a4c020daa0 FEATURE #2047: use laravel's authorization 2017-08-02 13:33:26 +02:00
Michal Kváček 67fb3c6945 FEATURE #2039 @15m: clean up the code 2017-08-02 10:39:15 +02:00
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
494 changed files with 37215 additions and 8118 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 -4
View File
@@ -1,3 +1,6 @@
/modules
/templates
# published files from modules # published files from modules
/public/modules /public/modules
/public/assets /public/assets
@@ -9,9 +12,6 @@
**/views/**/custom/* **/views/**/custom/*
!**/views/**/custom/.gitkeep !**/views/**/custom/.gitkeep
# module config - generated in ModuleManager service provider
**/module.json
# uploaded files # uploaded files
/public/uploads/* /public/uploads/*
!/public/uploads/.gitkeep !/public/uploads/.gitkeep
@@ -32,4 +32,5 @@
/public/js /public/js
/public/fonts /public/fonts
/bower_components /bower_components
.sass-cache .sass-cache
!/resources/views/vendor/
@@ -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);
} }
+1 -1
View File
@@ -9,7 +9,7 @@ class UserRoles extends BaseEnumeration
{ {
$roles = [ $roles = [
User::ROLE_ADMIN => 'admin/userManagement.role_' . User::ROLE_ADMIN, User::ROLE_ADMIN => 'admin/userManagement.role_' . User::ROLE_ADMIN,
User::ROLE_EDITOR => 'admin/userManagement.role_' . User::ROLE_EDITOR, // User::ROLE_EDITOR => 'admin/userManagement.role_' . User::ROLE_EDITOR,
User::ROLE_VISITOR => 'admin/userManagement.role_' . User::ROLE_VISITOR User::ROLE_VISITOR => 'admin/userManagement.role_' . User::ROLE_VISITOR
]; ];
@@ -1,60 +1,57 @@
<?php <?php
namespace App\CMS\Handlers; namespace App\CMS\Handlers;
use App\CMS\Contracts\Modules\AppHandler; use App\CMS\Contracts\Modules\AppHandler;
use App\Http\Controllers\Controller; use App\Models\FileManager\File;
use App\Models\Content\Content;
/** /**
* Class Handler * Class Handler
*
* Handler is a class which handles module-specific behaviour which cannot be done by module itself, resp. cannot be * Handler is a class which handles module-specific behaviour which cannot be done by module itself, resp. cannot be
* done by some abstract magic. * done by some abstract magic.
*
* @package App\CMS\Handlers\ * @package App\CMS\Handlers\
*/ */
abstract class Handler extends BaseHandler implements AppHandler abstract class AdminHandler extends BaseHandler implements AppHandler
{ {
public static function getHistoryHandler() public static function getHistoryHandler()
{ {
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 [ $formParts = [
'basicInfo' => trans('admin/contents.basicInfo'), 'basicInfo' => trans('admin/contents.basicInfo'),
'meta' => trans('admin/contents.metaOptions'), 'meta' => trans('admin/contents.metaOptions'),
'publication' => trans('admin/contents.publicationOptions'), 'publication' => trans('admin/contents.publicationOptions'),
'appearance' => trans('admin/contents.appearance'), 'appearance' => trans('admin/contents.appearance'),
'files' => trans('admin/contents.files') 'files' => trans('admin/contents.files')
]; ];
if (\Auth::user()->cannot('upload', File::class)) {
unset($formParts['files']);
}
return $formParts;
} }
public static function getExtendedFormInputsCreate() public static function getExtendedFormInputsCreate()
{ {
return [ $formParts = [
'basicInfo' => 'admin.content.formParts.basicInformation', 'basicInfo' => 'admin.content.formParts.basicInformation',
'meta' => 'admin.content.formParts.metaInformation', 'meta' => 'admin.content.formParts.metaInformation',
'publication' => 'admin.content.formParts.publicationSetup', 'publication' => 'admin.content.formParts.publicationSetup',
'appearance' => 'admin.content.formParts.appearance', 'appearance' => 'admin.content.formParts.appearance',
'files' => 'admin.content.formParts.files' 'files' => 'admin.content.formParts.files'
]; ];
if (\Auth::user()->cannot('upload', File::class)) {
unset($formParts['files']);
}
return $formParts;
} }
public static function getExtendedFormInputsEdit() public static function getExtendedFormInputsEdit()
{ {
return self::getExtendedFormInputsCreate(); return self::getExtendedFormInputsCreate();
+75 -43
View File
@@ -1,16 +1,24 @@
<?php <?php
namespace App\CMS\Handlers; namespace App\CMS\Handlers;
use App\CMS\Contracts\Modules\BaseModuleHandler; use App\CMS\Contracts\Modules\BaseModuleHandler;
use App\CMS\Enumerations\TemplatePathsHumanReadableRootOnly; use App\CMS\Enumerations\TemplatePathsHumanReadableRootOnly;
use App\CMS\Enumerations\WidgetTypes; use App\CMS\Enumerations\WidgetTypes;
use App\CMS\Repositories\Module;
use App\Models\ActionLog\ActionLog;
use App\Models\Content\Content;
use App\Models\FileManager\File;
use App\Models\Settings;
use App\Models\Templates\Template;
use App\Models\User; use App\Models\User;
use App\Models\Widgets\Widget;
use App\Models\Widgets\WidgetArea;
abstract class BaseHandler implements BaseModuleHandler abstract class BaseHandler implements BaseModuleHandler
{ {
/** /**
* Register admin menu (or multiple ones) * Register admin menu (or multiple ones)
*
* This cannot be in ServiceProvider because Session is started at middleware. And ServiceProvider is called before * This cannot be in ServiceProvider because Session is started at middleware. And ServiceProvider is called before
* starting any middleware.. * starting any middleware..
* *
@@ -25,84 +33,108 @@ abstract class BaseHandler implements BaseModuleHandler
} }
// create instance of main menu // create instance of main menu
\Menu::create('mainMenu', function ($menu) { \Menu::create('mainMenu', function ($menu) use ($user) {
// $menu->route('admin.dashboard', trans('admin/mainMenu.dashboard'), [], 10, ['icon' => 'fa fa-fw fa-dashboard']); // $menu->route('admin.dashboard', trans('admin/mainMenu.dashboard'), [], 10, ['icon' => 'fa fa-fw fa-dashboard']);
/** /**
* Content pages * Content pages
*
* Submenus can be registered later * Submenus can be registered later
*/ */
$menu->dropdown(trans('admin/mainMenu.contentPages'), function ($sub) { $contentModules = app(Module::class)->getContentModules();
$sub->route('content.overview', trans('admin/mainMenu.contentPageOverview'), [], 10000, ['icon' => 'fa fa-fw fa-list']);
}, 20, ['icon' => 'fa fa-fw fa-database']); if ($user->can('manage', Content::class) && !$contentModules->isEmpty()) {
$menu->dropdown(trans('admin/mainMenu.contentPages'), function ($sub) {
$sub->route('content.overview', trans('admin/mainMenu.contentPageOverview'), [], 10000, ['icon' => 'fa fa-fw fa-list']);
}, 20, ['icon' => 'fa fa-fw fa-database']);
}
/** /**
* File manager * File manager
*/ */
$menu->route('upload.overview', trans('admin/mainMenu.fileManager'), [], 40, ['icon' => 'fa fa-fw fa-folder']); if ($user->can('manage', File::class)) {
$menu->route('upload.overview', trans('admin/mainMenu.fileManager'), [], 40, ['icon' => 'fa fa-fw fa-folder']);
}
/** /**
* Widgets and widget areas * Widgets and widget areas
*/ */
$menu->dropdown(trans('admin/mainMenu.widgets'), function ($sub) { if ($user->can('manage', Widget::class) || $user->can('manage', WidgetArea::class)) {
// create list of all widget types $menu->dropdown(trans('admin/mainMenu.widgets'), function ($sub) use ($user) {
$widgets = WidgetTypes::getWithTranslations(); // create list of all widget types
$widgets = WidgetTypes::getWithTranslations();
if (!empty($widgets)) { if (!empty($widgets) && $user->can('create', Widget::class)) {
$sub->dropdown(trans('admin/mainMenu.newWidget'), function ($sub) use ($widgets) { $sub->dropdown(trans('admin/mainMenu.newWidget'), function ($sub) use ($widgets) {
$i = 1; $i = 1;
foreach ($widgets as $type => $name) { foreach ($widgets as $type => $name) {
$sub->route('widgets.new', $name, ['type' => $type], $i++); $sub->route('widgets.new', $name, ['type' => $type], $i++);
} }
}, 10, ['icon' => 'fa fa-fw fa-plus']); }, 10, ['icon' => 'fa fa-fw fa-plus']);
} }
if ($user->can('manage', Widget::class)) {
$sub->route('widgets.overview', trans('admin/mainMenu.widgetsOverview'), [], 20, ['icon' => 'fa fa-fw fa-list']);
}
$sub->route('widgets.overview', trans('admin/mainMenu.widgetsOverview'), [], 20, ['icon' => 'fa fa-fw fa-list']); // menu for widget areas
if ($user->can('manage', WidgetArea::class)) {
// menu for widget areas $sub->dropdown(trans('admin/mainMenu.widgetAreas'), function ($sub) use ($user) {
$sub->dropdown(trans('admin/mainMenu.widgetAreas'), function ($sub) { if ($user->can('create', WidgetArea::class)) {
$sub->route('widgetareas.new', trans('admin/mainMenu.newWidgetArea'), [], 1, ['icon' => 'fa fa-fw fa-plus']); $sub->route('widgetareas.new', trans('admin/mainMenu.newWidgetArea'), [], 1, ['icon' => 'fa fa-fw fa-plus']);
$sub->route('widgetareas.overview', trans('admin/mainMenu.widgetAreaOverview'), [], 2, ['icon' => 'fa fa-fw fa-list']); }
}, 50, ['icon' => 'fa fa-fw fa-object-group']); $sub->route('widgetareas.overview', trans('admin/mainMenu.widgetAreaOverview'), [], 2, ['icon' => 'fa fa-fw fa-list']);
}, 50, ['icon' => 'fa fa-fw fa-puzzle-piece']); }, 50, ['icon' => 'fa fa-fw fa-object-group']);
}
}, 50, ['icon' => 'fa fa-fw fa-puzzle-piece']);
}
/** /**
* Divide system entries and other links in menu * Divide system entries and other links in menu
*/ */
$menu->addDivider(9999); $menu->addDivider(9999);
$menu->dropdown(trans('admin/mainMenu.system'), function ($sub) { $menu->dropdown(trans('admin/mainMenu.system'), function ($sub) use ($user) {
/** /**
* User management * User management
*/ */
$sub->dropdown(trans('admin/mainMenu.userManagement'), function ($sub) { if ($user->can('manage', User::class)) {
$sub->route('users.new', trans('admin/mainMenu.newUser'), [], 10, ['icon' => 'fa fa-fw fa-user-plus']); $sub->dropdown(trans('admin/mainMenu.userManagement'), function ($sub) use ($user) {
$sub->route('users.overview', trans('admin/mainMenu.usersOverview'), [], 30, ['icon' => 'fa fa-fw fa-users']); if ($user->can('create', User::class)) {
}, 20, ['icon' => 'fa fa-fw fa-users']); $sub->route('users.new', trans('admin/mainMenu.newUser'), [], 10, ['icon' => 'fa fa-fw fa-user-plus']);
}
$sub->route('users.overview', trans('admin/mainMenu.usersOverview'), [], 30, ['icon' => 'fa fa-fw fa-users']);
}, 20, ['icon' => 'fa fa-fw fa-users']);
}
/** /**
* Templates * Templates
*/ */
$templatePaths = TemplatePathsHumanReadableRootOnly::getWithTranslations(); if ($user->can('manage', Template::class)) {
if (!empty($templatePaths)) { $templatePaths = TemplatePathsHumanReadableRootOnly::getWithTranslations();
$sub->dropdown(trans('admin/mainMenu.templates'), function ($sub) use ($templatePaths) { if (!empty($templatePaths)) {
$i = 1; $sub->dropdown(trans('admin/mainMenu.templates'), function ($sub) use ($templatePaths) {
foreach ($templatePaths as $id => $name) { $i = 1;
$sub->route('templates.overview', $name, ['id' => $id], $i++); foreach ($templatePaths as $id => $name) {
} $sub->route('templates.overview', $name, ['id' => $id], $i++);
}, 60, ['icon' => 'fa fa-fw fa-file-code-o']); }
}, 60, ['icon' => 'fa fa-fw fa-file-code-o']);
}
} }
$sub->route('log.overview', trans('admin/mainMenu.actionLog'), [], 70, ['icon' => 'fa fa-fw fa-history']); if ($user->can('manage', ActionLog::class)) {
$sub->route('settings.overview', trans('admin/mainMenu.settings'), [], 80, ['icon' => 'fa fa-fw fa-gear']); $sub->route('log.overview', trans('admin/mainMenu.actionLog'), [], 70, ['icon' => 'fa fa-fw fa-history']);
}
if ($user->can('manage', Settings::class)) {
$sub->route('settings.overview', trans('admin/mainMenu.settings'), [], 80, ['icon' => 'fa fa-fw fa-gear']);
$sub->route('permissions.index', trans('admin/mainMenu.permissions'), [], 90, ['icon' => 'fa fa-fw fa-key']);
}
}, 10000, ['icon' => 'fa fa-fw fa-gears']); }, 10000, ['icon' => 'fa fa-fw fa-gears']);
}); });
// create menu with user profile // create menu with user profile
\Menu::create('profileMenu', function ($menu) { \Menu::create('profileMenu', function ($menu) use ($user) {
$menu->route('users.detail', trans('admin/userManagement.profile'), [], 10, ['icon' => 'fa fa-fw fa-user icon']); $menu->route('users.detail', trans('admin/userManagement.profile'), ['user' => $user], 10, ['icon' => 'fa fa-fw fa-user icon']);
$menu->addDivider(999); $menu->addDivider(999);
$menu->route('logout', trans('admin/common.logout'), [], 1000, ['icon' => 'fa fa-fw fa-power-off icon']); $menu->route('logout', trans('admin/common.logout'), [], 1000, ['icon' => 'fa fa-fw fa-power-off icon']);
}); });
+3 -4
View File
@@ -17,8 +17,7 @@ class History implements HistoryHandler
switch ($changeset->column) { switch ($changeset->column) {
case 'pageContent': case 'pageContent':
$route = route('history.diff', [ $route = route('history.diff', [
'revision' => $changeset->edit_batch, 'revision' => $changeset->id
'id' => $changeset->id
]); ]);
return "(<a href='" . $route . "'>" . trans('admin/history.diff') . "</a>)"; return "(<a href='" . $route . "'>" . trans('admin/history.diff') . "</a>)";
@@ -48,8 +47,8 @@ class History implements HistoryHandler
break; break;
default: default:
return trans('admin/history.changedFromTo', [ return trans('admin/history.changedFromTo', [
'from' => is_null($changeset->old_value) ? trans('admin/history.emptyValue') : $changeset->old_value, 'from' => empty($changeset->old_value) ? trans('admin/history.emptyValue') : $changeset->old_value,
'to' => is_null($changeset->new_value) ? trans('admin/history.emptyValue') : $changeset->new_value, 'to' => empty($changeset->new_value) ? trans('admin/history.emptyValue') : $changeset->new_value,
]); ]);
break; break;
} }
@@ -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;
+9 -1
View File
@@ -1,7 +1,10 @@
<?php <?php
namespace App\CMS\Handlers\Search; namespace App\CMS\Handlers\Search;
use App\Models\Content\Content as ContentModel; use App\Models\Content\Content as ContentModel;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
class Content extends Search class Content extends Search
{ {
@@ -10,10 +13,15 @@ class Content extends Search
* *
* @param string $term searched word * @param string $term searched word
* *
* @return array list of found objects * @return array|\Illuminate\Database\Eloquent\Collection|Collection|static[]
*/ */
public function search($term) public function search($term)
{ {
if (Auth::user()
->cannot('manage', ContentModel::class)) {
return new Collection();
}
$token = $this->tokenize($term); $token = $this->tokenize($term);
return ContentModel::where('pageContent', 'LIKE', $token) return ContentModel::where('pageContent', 'LIKE', $token)
+7
View File
@@ -1,7 +1,9 @@
<?php <?php
namespace App\CMS\Handlers\Search; namespace App\CMS\Handlers\Search;
use App\Models\FileManager\File; use App\Models\FileManager\File;
use Illuminate\Support\Collection;
class Files extends Search class Files extends Search
{ {
@@ -24,6 +26,11 @@ class Files extends Search
*/ */
public function search($term) public function search($term)
{ {
if (\Auth::user()
->cannot('manage', File::class)) {
return new Collection();
}
$token = $this->tokenize($term); $token = $this->tokenize($term);
return File::where('original_filename', 'LIKE', $token) return File::where('original_filename', 'LIKE', $token)
@@ -3,11 +3,17 @@ namespace App\CMS\Handlers\Search\Presenters;
use App\CMS\Enumerations\ContentStatuses; use App\CMS\Enumerations\ContentStatuses;
use App\CMS\Handlers\Contracts\SearchPresenterHandler; use App\CMS\Handlers\Contracts\SearchPresenterHandler;
use App\Models\Content\Content;
class AdminContent implements SearchPresenterHandler class AdminContent implements SearchPresenterHandler
{ {
public function render($foundItems) public function render($foundItems)
{ {
if (\Auth::user()
->cannot('manage', Content::class)) {
return null;
}
return view('admin.search.results.content', [ return view('admin.search.results.content', [
'pages' => $foundItems, 'pages' => $foundItems,
'statuses' => ContentStatuses::getWithTranslations(), 'statuses' => ContentStatuses::getWithTranslations(),
@@ -2,6 +2,7 @@
namespace App\CMS\Handlers\Search\Presenters; namespace App\CMS\Handlers\Search\Presenters;
use App\CMS\Handlers\Contracts\SearchPresenterHandler; use App\CMS\Handlers\Contracts\SearchPresenterHandler;
use App\Models\FileManager\File;
class AdminFiles implements SearchPresenterHandler class AdminFiles implements SearchPresenterHandler
{ {
@@ -14,6 +15,11 @@ class AdminFiles implements SearchPresenterHandler
*/ */
public function render($foundItems) public function render($foundItems)
{ {
if (\Auth::user()
->cannot('manage', File::class)) {
return null;
}
return view('admin.fileManager.filesTiles', ['files' => $foundItems, 'hideDelete' => true]); return view('admin.fileManager.filesTiles', ['files' => $foundItems, 'hideDelete' => true]);
} }
} }
+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(); return app(SettingsRepository::class)->getAll();
return $model->getAll();
}); });
} }
} }
+17 -8
View File
@@ -1,7 +1,8 @@
<?php <?php
namespace App\CMS\Helpers; namespace App\CMS\Helpers;
use App\Models\Widgets\WidgetArea; use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
class WidgetAreas class WidgetAreas
@@ -25,15 +26,13 @@ class WidgetAreas
protected static function loadWidgetArea($uniqueCode) protected static function loadWidgetArea($uniqueCode)
{ {
$widgets = Cache::remember('widget-' . $uniqueCode, setting('widgetCacheLifetime', 5), function () use ($uniqueCode) { $widgets = Cache::remember('widget-area-' . $uniqueCode, setting('widgetCacheLifetime', 5), function () use ($uniqueCode) {
$widgetArea = new WidgetArea(); $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 +43,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 +57,7 @@ class WidgetAreas
* *
* @param $uniqueCode * @param $uniqueCode
* *
* @return mixed * @return void
*/ */
public static function render($uniqueCode) public static function render($uniqueCode)
{ {
@@ -72,4 +71,14 @@ class WidgetAreas
echo isset(self::$widgetAreas[$uniqueCode]) ? self::$widgetAreas[$uniqueCode] : null; echo isset(self::$widgetAreas[$uniqueCode]) ? self::$widgetAreas[$uniqueCode] : null;
} }
/**
* Get list of loaded widgets and areas
*
* @return array
*/
public static function getLoadedWidgets()
{
return ['areas' => array_keys(self::$widgetAreas)];
}
} }
@@ -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,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 MetismenuPresenter extends Presenter class MetismenuPresenter extends Presenter
{ {
@@ -27,6 +28,10 @@ class MetismenuPresenter extends Presenter
*/ */
public function getMenuWithoutDropdownWrapper($item) public function getMenuWithoutDropdownWrapper($item)
{ {
if (!is_string($item->getUrl())) {
return null;
}
return '<li' . $this->getActiveState($item) . '><a href="' . $item->getUrl() . '">' . $item->getIcon() . ' ' . $item->title . '</a></li>' . PHP_EOL; return '<li' . $this->getActiveState($item) . '><a href="' . $item->getUrl() . '">' . $item->getIcon() . ' ' . $item->title . '</a></li>' . PHP_EOL;
} }
@@ -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
{ {
+64
View File
@@ -0,0 +1,64 @@
<?php
namespace App\CMS\ModuleManager;
use App\CMS\Contracts\Modules\AppHandler;
use App\CMS\Contracts\Modules\TemplateHandler;
use App\Models\Module;
use Illuminate\Support\Facades\App;
class Installer
{
/**
* Create new module in database
*
* @param $name
* @param $alias
* @param string $description
* @param null $handler
* @param $parentModuleId
* @param array $settings
*
* @return Module
* @throws \ErrorException
*/
public static function install($name, $alias, $staticName, $description, $handler, $parentModuleId, $settings)
{
// check if user does not want to install module in runtime
if (!App::runningInConsole()) {
throw new \ErrorException('Modules can be installed only via Artisan!');
}
$managesContent = $handler ? in_array(AppHandler::class, class_implements($handler)) : false;
$isTemplate = $handler ? in_array(TemplateHandler::class, class_implements($handler)) : false;
$supportCategories = $managesContent ? call_user_func([$handler, 'supportCategories']) : false;
if ($parentModuleId) {
$parentModule = Module::findOrFail($parentModuleId);
$parentModule->has_submodules = true;
$parentModule->save();
}
// insert module into database
$module = Module::create([
'name' => $name,
'description' => $description,
'handler' => $handler,
'static_name' => $staticName,
'manages_content' => $managesContent,
'support_categories' => $supportCategories,
'alias' => $alias,
'module_settings' => $settings,
'parent_id' => $parentModuleId ? $parentModuleId : null,
'enabled' => 1,
'is_template' => $isTemplate
]);
// install something module-specific
if ($handler && is_callable([$handler, 'install'])) {
call_user_func([$handler, 'install']);
}
return $module;
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\CMS\ModuleManager\Providers;
use App\CMS\Repositories\Module as ModuleRepository;
use Illuminate\Support\ServiceProvider;
class ModuleManager extends ServiceProvider
{
/**
* Bootstrap the application services.
* @return void
*/
public function boot()
{
// this service provider needs published config - config is merged right after this service provider
$modules = app(ModuleRepository::class)->getOnlyModules();
// iterate over all modules and enable or disable them
foreach ($modules as $module) {
if (isset($module->module_settings['providers']) && !empty($module->module_settings['providers'])) {
foreach ($module->module_settings['providers'] as $provider) {
$this->app->register($provider);
}
}
// include files (if any)
if (isset($module->module_settings['files']) && !empty($module->module_settings['files'])) {
foreach ($module->module_settings['files'] as $file) {
include config('modules.paths.modules') . '/' . $module->static_name . '/' . $file;
}
}
}
}
/**
* Register the application services.
* @return void
*/
public function register()
{
}
}
+60
View File
@@ -0,0 +1,60 @@
<?php
namespace App\CMS\ModuleManager;
use App\Models\Module;
use App\Models\Templates\TemplatePath;
use Illuminate\Support\Facades\App;
class Uninstaller {
/**
* Delete module from database and uninstall its dependencies
*
* @param Module $module
*
* @throws \ErrorException
*/
public static function uninstall(Module $module)
{
// check if user does not want to install module in runtime
if (!App::runningInConsole()) {
throw new \ErrorException('Modules can be uninstalled only via Artisan!');
}
// delete everything in /resources/views/visitor
if ($module->is_template) {
self::deleteDirectory(resource_path('views/visitor'));
self::deleteDirectory(resource_path('views/modules'));
self::deleteDirectory(public_path('assets'));
// delete all template paths
TemplatePath::getQuery()
->delete();
}
if ($module->handler && is_callable([$module->handler, 'uninstall'])) {
call_user_func([$module->handler, 'uninstall'], $module);
}
$module->delete();
}
/**
* Delete directory when uninstalling module.
*
* @param $directory
*
* @throws \ErrorException
*/
private static function deleteDirectory($directory)
{
if (!is_dir($directory)) {
return;
}
$success = \File::deleteDirectory($directory, true);
if (!$success) {
throw new \ErrorException('Cannot delete ' . $directory);
}
}
}
@@ -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\BaseHandler;
use App\Models\User;
class $Module$Handler extends BaseHandler
{
/**
* 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);
}
}
}
+9 -10
View File
@@ -1,4 +1,5 @@
<?php <?php
namespace App\CMS\Repositories\Content; namespace App\CMS\Repositories\Content;
use App\CMS\Contracts\Repositories\Content as IContent; use App\CMS\Contracts\Repositories\Content as IContent;
@@ -46,7 +47,7 @@ class Content extends Repository implements IContent
public function all() public function all()
{ {
return $this->getPageQuery() return $this->getPageQuery()
->get(); ->get();
} }
/** /**
@@ -63,7 +64,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 +77,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 +91,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();
} }
/** /**
@@ -114,6 +114,7 @@ class Content extends Repository implements IContent
->whereNull('contents.deleted_at') ->whereNull('contents.deleted_at')
->where('contents.language', LaravelLocalization::getCurrentLocale()) ->where('contents.language', LaravelLocalization::getCurrentLocale())
->where('modules.enabled', 1) ->where('modules.enabled', 1)
->with('module')
->orderBy('contents.created_at', 'DESC'); ->orderBy('contents.created_at', 'DESC');
// filter results using handler // filter results using handler
@@ -126,8 +127,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);
}
}
+24 -2
View File
@@ -1,9 +1,11 @@
<?php <?php
namespace App\CMS\Repositories; namespace App\CMS\Repositories;
use App\CMS\Contracts\Repositories\Module as IModule; use App\CMS\Contracts\Repositories\Module as IModule;
use App\Models\Content\Content; use App\Models\Content\Content;
use App\Models\Module as ModuleModel; use App\Models\Module as ModuleModel;
use Illuminate\Support\Facades\Cache;
class Module extends Repository implements IModule class Module extends Repository implements IModule
{ {
@@ -26,6 +28,15 @@ class Module extends Repository implements IModule
} }
} }
public function getContentModules()
{
return Cache::remember('enabled-content-modules', 3600, function () {
return ModuleModel::where('enabled', true)
->where('manages_content', true)
->get();
});
}
public function getCreateContentTitle(ModuleModel $module) public function getCreateContentTitle(ModuleModel $module)
{ {
$pageHeading = trans('admin/contents.new', ['name' => trans($module->name)]); $pageHeading = trans('admin/contents.new', ['name' => trans($module->name)]);
@@ -52,8 +63,19 @@ class Module extends Repository implements IModule
public function all() public function all()
{ {
return ModuleModel::where('enabled', true) return Cache::rememberForever('enabled-modules-and-template', function () {
->get(); return ModuleModel::where('enabled', true)
->get();
});
}
public function getOnlyModules()
{
return Cache::rememberForever('enabled-modules', function () {
return ModuleModel::where('enabled', true)
->where('is_template', false)
->get();
});
} }
public function getByHandler($handler) public function getByHandler($handler)
@@ -0,0 +1,15 @@
<?php
namespace App\CMS\Repositories\Permissions;
use App\Models\Permissions\Permission as PermissionModel;
class Permission
{
public function getRootPermissions()
{
return PermissionModel::whereNull('parent_id')
->with('subpermissions')
->get();
}
}
@@ -1,27 +1,27 @@
<?php <?php
namespace App\Models\ModelTraits;
namespace App\CMS\Repositories\Settings;
use App\Models\Settings as SettingsModel; use App\Models\Settings as SettingsModel;
use Illuminate\Support\Facades\Cache;
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 +34,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 +54,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 +81,31 @@ 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();
}
Cache::forget('settings');
}
} }
+7 -3
View File
@@ -1,10 +1,12 @@
<?php <?php
namespace App\Cms\Repositories\Templates; namespace App\Cms\Repositories\Templates;
use App\CMS\Contracts\Repositories\Template as ITemplate; use App\CMS\Contracts\Repositories\Template as ITemplate;
use App\CMS\Repositories\Repository; use App\CMS\Repositories\Repository;
use App\Models\Module; use App\Models\Module;
use App\Models\Templates\Template as TemplateModel; use App\Models\Templates\Template as TemplateModel;
use Illuminate\Support\Facades\Cache;
class Template extends Repository implements ITemplate class Template extends Repository implements ITemplate
{ {
@@ -68,8 +70,10 @@ class Template extends Repository implements ITemplate
public function getForModule(Module $module) public function getForModule(Module $module)
{ {
return TemplateModel::where('module_id', $module->id) return Cache::rememberForever('templates-for-module', function () use ($module) {
->select(['template_name', 'name', 'description']) return TemplateModel::where('module_id', $module->id)
->get(); ->select(['template_name', 'name', 'description'])
->get();
});
} }
} }
+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));
}
}
+18 -14
View File
@@ -1,19 +1,21 @@
<?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 Illuminate\Support\Facades\Cache;
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
{ {
/** /**
* Name getter * Name getter
*
* @return string * @return string
*/ */
public static function getName() public static function getName()
@@ -23,7 +25,6 @@ class Menu implements PublicWidget
/** /**
* Getter for description * Getter for description
*
* @return string * @return string
*/ */
public static function getDescription() public static function getDescription()
@@ -33,7 +34,6 @@ class Menu implements PublicWidget
/** /**
* Getter for presenter/renderer of this widget * Getter for presenter/renderer of this widget
*
* @return WidgetRenderer * @return WidgetRenderer
*/ */
public static function getPresenter() public static function getPresenter()
@@ -73,15 +73,19 @@ class Menu implements PublicWidget
$allowedStatuses[] = IContent::STATUS_PROTECTED; $allowedStatuses[] = IContent::STATUS_PROTECTED;
} }
$pages = Content::where('language', LaravelLocalization::getCurrentLocale()) return Cache::remember('widget-menu-content-pages', 5, function () use ($ids, $allowedStatuses) {
->whereIn('id', $ids) $pages = Content::where('language', LaravelLocalization::getCurrentLocale())
->whereIn('status', $allowedStatuses) ->whereIn('id', $ids)
->get(); ->whereIn('status', $allowedStatuses)
$used = []; ->where('moduleHandler', '!=', Article::class)
foreach ($pages as $page) { ->get();
$used[$page->id] = $page;
}
return $used; $used = [];
foreach ($pages as $page) {
$used[$page->id] = $page;
}
return $used;
});
} }
} }
+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]);
} }
} }
+119
View File
@@ -0,0 +1,119 @@
<?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;
}
if (!is_dir($path))
mkdir($path);
// 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,47 @@
<?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();
\Cache::forget('enabled-modules');
\Cache::forget('enabled-modules-and-template');
$this->line('Module ' . $module->static_name . ' disabled.');
}
}
@@ -0,0 +1,51 @@
<?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();
\Cache::forget('enabled-modules');
\Cache::forget('enabled-modules-and-template');
$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,7 +1,8 @@
<?php <?php
namespace App\Console\Commands; namespace App\Console\Commands\Modules;
use App\CMS\ModuleManager\Installer;
use App\Models\Module; use App\Models\Module;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Contracts\Filesystem\FileNotFoundException; use Illuminate\Contracts\Filesystem\FileNotFoundException;
@@ -14,13 +15,11 @@ class InstallModule extends Command
{ {
/** /**
* The name and signature of the console command. * The name and signature of the console 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.
*
* @var string * @var string
*/ */
protected $description = 'Custom installation of CMS module. Name given as directory name in /modules.'; protected $description = 'Custom installation of CMS module. Name given as directory name in /modules.';
@@ -30,7 +29,6 @@ class InstallModule extends Command
/** /**
* Create a new command instance. * Create a new command instance.
*
* @return void * @return void
*/ */
public function __construct() public function __construct()
@@ -55,8 +53,9 @@ class InstallModule extends Command
// get config // get config
$config = $this->loadConfig(); $config = $this->loadConfig();
if (empty($config)) if (empty($config)) {
return; return;
}
// check if it is valid // check if it is valid
$this->checkMandatoryFields($config); $this->checkMandatoryFields($config);
@@ -68,14 +67,15 @@ class InstallModule extends Command
Cache::forget('enabled-modules'); Cache::forget('enabled-modules');
Cache::forget('module-handler-to-id-enumeration'); Cache::forget('module-handler-to-id-enumeration');
exec('composer dump-autoload');
// inform user // inform user
$this->line('Module ' . $name . ' successfuly installed'); $this->line('Module ' . $name . ' successfuly installed.');
} }
/** /**
* Load config from Config/config.php in module files. We cannot use config() because the file have not published * Load config from Config/config.php in module files. We cannot use config() because the file have not published
* yet. * yet.
*
* @return array * @return array
* @throws FileNotFoundException * @throws FileNotFoundException
*/ */
@@ -84,8 +84,9 @@ class InstallModule extends Command
$basePath = $this->modulesPath . DIRECTORY_SEPARATOR . $this->moduleName . DIRECTORY_SEPARATOR; $basePath = $this->modulesPath . DIRECTORY_SEPARATOR . $this->moduleName . DIRECTORY_SEPARATOR;
$path = $basePath . 'Config' . DIRECTORY_SEPARATOR . 'config.php'; $path = $basePath . 'Config' . DIRECTORY_SEPARATOR . 'config.php';
if (basename($basePath) == 'Database') if (basename($basePath) == 'Database') {
return []; return [];
}
// check if module has Config/config.php file // check if module has Config/config.php file
if (!file_exists($path)) { if (!file_exists($path)) {
@@ -120,7 +121,6 @@ class InstallModule extends Command
/** /**
* Installs module into database. * Installs module into database.
*
* This method calls Module::install, which handles specific installation of module. In this way we should be able * This method calls Module::install, which handles specific installation of module. In this way we should be able
* to install any module even with some other database structures. * to install any module even with some other database structures.
* *
@@ -154,14 +154,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, 'order' => isset($config['order']) ? $config['order'] : 0,
'aliases' => isset($config['aliases']) ? $config['aliases'] : [], 'files' => isset($config['files']) ? $config['files'] : []
'order' => isset($config['order']) ? $config['order'] : 0,
'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 +182,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']);
}
}
@@ -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()
{
//
}
}
@@ -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
@@ -2,6 +2,8 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\CMS\ModuleManager\Installer;
use App\CMS\ModuleManager\Uninstaller;
use App\Models\Module; use App\Models\Module;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
@@ -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'], $config['staticName'], $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);
}
}
+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,28 +27,32 @@ 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();
$contentModules = app(\App\CMS\Repositories\Module::class)->getContentModules();
return view('admin.content.overview', [ return view('admin.content.overview', [
'pages' => $pages, 'pages' => $pages,
'homepage' => $homepage, 'homepage' => $homepage,
'pageHeading' => $pageHeading, 'pageHeading' => $pageHeading,
'contentModules' => $contentModules,
'statuses' => ContentStatuses::getWithTranslations(), 'statuses' => ContentStatuses::getWithTranslations(),
'module' => isset($module) ? $module : null 'module' => isset($module) ? $module : null
]); ]);
@@ -1,22 +1,23 @@
<?php <?php
namespace App\Http\Controllers\Admin\Contents; 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 Illuminate\Support\Collection;
use Modules\Categories\Contracts\Repositories\Category as ICategory;
/** /**
* Class CreateNewContent * Class CreateNewContent
*
* Controller for creating new content page. * Controller for creating new content page.
*
* @package App\Http\Controllers\Admin\Contents * @package App\Http\Controllers\Admin\Contents
*/ */
class CreateNewContent extends Controller class CreateNewContent extends Controller
@@ -29,10 +30,6 @@ class CreateNewContent extends Controller
* @var IModuleRepository * @var IModuleRepository
*/ */
private $module; private $module;
/**
* @var ICategory
*/
private $category;
/** /**
* @var ITemplate * @var ITemplate
*/ */
@@ -40,23 +37,20 @@ class CreateNewContent extends Controller
/** /**
* CreateNewContent constructor. * CreateNewContent constructor.
*
* Sets File and Content models into class variables * Sets File and Content models into class variables
* *
* @param IContent|Content $content * @param IContent|Content $content
* @param IModuleRepository $module * @param IModuleRepository $module
* @param ICategory $category * @param ICategory $category
*
* @param ITemplate $template * @param ITemplate $template
* *
* @internal param File $file * @internal param File $file
*/ */
public function __construct(IContent $content, IModuleRepository $module, ICategory $category, ITemplate $template) public function __construct(IContent $content, IModuleRepository $module, ITemplate $template)
{ {
parent::__construct(); parent::__construct();
$this->content = $content; $this->content = $content;
$this->module = $module; $this->module = $module;
$this->category = $category;
$this->template = $template; $this->template = $template;
} }
@@ -67,13 +61,16 @@ 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);
$categories = $this->category->getForModule($module);
$categories = new Collection();
if (class_exists(ICategory::class)) {
$categories = app(ICategory::class)->getForModule($module);
}
$page = $this->content->getOne(); $page = $this->content->getOne();
@@ -85,7 +82,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 +92,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')
@@ -1,4 +1,5 @@
<?php <?php
namespace App\Http\Controllers\Admin\Contents; namespace App\Http\Controllers\Admin\Contents;
use App\CMS\Contracts\Repositories\Content as IContent; use App\CMS\Contracts\Repositories\Content as IContent;
@@ -6,18 +7,15 @@ 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 App\CMS\Enumerations\ContentStatuses; use App\CMS\Enumerations\ContentStatuses;
use App\Cms\Handlers\Interactions\Interaction; use App\Cms\Handlers\Interactions\Interaction;
use App\CMS\Helpers\CurrentTemplate;
use App\Cms\Interactions\Admin\Content\EditContent as EditContentInteraction; use App\Cms\Interactions\Admin\Content\EditContent as EditContentInteraction;
use App\Events\AttemptToEditInvalidContent;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditContentRequest; use App\Http\Requests\EditContentRequest;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\Content\Content; use App\Models\Content\Content;
use App\Models\Content\ContentHistory; use App\Models\Content\ContentHistory;
use App\Models\FileManager\File; use App\Models\FileManager\File;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Collection;
use Modules\Categories\Contracts\Repositories\Category as ICategory; use Modules\Categories\Contracts\Repositories\Category as ICategory;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class EditContent extends Controller class EditContent extends Controller
{ {
@@ -37,10 +35,6 @@ class EditContent extends Controller
* @var IModuleRepository * @var IModuleRepository
*/ */
private $module; private $module;
/**
* @var ICategory
*/
private $category;
/** /**
* @var ITemplate * @var ITemplate
*/ */
@@ -48,7 +42,6 @@ class EditContent extends Controller
/** /**
* EditContent constructor. * EditContent constructor.
*
* Load ContentHistory and File into this controller * Load ContentHistory and File into this controller
* *
* @param ContentHistory $history * @param ContentHistory $history
@@ -58,37 +51,36 @@ 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, ITemplate $template)
{ {
$this->history = $history; $this->history = $history;
$this->file = $file; $this->file = $file;
$this->content = $content; $this->content = $content;
$this->module = $module; $this->module = $module;
$this->category = $category;
$this->template = $template; $this->template = $template;
} }
/** /**
* 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);
$pageHeading = $this->module->getUpdateContentTitle($module, $page); $pageHeading = $this->module->getUpdateContentTitle($module, $page);
$templates = $this->template->getForModule($module); $templates = $this->template->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 $categories = new Collection();
CurrentTemplate::beforePopulatingEditForm($page); if (class_exists(ICategory::class)) {
$categories = app(ICategory::class)->getForModule($module);
}
// render view // render view
return view('admin.content.edit', [ return view('admin.content.edit', [
@@ -97,7 +89,8 @@ 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 +101,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
]); ]);
} }
@@ -2,13 +2,22 @@
namespace App\Http\Controllers\Admin\Dashboard; namespace App\Http\Controllers\Admin\Dashboard;
use App\CMS\Contracts\Repositories\Module;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use Illuminate\Http\Request; use App\Models\Content\Content;
use Illuminate\Support\Facades\Auth;
class Dashboard extends Controller class Dashboard extends Controller
{ {
public function index(Request $request) public function index()
{ {
return redirect()->route('content.overview'); $contentModules = app(Module::class)->getContentModules();
if (\Auth::user()
->can('manage', Content::class) && !$contentModules->isEmpty()) {
return redirect()->route('content.overview');
} else {
return redirect()->route('users.detail', ['user' => Auth::user()]);
}
} }
} }
@@ -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));
@@ -1,8 +1,8 @@
<?php <?php
namespace App\Http\Controllers\Admin\FileManager; namespace App\Http\Controllers\Admin\FileManager;
use App\CMS\Helpers\Path; use App\CMS\Helpers\Path;
use App\CMS\Helpers\Template;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\FileManager\File; use App\Models\FileManager\File;
@@ -33,11 +33,9 @@ class UploadedFilesOverview extends Controller
public function index(Directory $directory = null) public function index(Directory $directory = null)
{ {
// include hidden directories? // include hidden directories?
$includeHidden = Input::get('hidden');
$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);
} }

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