FIX: lots of bugfixes, sorry for ugly commit

This commit is contained in:
Michal Kváček
2017-02-09 23:10:11 +01:00
parent 99ed8806da
commit b7d4ab9515
47 changed files with 180 additions and 199 deletions
@@ -9,11 +9,11 @@ interface AdvancedContentModifier {
* Save module-specific values into database * Save module-specific values into database
* *
* @param Content $content * @param Content $content
* @param Request $request * @param array $inputData
* *
* @return mixed * @return mixed
*/ */
public static function createNew(Content &$content, Request $request); public static function createNew(Content &$content, array $inputData);
/** /**
* Method used for editing existing content page. * Method used for editing existing content page.
@@ -2,6 +2,7 @@
namespace App\CMS\Contracts\Repositories; namespace App\CMS\Contracts\Repositories;
use App\Models\Module as ModuleModel; use App\Models\Module as ModuleModel;
use App\Models\Templates\Template as TemplateModel;
interface Template interface Template
{ {
@@ -12,6 +13,8 @@ interface Template
const CUSTOM_EDIT_DIRECTORY = 1; const CUSTOM_EDIT_DIRECTORY = 1;
const ORIGINAL_DIRECTORY = 2; const ORIGINAL_DIRECTORY = 2;
public function setModel(TemplateModel $model);
public function getPathToTemplate(); public function getPathToTemplate();
public function getForModule(ModuleModel $module); public function getForModule(ModuleModel $module);
-8
View File
@@ -34,7 +34,6 @@ abstract class BaseHandler implements BaseModuleHandler
* Submenus can be registered later * Submenus can be registered later
*/ */
$menu->dropdown(trans('admin/mainMenu.contentPages'), function ($sub) { $menu->dropdown(trans('admin/mainMenu.contentPages'), function ($sub) {
$sub->addDivider(9999);
$sub->route('content.overview', trans('admin/mainMenu.contentPageOverview'), [], 10000, ['icon' => 'fa fa-fw fa-list']); $sub->route('content.overview', trans('admin/mainMenu.contentPageOverview'), [], 10000, ['icon' => 'fa fa-fw fa-list']);
}, 20, ['icon' => 'fa fa-fw fa-database']); }, 20, ['icon' => 'fa fa-fw fa-database']);
@@ -96,18 +95,11 @@ abstract class BaseHandler implements BaseModuleHandler
}, 60, ['icon' => 'fa fa-fw fa-file-code-o']); }, 60, ['icon' => 'fa fa-fw fa-file-code-o']);
} }
// $menu->dropdown(trans('admin/mainMenu.customFields'), function ($sub) {
// $sub->route('customfields.new', trans('admin/mainMenu.customFieldsNew'), [], 10, ['icon' => 'fa fa-fw fa-code']);
// $sub->route('customfields.overview', trans('admin/mainMenu.customFieldsOverview'), [], 50, ['icon' => 'fa fa-fw fa-code-fork']);
// }, 30, ['icon' => 'fa fa-fw fa-code']);
$sub->route('log.overview', trans('admin/mainMenu.actionLog'), [], 70, ['icon' => 'fa fa-fw fa-history']); $sub->route('log.overview', trans('admin/mainMenu.actionLog'), [], 70, ['icon' => 'fa fa-fw fa-history']);
$sub->route('settings.overview', trans('admin/mainMenu.settings'), [], 80, ['icon' => 'fa fa-fw fa-gear']); $sub->route('settings.overview', trans('admin/mainMenu.settings'), [], 80, ['icon' => 'fa fa-fw fa-gear']);
}, 10000, ['icon' => 'fa fa-fw fa-gears']); }, 10000, ['icon' => 'fa fa-fw fa-gears']);
}); });
// order
// create menu with user profile // create menu with user profile
\Menu::create('profileMenu', function ($menu) { \Menu::create('profileMenu', function ($menu) {
$menu->route('users.detail', trans('admin/userManagement.profile'), [], 10, ['icon' => 'fa fa-fw fa-user icon']); $menu->route('users.detail', trans('admin/userManagement.profile'), [], 10, ['icon' => 'fa fa-fw fa-user icon']);
@@ -1,9 +1,10 @@
<?php <?php
namespace App\CMS\Handlers\Registrators; namespace App\CMS\Handlers\Registrators;
use App\CMS\Contracts\Repositories\Template;
use App\CMS\Enumerations\TemplatePaths; use App\CMS\Enumerations\TemplatePaths;
use App\CMS\Enumerations\Templates; use App\CMS\Enumerations\Templates;
use App\CMS\Contracts\Repositories\Template; use App\Models\Templates\Template as TemplateModel;
use App\Models\Templates\TemplatePath; use App\Models\Templates\TemplatePath;
use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\File;
use Illuminate\Support\Str; use Illuminate\Support\Str;
@@ -134,7 +135,10 @@ class TemplateRegistrator
*/ */
protected function relativePath($directory) protected function relativePath($directory)
{ {
return trim(str_replace(base_path(), '', $directory), '/'); $directory = str_replace('/', DIRECTORY_SEPARATOR, $directory);
$directory = str_replace('\\', DIRECTORY_SEPARATOR, $directory);
return trim(str_replace(base_path(), '', $directory), '\\/');
} }
/** /**
@@ -145,6 +149,10 @@ class TemplateRegistrator
*/ */
protected function scanForSubdirectories($directory, $name) protected function scanForSubdirectories($directory, $name)
{ {
if (!is_dir($directory)) {
return;
}
$directories = File::directories($directory); $directories = File::directories($directory);
foreach ($directories as $dir) { foreach ($directories as $dir) {
@@ -222,7 +230,7 @@ class TemplateRegistrator
]; ];
// save template into database // save template into database
$newTemplate = Template::create($params); $newTemplate = TemplateModel::create($params);
// push template into enumeration - so it will not be registered again // push template into enumeration - so it will not be registered again
Templates::push($newTemplate->id, $templateName); Templates::push($newTemplate->id, $templateName);
@@ -295,12 +303,17 @@ class TemplateRegistrator
* *
* @return string * @return string
*/ */
private function getTemplateName($template) protected function getTemplateName($template)
{ {
$templateName = str_replace($this->registeredPath . DIRECTORY_SEPARATOR, '', $template); $templateName = $template;
$templateName = str_replace($this->registeredPath, '', $templateName);
$templateName = str_replace('\\', DIRECTORY_SEPARATOR, $templateName);
$templateName = str_replace('/', DIRECTORY_SEPARATOR, $templateName);
$templateName = str_replace(DIRECTORY_SEPARATOR, '.', $templateName); $templateName = str_replace(DIRECTORY_SEPARATOR, '.', $templateName);
$templateName = str_replace(Template::TEMPLATE_SUFFIX, '', $templateName); $templateName = str_replace(Template::TEMPLATE_SUFFIX, '', $templateName);
$templateName = preg_replace('/\.{2,}/', '.', $templateName);
return $this->namespace . $templateName; return $this->namespace . trim($templateName, '.');
} }
} }
@@ -8,7 +8,6 @@ class WidgetRegistrator
{ {
protected $registeredWidgets = []; protected $registeredWidgets = [];
/** /**
* Method used for registering new widgets * Method used for registering new widgets
* *
@@ -51,8 +50,10 @@ class WidgetRegistrator
]); ]);
// install widget (if neccessary) // install widget (if neccessary)
if (is_callable([$classname, 'install'])) {
call_user_func($classname . '::install'); call_user_func($classname . '::install');
} }
} }
} }
} }
}
+1 -1
View File
@@ -28,7 +28,7 @@ class CurrentTemplate implements TemplateHandler
throw new \ErrorException('DB not migrated, please, do so!'); throw new \ErrorException('DB not migrated, please, do so!');
} }
if (self::$template) { if (self::$template) {
self::$template->moduleSettings = json_decode(self::$template->moduleSettings); self::$template->module_settings = json_decode(self::$template->module_settings);
} }
self::$initialized = true; self::$initialized = true;
+1 -1
View File
@@ -7,7 +7,7 @@ class Widget
{ {
$handler = $widget->widget_type_handler; $handler = $widget->widget_type_handler;
if (!is_object($widget->settings)) { if (is_string($widget->settings)) {
$widget->settings = json_decode($widget->settings); $widget->settings = json_decode($widget->settings);
} }
@@ -85,7 +85,6 @@ class EditContent implements Interaction
'url' => 'required|unique:contents,url,' . $id.',id,deleted_at,NULL,language,' . LaravelLocalization::getCurrentLocale(), 'url' => 'required|unique:contents,url,' . $id.',id,deleted_at,NULL,language,' . LaravelLocalization::getCurrentLocale(),
'publishedFrom' => 'date', 'publishedFrom' => 'date',
'publishedTo' => 'date', 'publishedTo' => 'date',
'titlePhoto' => 'exists:files,id',
'status' => 'required|in:' . $statuses, 'status' => 'required|in:' . $statuses,
'parentPage' => 'exists:contents,id' 'parentPage' => 'exists:contents,id'
]; ];
@@ -77,6 +77,6 @@ class FoundationDrilldownMenuPresenter extends Presenter
<ul class="vertical menu"> <ul class="vertical menu">
' . $this->getChildMenuItems($item) . ' ' . $this->getChildMenuItems($item) . '
</ul> </ul>
</li>' . PHP_EOL;; </li>' . PHP_EOL;
} }
} }
@@ -56,6 +56,6 @@ class FoundationDropdownMenuPresenter extends Presenter
<ul class="vertical menu"> <ul class="vertical menu">
' . $this->getChildMenuItems($item) . ' ' . $this->getChildMenuItems($item) . '
</ul> </ul>
</li>' . PHP_EOL;; </li>' . PHP_EOL;
} }
} }
+1 -1
View File
@@ -107,7 +107,7 @@ class Content
} }
$moduleSettings = (array)json_decode($changed['moduleSettings']); $moduleSettings = (array)json_decode($changed['moduleSettings']);
$originalSettings = (array)json_decode($original['moduleSettings']); $originalSettings = isset($original['moduleSettings']) ? (array)json_decode($original['moduleSettings']) : [];
unset($changed['moduleSettings']); unset($changed['moduleSettings']);
$settingChanged = array_keys(array_diff_assoc($moduleSettings, $originalSettings)); $settingChanged = array_keys(array_diff_assoc($moduleSettings, $originalSettings));
+5 -4
View File
@@ -8,7 +8,7 @@ use App\Models\Templates\Template as TemplateModel;
class Template extends Repository implements ITemplate class Template extends Repository implements ITemplate
{ {
public function __construct(TemplateModel $model) public function setModel(TemplateModel $model)
{ {
$this->model = $model; $this->model = $model;
} }
@@ -23,7 +23,7 @@ class Template extends Repository implements ITemplate
public function getPathToTemplate($mode = null) public function getPathToTemplate($mode = null)
{ {
$templateName = $this->model->template_name; $templateName = $this->model->template_name;
$path = $this->model->path()->get(); $path = $this->model->templatePath;
// delete namespace if given // delete namespace if given
if (strpos($this->model->template_name, '::')) { if (strpos($this->model->template_name, '::')) {
@@ -66,8 +66,9 @@ class Template extends Repository implements ITemplate
} }
} }
public function getForModule(Module $module) { public function getForModule(Module $module)
return Template::where('module_id', $module->id) {
return TemplateModel::where('module_id', $module->id)
->select(['template_name', 'name', 'description']) ->select(['template_name', 'name', 'description'])
->get(); ->get();
} }
+3 -2
View File
@@ -7,6 +7,7 @@ use App\CMS\Widgets\Exceptions\MissingParameterException;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\Content\Content; use App\Models\Content\Content;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization; use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use App\CMS\Contracts\Repositories\Content as IContent;
class Menu implements PublicWidget class Menu implements PublicWidget
{ {
@@ -66,10 +67,10 @@ class Menu implements PublicWidget
public static function selectContentPages($ids) public static function selectContentPages($ids)
{ {
$allowedStatuses = [Content::STATUS_PUBLIC]; $allowedStatuses = [IContent::STATUS_PUBLIC];
if (\Auth::user()) { if (\Auth::user()) {
$allowedStatuses[] = Content::STATUS_PROTECTED; $allowedStatuses[] = IContent::STATUS_PROTECTED;
} }
$pages = Content::where('language', LaravelLocalization::getCurrentLocale()) $pages = Content::where('language', LaravelLocalization::getCurrentLocale())
+5 -10
View File
@@ -4,9 +4,9 @@ namespace App\CMS\Widgets\Menu\Presenters;
use App\CMS\Contracts\Repositories\Content as ContentContract; use App\CMS\Contracts\Repositories\Content as ContentContract;
use App\CMS\Contracts\Widgets\WidgetRenderer; 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\Content\Content;
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\Request;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
@@ -79,24 +79,19 @@ class Menu implements WidgetRenderer
*/ */
public static function renderAddForm(WidgetType $type) public static function renderAddForm(WidgetType $type)
{ {
$extensions = App::make('registerMenuExtension')
->get();
$widget = new Widget(); $widget = new Widget();
$content = new Content(); $content = app(ContentContract::class);
// get list of all pages // get list of all pages
$pages = $content->getOverview() $pages = $content->getOverview();
->get(); $widget->settings = new \stdClass();
$widget->settings->links = [];
$widget->settingsObj = new \stdClass();
$widget->settingsObj->links = new \stdClass();
return view('admin.widgets.menu.new', [ return view('admin.widgets.menu.new', [
'type' => $type, 'type' => $type,
'widget' => $widget, 'widget' => $widget,
'pages' => $pages, 'pages' => $pages,
'extensions' => $extensions
]); ]);
} }
-2
View File
@@ -32,8 +32,6 @@ class AddLanguage extends Command
/** /**
* Execute the console command. * Execute the console command.
*
* @return mixed
*/ */
public function handle() public function handle()
{ {
-2
View File
@@ -24,8 +24,6 @@ class ChangePassword extends Command
/** /**
* Execute the console command. * Execute the console command.
*
* @return mixed
*/ */
public function handle() public function handle()
{ {
+2 -2
View File
@@ -93,7 +93,7 @@ class InstallModule extends Command
} }
// we cannot rely on config() helper, because this module does not have to be published // we cannot rely on config() helper, because this module does not have to be published
$config = @include($path); $config = include($path);
return $config; return $config;
} }
@@ -146,7 +146,7 @@ class InstallModule extends Command
throw new \Exception('Module ' . $config['name'] . ' already exists in database.'); throw new \Exception('Module ' . $config['name'] . ' already exists in database.');
} }
if (!$module) { if (is_null($module)) {
// insert module into database // insert module into database
$settings = [ $settings = [
'staticName' => $this->moduleName, 'staticName' => $this->moduleName,
+1 -1
View File
@@ -3,7 +3,7 @@
namespace App\Events; namespace App\Events;
use App\Models\Widgets\Widget; use App\Models\Widgets\Widget;
use App\Models\WidgetArea; use App\Models\Widgets\WidgetArea;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
class AssignWidget extends Event class AssignWidget extends Event
+1 -1
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 CreateNewWidgetArea extends Event class CreateNewWidgetArea extends Event
+1 -1
View File
@@ -3,7 +3,7 @@
namespace App\Events; namespace App\Events;
use App\Models\Widgets\Widget; use App\Models\Widgets\Widget;
use App\Models\WidgetArea; use App\Models\Widgets\WidgetArea;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
class RemoveWidgetFromArea extends Event class RemoveWidgetFromArea extends Event
@@ -34,7 +34,7 @@ class CreateNewDirectory extends Controller
* *
* @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse * @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
*/ */
public function postNew(Request $request) public function store(Request $request)
{ {
// create new directory // create new directory
try { try {
@@ -1,6 +1,7 @@
<?php <?php
namespace App\Http\Controllers\Admin\FileManager; namespace App\Http\Controllers\Admin\FileManager;
use App\CMS\Helpers\Path;
use App\CMS\Helpers\Template; 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;
@@ -82,7 +83,7 @@ class UploadFile extends Controller
return view('admin.snippets.ckEditorUploaded', [ return view('admin.snippets.ckEditorUploaded', [
'ckEditor' => Input::get('CKEditor'), 'ckEditor' => Input::get('CKEditor'),
'funcNumber' => Input::get('CKEditorFuncNum'), 'funcNumber' => Input::get('CKEditorFuncNum'),
'fileUrl' => Template::upload($uploadedFile['filename']) 'fileUrl' => Path::upload($uploadedFile['filename'])
]); ]);
} }
@@ -19,12 +19,23 @@ class UploadedFilesOverview extends Controller
// include hidden directories? // include hidden directories?
$includeHidden = Input::get('hidden'); $includeHidden = Input::get('hidden');
$subdirectories = $includeHidden ? $directory->allSubdirectories : $directory->subdirectories; if (!$directory->exists) {
$subdirectories = Directory::whereNull('parent_id');
} else {
$subdirectories = $directory->allSubdirectories();
}
if ($includeHidden === false) {
$subdirectories = $subdirectories->where('hidden', false);
}
$subdirectories = $subdirectories->get();
return view('admin.fileManager.overview', [ return view('admin.fileManager.overview', [
'directory' => $directory, 'directory' => $directory,
'subdirectories' => $subdirectories, 'subdirectories' => $subdirectories,
'newDirectory' => new Directory() 'newDirectory' => new Directory(),
'parentDirectory' => $directory
]); ]);
} }
} }
@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Admin\Templates; namespace App\Http\Controllers\Admin\Templates;
use App\CMS\Contracts\Repositories\Template as TemplateRepositoryContract;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests; use App\Http\Requests;
use App\Http\Requests\EditTemplateRequest; use App\Http\Requests\EditTemplateRequest;
@@ -24,17 +25,19 @@ class EditTemplate extends Controller
* @var $template Template * @var $template Template
*/ */
$template = Template::findOrFail($template); $template = Template::findOrFail($template);
$path = $template->getPath();
$repo = app(TemplateRepositoryContract::class);
$repo->setModel($template);
// load template content // load template content
$absolutePath = $template->getPathToTemplate(); $absolutePath = $repo->getPathToTemplate();
$content = @file_get_contents($absolutePath); $content = @file_get_contents($absolutePath);
return view('admin.templates.edit', [ return view('admin.templates.edit', [
'template' => $template, 'template' => $template,
'templateContent' => $content, 'templateContent' => $content,
'isWritable' => is_writable(dirname($absolutePath)), 'isWritable' => is_writable(dirname($absolutePath)),
'path' => $path, 'path' => $template->templatePath,
]); ]);
} }
@@ -4,8 +4,8 @@ namespace App\Http\Controllers\Admin\Users;
use App\CMS\Enumerations\UserRoles; use App\CMS\Enumerations\UserRoles;
use App\CMS\Enumerations\UserStates; use App\CMS\Enumerations\UserStates;
use App\Cms\Repositories\ActionLog\Actions;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests;
use App\Models\ActionLog\ActionLog; use App\Models\ActionLog\ActionLog;
use App\Models\User; use App\Models\User;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@@ -17,7 +17,7 @@ class UserDetail extends Controller
*/ */
private $log; private $log;
function __construct(ActionLog $log) function __construct(Actions $log)
{ {
$this->log = $log; $this->log = $log;
} }
@@ -6,8 +6,8 @@ use App\Events\AssignWidget;
use App\Events\RemoveWidgetFromArea; use App\Events\RemoveWidgetFromArea;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Models\Widgets\Widget; use App\Models\Widgets\Widget;
use App\Models\WidgetArea; use App\Models\Widgets\WidgetArea;
use App\Models\WidgetInWidgetArea; use App\Models\Widgets\WidgetInWidgetArea;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization; use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
@@ -1,10 +1,10 @@
<?php <?php
namespace App\Http\Controllers\Admin\Widgets; namespace App\Http\Controllers\Admin\Widgets;
use App\CMS\Widgets\Exceptions\MissingParameterException;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditWidgetRequest; use App\Http\Requests\EditWidgetRequest;
use App\Models\Widgets\Widget; use App\Models\Widgets\Widget;
use App\CMS\Widgets\Exceptions\MissingParameterException;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
class EditWidget extends Controller class EditWidget extends Controller
@@ -47,7 +47,7 @@ class EditWidget extends Controller
// try to save this widget // try to save this widget
try { try {
$widget = call_user_func([$widget->widget_type_handler, 'save'], $widget, (object)$request->all()); $widget->settings = json_encode(call_user_func([$widget->widget_type_handler, 'save'], $request));
} catch (MissingParameterException $e) { } catch (MissingParameterException $e) {
// user omitted some value // user omitted some value
return $this->invalidWidget($e->getMessage()); return $this->invalidWidget($e->getMessage());
@@ -64,7 +64,7 @@ class EditWidget extends Controller
// redirect with success notification // redirect with success notification
return redirect() return redirect()
->route('widgets.overview') ->back()
->with('success', trans('admin/widgets.successfullyEdited')); ->with('success', trans('admin/widgets.successfullyEdited'));
} }
@@ -1,10 +1,9 @@
<?php <?php
namespace App\Models\Content\ModelTraits; namespace App\Models\Content\ModelTraits;
use App\CMS\Handlers\Contracts\AppHandler;
use App\CMS\Handlers\Contracts\HistoryHandler; use App\CMS\Handlers\Contracts\HistoryHandler;
use App\CMS\Helpers\Differ; use App\CMS\Helpers\Differ;
use App\Models\Content\Content; use App\Models\Content\Content as ContentModel;
trait ContentHistory trait ContentHistory
{ {
@@ -15,7 +14,7 @@ trait ContentHistory
* *
* @return array * @return array
*/ */
public function getStructuredHistoryOf(Content $content) public function getStructuredHistoryOf(ContentModel $content)
{ {
$data = $content->history() $data = $content->history()
->select('content_history.*', 'contents.moduleHandler', 'users.email AS user_email', 'users.name AS user_name') ->select('content_history.*', 'contents.moduleHandler', 'users.email AS user_email', 'users.name AS user_name')
+14 -9
View File
@@ -1,11 +1,14 @@
<?php <?php
namespace App\Models\ModelTraits; namespace App\Models\ModelTraits;
use App\CMS\Handlers\Contracts\TemplateHandler; use App\CMS\Contracts\Modules\AppHandler;
use App\CMS\Contracts\Modules\TemplateHandler;
use App\Models\Module as ModuleModel;
use App\Models\Templates\TemplatePath; use App\Models\Templates\TemplatePath;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
trait Module { trait Module
{
/** /**
* Create new module in database * Create new module in database
* *
@@ -26,32 +29,32 @@ trait Module {
throw new \ErrorException('Modules can be installed only via Artisan!'); throw new \ErrorException('Modules can be installed only via Artisan!');
} }
$managesContent = $handler ? in_array('App\CMS\Handlers\Contracts\AppHandler', class_implements($handler)) : false; $managesContent = $handler ? in_array(AppHandler::class, class_implements($handler)) : false;
$isTemplate = $handler ? in_array(TemplateHandler::class, class_implements($handler)) : false; $isTemplate = $handler ? in_array(TemplateHandler::class, class_implements($handler)) : false;
$supportCategories = $managesContent ? call_user_func([$handler, 'supportCategories']) : false; $supportCategories = $managesContent ? call_user_func([$handler, 'supportCategories']) : false;
if ($parentModuleId) { if ($parentModuleId) {
$parentModule = Module::findOrFail($parentModuleId); $parentModule = ModuleModel::findOrFail($parentModuleId);
$parentModule->has_submodules = true; $parentModule->has_submodules = true;
$parentModule->save(); $parentModule->save();
} }
// insert module into database // insert module into database
$module = Module::create([ $module = ModuleModel::create([
'name' => $name, 'name' => $name,
'description' => $description, 'description' => $description,
'handler' => $handler, 'handler' => $handler,
'manages_content' => $managesContent, 'manages_content' => $managesContent,
'support_categories' => $supportCategories, 'support_categories' => $supportCategories,
'alias' => $alias, 'alias' => $alias,
'moduleSettings' => json_encode($settings), 'module_settings' => json_encode($settings),
'parent_id' => $parentModuleId ? $parentModuleId : null, 'parent_id' => $parentModuleId ? $parentModuleId : null,
'enabled' => 1, 'enabled' => 1,
'is_template' => $isTemplate 'is_template' => $isTemplate
]); ]);
// install something module-specific // install something module-specific
if ($handler) { if ($handler && is_callable([$handler, 'install'])) {
call_user_func([$handler, 'install']); call_user_func([$handler, 'install']);
} }
@@ -77,7 +80,8 @@ trait Module {
$this->deleteDirectory(public_path('assets')); $this->deleteDirectory(public_path('assets'));
// delete all template paths // delete all template paths
TemplatePath::getQuery()->delete(); TemplatePath::getQuery()
->delete();
} }
if ($this->handler && is_callable([$this->handler, 'uninstall'])) { if ($this->handler && is_callable([$this->handler, 'uninstall'])) {
@@ -96,8 +100,9 @@ trait Module {
*/ */
private function deleteDirectory($directory) private function deleteDirectory($directory)
{ {
if (!is_dir($directory)) if (!is_dir($directory)) {
return; return;
}
$success = \File::deleteDirectory($directory, true); $success = \File::deleteDirectory($directory, true);
+1 -1
View File
@@ -17,7 +17,7 @@ class Module extends Model
'name', 'name',
'description', 'description',
'alias', 'alias',
'moduleSettings', 'module_settings',
'enabled', 'enabled',
'support_categories', 'support_categories',
'manages_content', 'manages_content',
+2 -1
View File
@@ -21,7 +21,8 @@ class Template extends Model
* *
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/ */
public function path() { public function templatePath()
{
return $this->belongsTo(TemplatePath::class, 'path'); return $this->belongsTo(TemplatePath::class, 'path');
} }
} }
+4 -6
View File
@@ -25,13 +25,11 @@ class ModuleManager extends ServiceProvider
// iterate over all modules and enable or disable them // iterate over all modules and enable or disable them
foreach ($modules as $module) { foreach ($modules as $module) {
$module->module_settings = json_decode($module->module_settings);
$module->moduleSettings = json_decode($module->moduleSettings);
if ($module->is_template) { if ($module->is_template) {
if (isset($module->module_settings->providers) && !empty($module->module_settings->providers)) {
if (isset($module->moduleSettings->providers) && !empty($module->moduleSettings->providers)) { foreach ($module->module_settings->providers as $provider) {
foreach ($module->moduleSettings->providers as $provider) {
$this->app->register($provider); $this->app->register($provider);
} }
} }
@@ -61,7 +59,7 @@ class ModuleManager extends ServiceProvider
*/ */
private function createModulesJson(Module $module) private function createModulesJson(Module $module)
{ {
$config = $module->moduleSettings; $config = $module->module_settings;
if (is_null($config)) { if (is_null($config)) {
return; return;
+7 -5
View File
@@ -3,18 +3,19 @@ namespace App\Providers;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
abstract class ModuleServiceProvider extends ServiceProvider { abstract class ModuleServiceProvider extends ServiceProvider
{
/** /**
* 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;
protected $alias = false; protected $alias = false;
protected $path = false; protected $path = false;
abstract protected function setModuleAlias(); abstract protected function setModuleAlias();
abstract protected function setModulePath(); abstract protected function setModulePath();
/** /**
@@ -57,11 +58,13 @@ abstract class ModuleServiceProvider extends ServiceProvider {
$viewPath = base_path('resources/views/modules/' . $this->alias); $viewPath = base_path('resources/views/modules/' . $this->alias);
$sourcePath = $this->path . '/../Resources/views'; $sourcePath = $this->path . '/../Resources/views';
$this->publishes([$sourcePath => $viewPath], 'module-views');
$this->loadViewsFrom(array_merge(array_map(function ($path) { $this->loadViewsFrom(array_merge(array_map(function ($path) {
return $path . '/modules/' . $this->alias; return $path . '/modules/' . $this->alias;
}, \Config::get('view.paths')), [$sourcePath]), $this->alias); }, \Config::get('view.paths')), [$sourcePath]), $this->alias);
if (is_dir($sourcePath)) {
$this->publishes([$sourcePath => $viewPath], 'module-views');
}
} }
/** /**
@@ -73,5 +76,4 @@ abstract class ModuleServiceProvider extends ServiceProvider {
{ {
$this->loadTranslationsFrom($this->path . '/../Resources/lang', $this->alias); $this->loadTranslationsFrom($this->path . '/../Resources/lang', $this->alias);
} }
} }
+1 -1
View File
@@ -44,7 +44,7 @@ class SubmodulesManager extends ServiceProvider
$initFiles = $config->get('files', []); $initFiles = $config->get('files', []);
foreach ($initFiles as $file) { foreach ($initFiles as $file) {
@include $submodulePath . DIRECTORY_SEPARATOR . $file; require $submodulePath . DIRECTORY_SEPARATOR . $file;
} }
} catch (FileNotFoundException $e) { } catch (FileNotFoundException $e) {
// ignore missing module and do not register this submodule // ignore missing module and do not register this submodule
+12 -5
View File
@@ -5,6 +5,7 @@ namespace App\Providers;
use App\CMS\Contracts\Repositories\Template as TemplateContract; use App\CMS\Contracts\Repositories\Template as TemplateContract;
use App\CMS\Handlers\Registrators\TemplateRegistrator; use App\CMS\Handlers\Registrators\TemplateRegistrator;
use App\CMS\Helpers\CurrentTemplate; use App\CMS\Helpers\CurrentTemplate;
use App\Models\Module;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
@@ -44,6 +45,9 @@ class TemplateServiceProvider extends ServiceProvider
public function registerTemplatePaths($publicTemplates) public function registerTemplatePaths($publicTemplates)
{ {
$modules = Module::all()
->pluck('id', 'alias');
/** /**
* @var $registrator TemplateRegistrator * @var $registrator TemplateRegistrator
*/ */
@@ -51,14 +55,17 @@ class TemplateServiceProvider extends ServiceProvider
foreach ($publicTemplates as $template) { foreach ($publicTemplates as $template) {
// setup some global variables // setup some global variables
$module = strtolower($template['module']); $module = strtolower($template['module']);
$alias = isset($template['alias']) ? $template['alias'] : $module;
$namespace = isset($template['namespace']) ? $template['namespace'] : strtolower($template['module']); $namespace = isset($template['namespace']) ? $template['namespace'] : strtolower($template['module']);
if (!$modules->get($alias)) {
continue;
}
// register path with current template name // register path with current template name
$registrator->setNamespace($namespace); $registrator->setNamespace($namespace);
if (is_callable([config($module . '.handler'), 'getModuleId'])) { $registrator->setModuleId($modules->get($alias));
$registrator->setModuleId(call_user_func([config($module . '.handler'), 'getModuleId']));
}
$registrator->register('resources/views/modules/' . $module, 'visitor', $template['templateName']); $registrator->register('resources/views/modules/' . $module, 'visitor', $template['templateName']);
} }
@@ -81,11 +88,11 @@ class TemplateServiceProvider extends ServiceProvider
private function publishViewResources() private function publishViewResources()
{ {
$template = CurrentTemplate::get(); $template = CurrentTemplate::get();
if (!$template || is_null($template->moduleSettings)) { if (!$template || is_null($template->module_settings)) {
return; return;
} }
$templateDir = base_path('templates/' . $template->moduleSettings->staticName . '/Resources'); $templateDir = base_path('templates/' . $template->module_settings->staticName . '/Resources');
$assetsDir = $templateDir . '/' . TemplateContract::ASSETS_DIRECTORY; $assetsDir = $templateDir . '/' . TemplateContract::ASSETS_DIRECTORY;
$viewsDir = $templateDir . '/views'; $viewsDir = $templateDir . '/views';
+2 -2
View File
@@ -59,9 +59,9 @@ class Article extends Handler implements ContentTitles, AdvancedContentModifier,
* *
* @return mixed|void * @return mixed|void
*/ */
public static function createNew(Content &$content, Request $request) public static function createNew(Content &$content, array $inputData)
{ {
$content->moduleSettings = ['allowComments' => (int)$request->has('allowComments')]; $content->moduleSettings = ['allowComments' => (int)isset($inputData['allowComments'])];
} }
/** /**
+1 -1
View File
@@ -12,4 +12,4 @@
| |
*/ */
require __DIR__ . '/Http/routes.php'; require __DIR__ . DIRECTORY_SEPARATOR.'Http'.DIRECTORY_SEPARATOR.'routes.php';
@@ -1,10 +1,8 @@
<?php <?php
namespace Modules\Blog\ArticleList\Handlers; namespace Modules\Blog\ArticleList\Handlers;
use App\CMS\Enumerations\ModulesHandlerToId;
use App\CMS\Handlers\Handler; use App\CMS\Handlers\Handler;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Request;
use App\Models\Content\Content; use App\Models\Content\Content;
use App\Models\User; use App\Models\User;
use Carbon\Carbon; use Carbon\Carbon;
@@ -29,7 +27,7 @@ class ArticleList extends Handler
}, 20, ['icon' => 'fa fa-fw fa-book']); }, 20, ['icon' => 'fa fa-fw fa-book']);
} }
$blogSubmenu->route('content.new', trans('articlelist::module.name'), ['id' => self::getModuleId()], 100, ['icon' => 'fa fa-fw fa-list-alt']); $blogSubmenu->route('content.new', trans('articlelist::module.name'), ['id' => 'blog-articlelist'], 100, ['icon' => 'fa fa-fw fa-list-alt']);
} }
/** /**
@@ -145,55 +143,8 @@ class ArticleList extends Handler
]); ]);
} }
public static function getModuleId()
{
$handler = config('articlelist.handler');
$allModules = ModulesHandlerToId::getWithTranslations();
$moduleId = isset($allModules[$handler]) ? $allModules[$handler] : null;
return $moduleId;
}
public static function supportCategories() public static function supportCategories()
{ {
return false; return false;
} }
/**
* Save module-specific values into database
*
* @param Content $content
* @param Request $request
*
* @return mixed
* @internal param Widget $widget
*/
public static function createNew(Content &$content, Request $request)
{
}
/**
* 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 $request
*
* @param $revisionID string ID of revision used
*
* @return int number of edited fields
*/
public static function edit(Content &$content, Request $request, $revisionID)
{
}
/**
* Install module
*
* @return mixed
*/
public static function install()
{
}
} }
+1 -1
View File
@@ -12,4 +12,4 @@
| |
*/ */
require __DIR__ . '/Http/routes.php'; require __DIR__ . DIRECTORY_SEPARATOR.'Http'.DIRECTORY_SEPARATOR.'routes.php';
+1 -1
View File
@@ -12,4 +12,4 @@
| |
*/ */
require __DIR__ . '/Http/routes.php'; require __DIR__ . DIRECTORY_SEPARATOR.'Http'.DIRECTORY_SEPARATOR.'routes.php';
+11 -12
View File
@@ -21,26 +21,25 @@ class ContactForm extends Handler implements ContentTitles, AdvancedContentModif
* Save module-specific values into database * Save module-specific values into database
* *
* @param Content $content * @param Content $content
* @param Request $request * @param array $inputData
* *
* @return mixed * @return mixed
* @internal param Widget $widget
*/ */
public static function createNew(Content &$content, Request $request) public static function createNew(Content &$content, array $inputData)
{ {
$settings = [ $settings = [
'phone' => $request->phone, 'phone' => $inputData['phone'],
'email' => $request->email, 'email' => $inputData['email'],
'contactEmail' => $request->contactEmail, 'contactEmail' => $inputData['contactEmail'],
'subject' => $request->subject, 'subject' => $inputData['subject'],
'companyName' => $request->companyName, 'companyName' => $inputData['companyName'],
'address' => $request->address, 'address' => $inputData['address'],
'gpsLat' => $request->gpsLat, 'gpsLat' => $inputData['gpsLat'],
'gpsLng' => $request->gpsLng, 'gpsLng' => $inputData['gpsLng'],
]; ];
// save settings // save settings
$content->moduleSettings = json_encode($settings); $content->moduleSettings = $settings;
} }
/** /**
@@ -2,6 +2,7 @@
namespace Modules\ContactForm\Widgets\Address; namespace Modules\ContactForm\Widgets\Address;
use App\CMS\Contracts\Widgets\PublicWidget; use App\CMS\Contracts\Widgets\PublicWidget;
use App\Http\Requests\Request;
use App\Models\Widgets\Widget; use App\Models\Widgets\Widget;
use App\CMS\Contracts\Widgets\WidgetRenderer; use App\CMS\Contracts\Widgets\WidgetRenderer;
@@ -43,10 +44,8 @@ class Address implements PublicWidget
* *
* @return mixed * @return mixed
*/ */
public static function save(Widget $widget, \stdClass $data) public static function save(Request $data)
{ {
$widget->settings = json_encode(['contactFormId' => $data->contactFormId,]); return ['contactFormId' => $data->contactFormId];
return $widget;
} }
} }
+3 -4
View File
@@ -3,6 +3,7 @@ namespace Modules\ContactForm\Widgets\Form;
use App\CMS\Contracts\Widgets\PublicWidget; use App\CMS\Contracts\Widgets\PublicWidget;
use App\CMS\Contracts\Widgets\WidgetRenderer; use App\CMS\Contracts\Widgets\WidgetRenderer;
use App\Http\Requests\Request;
use App\Models\Widgets\Widget; use App\Models\Widgets\Widget;
class Form implements PublicWidget class Form implements PublicWidget
@@ -43,10 +44,8 @@ class Form implements PublicWidget
* *
* @return mixed * @return mixed
*/ */
public static function save(Widget $widget, \stdClass $data) public static function save(Request $data)
{ {
$widget->settings = json_encode(['contactFormId' => $data->contactFormId,]); return ['contactFormId' => $data->contactFormId];
return $widget;
} }
} }
@@ -6,6 +6,11 @@
<textarea name="description" class="form-control" placeholder="@lang('admin/fileManager.directoryDescription')" <textarea name="description" class="form-control" placeholder="@lang('admin/fileManager.directoryDescription')"
rows="3">{{old('description', $directory->description)}}</textarea> rows="3">{{old('description', $directory->description)}}</textarea>
@if ($parentDirectory->id)
<input type="text" name="parentDirectory" value="{{$parentDirectory->id}}">
@endif
<button type="submit" class="btn btn-primary"> <button type="submit" class="btn btn-primary">
@if ($directory->id) @if ($directory->id)
@lang('admin/fileManager.editDirectory') @lang('admin/fileManager.editDirectory')
@@ -15,7 +15,7 @@
<div class="col-lg-2"> <div class="col-lg-2">
<div class="callout"> <div class="callout">
<figure class="user-img text-center figure"> <figure class="user-img text-center figure">
<img class="img-rounded" src="{{$user->gravatar(200)}}" alt="" /> <img class="img-rounded" src="@gravatar($user->email, 200)" alt="" />
@if($user->id == Auth::user()->id) @if($user->id == Auth::user()->id)
<figcaption class="figure-caption">@lang('admin/userManagement.gravatarLink')</figcaption> <figcaption class="figure-caption">@lang('admin/userManagement.gravatarLink')</figcaption>
@@ -17,7 +17,7 @@
<div class="card-block container truncate sameheight-item"> <div class="card-block container truncate sameheight-item">
<div class="col-xs-12 text-center"> <div class="col-xs-12 text-center">
<a href="{{route('users.edit', ['id' => $user->id])}}"> <a href="{{route('users.edit', ['id' => $user->id])}}">
<img src="{{$user->gravatar(100)}}" alt="" /> <img src="{{\App\CMS\Helpers\Gravatar::img($user->email, 100)}}" alt="" />
</a> </a>
</div> </div>
<div class="col-xs-12"> <div class="col-xs-12">
@@ -62,7 +62,7 @@
<div class="col-lg-4"> <div class="col-lg-4">
<h3>@lang('admin/widgetAreas.new')</h3> <h3>@lang('admin/widgetAreas.new')</h3>
@include('admin.widgets.area.form', ['action' => route('widgetareas.postNew'), 'area' => new \App\Models\WidgetArea()]) @include('admin.widgets.area.form', ['action' => route('widgetareas.postNew'), 'area' => new \App\Models\Widgets\WidgetArea()])
</div> </div>
</div> </div>