FEATURE: add another repositories

This commit is contained in:
Michal Kváček
2016-10-18 22:35:06 +02:00
parent 662700b4f2
commit 4f6a006ad9
47 changed files with 410 additions and 400 deletions
@@ -0,0 +1,40 @@
<?php
namespace App\CMS\Contracts\Content;
use App\Http\Requests\Request;
use App\Models\Content\Content;
interface AdvancedContentModifier {
/**
* Save module-specific values into database
*
* @param Content $content
* @param Request $request
*
* @return mixed
*/
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 string $revisionId
*
* @return mixed
*/
public static function edit(Content &$content, Request $request, $revisionId);
/**
* Method called right after content page is marked as deleted
*
* This method is supposed to clean after "deleted" page.
*
* @param Content $content
*
* @return mixed
*/
public static function delete(Content $content);
}
@@ -1,5 +1,5 @@
<?php <?php
namespace App\CMS\Handlers\Contracts; namespace App\CMS\Contracts\Modules;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\Content\Content; use App\Models\Content\Content;
@@ -18,51 +18,6 @@ interface AppHandler extends BaseModuleHandler
public static function getHistoryHandler(); public static function getHistoryHandler();
/**
* Load some extra data for content management form?
*
* @param Content $content
*
* @return mixed
*/
public static function loadExtraData(Content $content);
/**
* 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);
/**
* Method called right after content page is marked as deleted
*
* This method is supposed to clean after "deleted" page.
*
* @param Content $content
*
* @return mixed
*/
public static function delete(Content $content);
/** /**
* Getter for section names in creating/editing content resource * Getter for section names in creating/editing content resource
* *
@@ -1,5 +1,5 @@
<?php <?php
namespace App\CMS\Handlers\Contracts; namespace App\CMS\Contracts\Modules;
use App\Models\User; use App\Models\User;
@@ -15,11 +15,4 @@ interface BaseModuleHandler
*/ */
public static function registerAdminMenu(User $user); public static function registerAdminMenu(User $user);
/**
* Install module.
*
* This method is called after inserting info about module into database. It can be called only using Artisan in
* CLI.
*/
public static function install();
} }
@@ -0,0 +1,23 @@
<?php
namespace App\CMS\Contracts\Modules;
use App\Models\Module;
interface InstallableModule {
/**
* Install module.
*
* This method is called after inserting info about module into database. It can be called only using Artisan in
* CLI.
*/
public static function install();
/**
* Uninstalls module
*
* @param Module $module
*
* @return mixed
*/
public static function uninstall(Module $module);
}
@@ -1,9 +1,8 @@
<?php <?php
namespace App\CMS\Handlers\Contracts; namespace App\CMS\Contracts\Modules;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\Content\Content; use App\Models\Content\Content;
use App\Models\Module;
/** /**
* Interface TemplateHandler * Interface TemplateHandler
@@ -14,15 +13,6 @@ use App\Models\Module;
*/ */
interface TemplateHandler extends BaseModuleHandler interface TemplateHandler extends BaseModuleHandler
{ {
/**
* Uninstall template
*
* Delete some items in database, delete files etc.
*
* @param Module $template
*/
public static function uninstall(Module $template);
/** /**
* Get list of registered templates and supported modules. * Get list of registered templates and supported modules.
* *
+2 -4
View File
@@ -3,11 +3,9 @@ namespace App\CMS\Contracts\Repositories;
interface Module extends BaseRepository { interface Module extends BaseRepository {
public function supportsCategories(); public function getCreateContentTitle(\App\Models\Module $module);
public function getCreateContentTitle(); public function getUpdateContentTitle(\App\Models\Module $module);
public function getUpdateContentTitle();
public function getOverviewTitle(\App\Models\Module $module); public function getOverviewTitle(\App\Models\Module $module);
} }
@@ -0,0 +1,18 @@
<?php
namespace App\CMS\Contracts\Repositories;
use App\Models\Module as ModuleModel;
interface Template
{
const EDITED_TEMPLATES_DIRECTORY = 'custom';
const ASSETS_DIRECTORY = 'assets';
const MODULES_DIRECTORY = 'modules';
const TEMPLATE_SUFFIX = '.blade.php';
const CUSTOM_EDIT_DIRECTORY = 1;
const ORIGINAL_DIRECTORY = 2;
public function getPathToTemplate();
public function getForModule(ModuleModel $module);
}
+1 -6
View File
@@ -1,10 +1,9 @@
<?php <?php
namespace App\CMS\Handlers; namespace App\CMS\Handlers;
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\Handlers\Contracts\AppHandler;
use App\CMS\Handlers\Contracts\BaseModuleHandler;
use App\Models\User; use App\Models\User;
abstract class BaseHandler implements BaseModuleHandler abstract class BaseHandler implements BaseModuleHandler
@@ -97,8 +96,6 @@ 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) { // $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.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']); // $sub->route('customfields.overview', trans('admin/mainMenu.customFieldsOverview'), [], 50, ['icon' => 'fa fa-fw fa-code-fork']);
@@ -107,8 +104,6 @@ abstract class BaseHandler implements BaseModuleHandler
$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 // order
+1 -20
View File
@@ -1,7 +1,7 @@
<?php <?php
namespace App\CMS\Handlers; namespace App\CMS\Handlers;
use App\CMS\Handlers\Contracts\AppHandler; use App\CMS\Contracts\Modules\AppHandler;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Content\Content; use App\Models\Content\Content;
@@ -15,16 +15,6 @@ use App\Models\Content\Content;
*/ */
abstract class Handler extends BaseHandler implements AppHandler abstract class Handler extends BaseHandler implements AppHandler
{ {
/**
* todo: Temporary method, will be implemented for each Handler
*
* @return bool
*/
public static function supportCategories()
{
return true;
}
public static function getHistoryHandler() public static function getHistoryHandler()
{ {
return History::class; return History::class;
@@ -65,15 +55,6 @@ abstract class Handler extends BaseHandler implements AppHandler
]; ];
} }
public static function delete(Content $content)
{
// temporarily nothing to do
}
public static function loadExtraData(Content $content) {
// temporarily nothing to do
}
public static function getExtendedFormInputsEdit() public static function getExtendedFormInputsEdit()
{ {
return self::getExtendedFormInputsCreate(); return self::getExtendedFormInputsCreate();
@@ -3,7 +3,7 @@ namespace App\CMS\Handlers\Registrators;
use App\CMS\Enumerations\TemplatePaths; use App\CMS\Enumerations\TemplatePaths;
use App\CMS\Enumerations\Templates; use App\CMS\Enumerations\Templates;
use App\Models\Templates\Template; use App\CMS\Contracts\Repositories\Template;
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;
+2
View File
@@ -11,6 +11,8 @@ class Template
* *
* @param $template * @param $template
* *
* @param bool $throwExceptions
*
* @return null|string * @return null|string
*/ */
public static function name($template, $throwExceptions = true) public static function name($template, $throwExceptions = true)
@@ -16,6 +16,7 @@ class EditContent implements Interaction
$page = $parameters[0]; $page = $parameters[0];
// upload file - if provided // upload file - if provided
// todo use interaction
$file = $page->uploadTitlePhoto($request); $file = $page->uploadTitlePhoto($request);
// let template to modify request and content page // let template to modify request and content page
@@ -52,13 +53,17 @@ class EditContent implements Interaction
// todo move this method out of the controller! // todo move this method out of the controller!
$data = \App\Http\Controllers\Admin\Contents\EditContent::getFields($request, array_values($fields)); $data = \App\Http\Controllers\Admin\Contents\EditContent::getFields($request, array_values($fields));
// todo use Model Observer and model::original attributes
list($revision, $changedColumns) = $page->updateWithHistory($fields, $data); list($revision, $changedColumns) = $page->updateWithHistory($fields, $data);
$changedColumns += call_user_func_array([$page->module_handler, 'edit'], [&$page, $request, $revision]); $changedColumns += call_user_func_array([$page->module_handler, 'edit'], [&$page, $request, $revision]);
// move to interaction
$changedColumns += $page->uploadRelatedFiles($request, $revision); $changedColumns += $page->uploadRelatedFiles($request, $revision);
if ($changedColumns > 0) // fire event with if ($changedColumns > 0) {
{
Event::fire(new EditContentEvent($page, $revision)); Event::fire(new EditContentEvent($page, $revision));
} }
+9 -2
View File
@@ -14,7 +14,7 @@ class Content extends Repository implements IContent
/** /**
* @var ContentModel * @var ContentModel
*/ */
private $model; protected $model;
public function __construct(ContentModel $model) public function __construct(ContentModel $model)
{ {
@@ -54,9 +54,16 @@ class Content extends Repository implements IContent
$page = new ContentModel(); $page = new ContentModel();
$page->user_id = \Auth::user()->id; $page->user_id = \Auth::user()->id;
$page->language = LaravelLocalization::getCurrentLocale(); $page->language = LaravelLocalization::getCurrentLocale();
$page->status = IContent::STATUS_DRAFT;
$page->module_settings = []; $page->module_settings = [];
} else { } else {
$page = $this->model->find($id); if (is_numeric($id)) {
$page = $this->model->findOrFail($id);
} else {
$page = $this->model->where('language', LaravelLocalization::getCurrentLocale())
->where('url', $id)
->firstOrFail();
}
$page->module_settings = json_decode($page->module_settings); $page->module_settings = json_decode($page->module_settings);
} }
+25 -8
View File
@@ -6,25 +6,42 @@ use App\Models\Module as ModuleModel;
class Module extends Repository implements IModule class Module extends Repository implements IModule
{ {
public function getOne($id = null) { /**
* @var ModuleModel
*/
private $module;
public function __construct(ModuleModel $module)
{
$this->module = $module;
}
public function getOne($id = null)
{
if (!is_null($id)) { if (!is_null($id)) {
return ModuleModel::find($id);
if (is_numeric($id)) {
return ModuleModel::findOrFail($id);
} else {
return ModuleModel::where('alias', $id)
->firstOrFail();
}
} else { } else {
return new ModuleModel(); return new ModuleModel();
} }
} }
public function supportsCategories() public function getCreateContentTitle(ModuleModel $module)
{ {
// TODO: Implement supportsCategories() method. $pageHeading = trans('admin/contents.new', ['name' => trans($module->name)]);
if (is_callable([$module->handler, 'getCreateNewTitle'])) {
$pageHeading = call_user_func([$module->handler, 'getCreateNewTitle']);
} }
public function getCreateContentTitle() return $pageHeading;
{
// TODO: Implement getCreateContentTitle() method.
} }
public function getUpdateContentTitle() public function getUpdateContentTitle(ModuleModel $module)
{ {
// TODO: Implement getUpdateContentTitle() method. // TODO: Implement getUpdateContentTitle() method.
} }
@@ -1,26 +1,16 @@
<?php <?php
namespace App\Cms\Repositories\Templates;
namespace App\Models\Templates\ModelTraits; use App\CMS\Contracts\Repositories\Template as ITemplate;
use App\CMS\Repositories\Repository;
use App\Models\Templates\TemplatePath; use App\Models\Module;
use App\Models\Templates\Template as TemplateModel; use App\Models\Templates\Template as TemplateModel;
trait Template { class Template extends Repository implements ITemplate
protected $pathModel = null; {
public function __construct(TemplateModel $model)
/**
* In one path may be many templates
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function getPath()
{ {
if (!$this->pathModel) { $this->model = $model;
$this->pathModel = TemplatePath::where('id', $this->path)
->first();
}
return $this->pathModel;
} }
/** /**
@@ -32,11 +22,11 @@ trait Template {
*/ */
public function getPathToTemplate($mode = null) public function getPathToTemplate($mode = null)
{ {
$templateName = $this->template_name; $templateName = $this->model->template_name;
$path = $this->getPath(); $path = $this->model->path()->get();
// delete namespace if given // delete namespace if given
if (strpos($this->template_name, '::')) { if (strpos($this->model->template_name, '::')) {
list(, $templateName) = explode('::', $templateName); list(, $templateName) = explode('::', $templateName);
} }
@@ -50,24 +40,24 @@ trait Template {
// path parts // path parts
$absolutePath = base_path($path->path); $absolutePath = base_path($path->path);
$templatePath = str_replace('.', $_, $templateName); $templatePath = str_replace('.', $_, $templateName);
$file = $templatePath . TemplateModel::TEMPLATE_SUFFIX; $file = $templatePath . ITemplate::TEMPLATE_SUFFIX;
// compose two versions of path - original and with "custom" directory // compose two versions of path - original and with "custom" directory
$original = $absolutePath . $_ . $file; $original = $absolutePath . $_ . $file;
$edited = $absolutePath . $_ . TemplateModel::EDITED_TEMPLATES_DIRECTORY . $_ . $file; $edited = $absolutePath . $_ . ITemplate::EDITED_TEMPLATES_DIRECTORY . $_ . $file;
// decide which path will be returned // decide which path will be returned
switch ($mode) { switch ($mode) {
case TemplateModel::CUSTOM_EDIT_DIRECTORY: case ITemplate::CUSTOM_EDIT_DIRECTORY:
return $edited; return $edited;
break; break;
case TemplateModel::ORIGINAL_DIRECTORY: case ITemplate::ORIGINAL_DIRECTORY:
return $original; return $original;
break; break;
default: default:
if (file_exists($absolutePath . $_ . TemplateModel::EDITED_TEMPLATES_DIRECTORY . $_ . $file)) { if (file_exists($absolutePath . $_ . ITemplate::EDITED_TEMPLATES_DIRECTORY . $_ . $file)) {
return $edited; return $edited;
} }
@@ -75,4 +65,10 @@ trait Template {
break; break;
} }
} }
public function getForModule(Module $module) {
return Template::where('module_id', $module->id)
->select(['template_name', 'name', 'description'])
->get();
}
} }
@@ -3,17 +3,14 @@ namespace App\Http\Controllers\Admin\Contents;
use App\CMS\Contracts\Repositories\Content as IContent; use App\CMS\Contracts\Repositories\Content as IContent;
use App\CMS\Contracts\Repositories\Module as IModuleRepository; use App\CMS\Contracts\Repositories\Module as IModuleRepository;
use App\CMS\Contracts\Repositories\Template as ITemplate;
use 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\FileManager\File;
use App\Models\Module;
use App\Models\Templates\Template;
use Modules\Categories\Entities\Category;
use Pingpong\Modules\Facades\Module as ModuleInstance;
/** /**
* Class CreateNewContent * Class CreateNewContent
@@ -24,10 +21,6 @@ use Pingpong\Modules\Facades\Module as ModuleInstance;
*/ */
class CreateNewContent extends Controller class CreateNewContent extends Controller
{ {
/**
* @var File
*/
private $file;
/** /**
* @var IContent * @var IContent
*/ */
@@ -36,71 +29,63 @@ class CreateNewContent extends Controller
* @var IModuleRepository * @var IModuleRepository
*/ */
private $module; private $module;
/**
* @var ICategory
*/
private $category;
/**
* @var ITemplate
*/
private $template;
/** /**
* CreateNewContent constructor. * CreateNewContent constructor.
* *
* Sets File and Content models into class variables * Sets File and Content models into class variables
* *
* @param File $file * @param IContent|Content $content
* @param Content $content
* @param IModuleRepository $module * @param IModuleRepository $module
* @param ICategory $category
*
* @param ITemplate $template
*
* @internal param File $file
*/ */
public function __construct(File $file, IContent $content, IModuleRepository $module) public function __construct(IContent $content, IModuleRepository $module, ICategory $category, ITemplate $template)
{ {
parent::__construct(); parent::__construct();
$this->file = $file;
$this->content = $content; $this->content = $content;
$this->module = $module; $this->module = $module;
$this->category = $category;
$this->template = $template;
} }
/** /**
* Display form for new content page * Display form for new content page
* *
* @param $moduleId * @param $module
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function create($moduleId) public function create($module)
{ {
$module = Module::findOrFail($moduleId); $module = $this->module->getOne($module);
$statuses = ContentStatuses::getWithTranslations(); $statuses = ContentStatuses::getWithTranslations();
$pageHeading = $this->module->getCreateContentTitle($module);
$templates = $this->template->getForModule($module);
$categories = $this->category->getForModule($module);
// set default page title $page = $this->content->getOne();
$pageHeading = trans('admin/contents.new', ['name' => trans($module->name)]);
if (is_callable([$module->handler, 'getCreateNewTitle'])) {
$pageHeading = call_user_func([$module->handler, 'getCreateNewTitle']);
}
// get list of usable templates
$templates = Template::where('module_id', $moduleId)
->select(['template_name', 'name', 'description'])
->get();
// add categories, if supported
$categoryModule = ModuleInstance::get('categories');
$categories = [];
if ($module->support_categories && !is_null($categoryModule) && $categoryModule->enabled()) {
$categories = Category::where('module_id', $moduleId)
->get();
}
// create default content object
$this->content->status = IContent::STATUS_DRAFT;
// render view // render view
return view('admin.content.new', [ return view('admin.content.new', [
'pageHeading' => $pageHeading, 'pageHeading' => $pageHeading,
'contentStatuses' => $statuses, 'contentStatuses' => $statuses,
'templates' => $templates, 'templates' => $templates,
'moduleId' => $moduleId,
'module' => $module, 'module' => $module,
'categories' => $categories, 'categories' => $categories,
'page' => $this->content, 'page' => $page,
'rootPages' => $this->content->getOverview() 'rootPages' => $this->content->getOverview(),
->get(),
'moduleName' => trans($module->name),
'extraData' => call_user_func([$module->handler, 'loadExtraData'], $this->content),
'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']),
]); ]);
@@ -116,7 +101,7 @@ class CreateNewContent extends Controller
*/ */
public function store(Request $request, $moduleId) public function store(Request $request, $moduleId)
{ {
$module = Module::findOrFail($moduleId); $module = $this->module->getOne($moduleId);
// create new page // create new page
Interaction::handle($request, new NewContent(), $module->handler); Interaction::handle($request, new NewContent(), $module->handler);
@@ -18,6 +18,10 @@ use Illuminate\Support\Facades\Event;
use Modules\Categories\Entities\Category; use Modules\Categories\Entities\Category;
use Pingpong\Modules\Facades\Module as ModuleInstance; use Pingpong\Modules\Facades\Module as ModuleInstance;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use App\CMS\Contracts\Repositories\Content as IContent;
use App\CMS\Contracts\Repositories\Module as IModuleRepository;
use App\CMS\Contracts\Repositories\Template as ITemplate;
use Modules\Categories\Contracts\Repositories\Category as ICategory;
class EditContent extends Controller class EditContent extends Controller
{ {
@@ -29,6 +33,22 @@ class EditContent extends Controller
* @var File * @var File
*/ */
private $file; private $file;
/**
* @var IContent
*/
private $content;
/**
* @var IModuleRepository
*/
private $module;
/**
* @var ICategory
*/
private $category;
/**
* @var ITemplate
*/
private $template;
/** /**
* EditContent constructor. * EditContent constructor.
@@ -37,58 +57,46 @@ class EditContent extends Controller
* *
* @param ContentHistory $history * @param ContentHistory $history
* @param File $file * @param File $file
* @param IContent $content
* @param IModuleRepository $module
* @param ICategory $category
* @param ITemplate $template
*/ */
public function __construct(ContentHistory $history, File $file) public function __construct(ContentHistory $history, File $file, IContent $content, IModuleRepository $module, ICategory $category, ITemplate $template)
{ {
$this->history = $history; $this->history = $history;
$this->file = $file; $this->file = $file;
$this->content = $content;
$this->module = $module;
$this->category = $category;
$this->template = $template;
} }
/** /**
* Display form for editing static page * Display form for editing static page
* *
* @param $id * @param $url
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function edit($id) public function edit($url)
{ {
// select all content statuses
$statuses = ContentStatuses::getWithTranslations(); $statuses = ContentStatuses::getWithTranslations();
$page = $this->content->getOne($url);
// try to find requested page
$page = Content::findOrFail($id);
$page->module_settings = json_decode($page->module_settings);
// get module ID // get module ID
$module = Module::where('handler', $page->module_handler) $module = Module::where('handler', $page->module_handler)
->firstOrFail(); ->firstOrFail();
$pageHeading = trans('admin/contents.edit', ['name' => e($page->title)]); $pageHeading = $this->module->getUpdateContentTitle($module);
if (is_callable([$module->handler, 'getEditTitle'])) { $templates = $this->template->getForModule($module);
$pageHeading = call_user_func([$module->handler, 'getEditTitle'], $page); $categories = $this->category->getForModule($module);
} $history = $this->history->getStructuredHistoryOf($page);
// get all Blade templates for rendering page
$templates = Template::where('module_id', $module->id)
->select(['template_name', 'name', 'description'])
->get();
// get module for Categories - PingPong module
$categoryModule = ModuleInstance::get('categories');
// add categories, if supported
$categories = [];
if ($module->support_categories && !is_null($categoryModule) && $categoryModule->enabled()) {
$categories = Category::where('module_id', $module->id)
->get();
}
// modify data for edit form according to installed template // modify data for edit form according to installed template
call_user_func_array([CurrentTemplate::handler(), 'beforePopulatingEditForm'], [&$page]); call_user_func_array([CurrentTemplate::handler(), 'beforePopulatingEditForm'], [&$page]);
$history = $this->history->getStructuredHistoryOf($page);
// render view // render view
return view('admin.content.edit', [ return view('admin.content.edit', [
'pageHeading' => $pageHeading, 'pageHeading' => $pageHeading,
@@ -96,11 +104,8 @@ class EditContent extends Controller
'page' => $page, 'page' => $page,
'module' => $module, 'module' => $module,
'categories' => $categories, 'categories' => $categories,
'rootPages' => $page->getOverview() 'rootPages' => $this->content->getOverview(),
->where('contents.id', '!=', $page->id)
->get(),
'templates' => $templates, 'templates' => $templates,
'extraData' => call_user_func([$page->module_handler, 'loadExtraData'], $page),
'formSectionNames' => call_user_func([$page->module_handler, 'getExtendedFormSections']), 'formSectionNames' => call_user_func([$page->module_handler, 'getExtendedFormSections']),
'formSections' => call_user_func([$page->module_handler, 'getExtendedFormInputsEdit']), 'formSections' => call_user_func([$page->module_handler, 'getExtendedFormInputsEdit']),
'historySize' => count($history['changesets']) 'historySize' => count($history['changesets'])
+3 -3
View File
@@ -1,15 +1,15 @@
<?php <?php
Route::group(['namespace' => 'Contents'], function () { Route::group(['namespace' => 'Contents'], function () {
// list of all static pages // list of all static pages
Route::get('content/overview/{moduleId?}/{status?}', 'ContentOverview@index') Route::get('content/overview/{module?}', 'ContentOverview@index')
->name('content.overview'); ->name('content.overview');
// form for creating new static page // form for creating new static page
Route::get('content/new/{moduleId}', 'CreateNewContent@create') Route::get('content/new/{module}', 'CreateNewContent@create')
->name('content.new'); ->name('content.new');
// form for editing existing static page // form for editing existing static page
Route::get('content/edit/{id}', 'EditContent@edit') Route::get('content/edit/{url}', 'EditContent@edit')
->name('content.edit'); ->name('content.edit');
// post method for creating new static page // post method for creating new static page
+1 -3
View File
@@ -2,8 +2,6 @@
namespace App\Models\Content; namespace App\Models\Content;
use App\Events\CreateNewContent;
use App\Events\Event;
use App\Models\FileManager\File; use App\Models\FileManager\File;
use App\Models\User; use App\Models\User;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
@@ -44,7 +42,7 @@ class Content extends Model
*/ */
public function history() public function history()
{ {
return $this->hasMany(\App\Models\Content\ContentHistory::class); return $this->hasMany(ContentHistory::class);
} }
/** /**
+9 -7
View File
@@ -6,7 +6,6 @@ use Illuminate\Database\Eloquent\Model;
class Template extends Model class Template extends Model
{ {
use ModelTraits\Template;
public $timestamps = true; public $timestamps = true;
protected $fillable = [ protected $fillable = [
'template_name', 'template_name',
@@ -16,10 +15,13 @@ class Template extends Model
'description', 'description',
'editable' 'editable'
]; ];
const EDITED_TEMPLATES_DIRECTORY = 'custom';
const ASSETS_DIRECTORY = 'assets'; /**
const MODULES_DIRECTORY = 'modules'; * Template path where this template is stored
const TEMPLATE_SUFFIX = '.blade.php'; *
const CUSTOM_EDIT_DIRECTORY = 1; * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
const ORIGINAL_DIRECTORY = 2; */
public function path() {
return $this->belongsTo(TemplatePath::class, 'path');
}
} }
-3
View File
@@ -4,9 +4,6 @@ namespace App\Models\Templates;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/**
* Class CustomFieldType
*/
class TemplatePath extends Model class TemplatePath extends Model
{ {
public $timestamps = true; public $timestamps = true;
+3
View File
@@ -4,6 +4,7 @@ namespace App\Providers;
use App\CMS\Contracts\Repositories\Content as IContent; 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\Contracts\Repositories\Template as ITemplate;
use App\CMS\Handlers\Registrators\SearchEngineRegistrator; use App\CMS\Handlers\Registrators\SearchEngineRegistrator;
use App\CMS\Handlers\Registrators\SettingsExtensionRegistrator; use App\CMS\Handlers\Registrators\SettingsExtensionRegistrator;
use App\CMS\Handlers\Registrators\TemplateRegistrator; use App\CMS\Handlers\Registrators\TemplateRegistrator;
@@ -14,6 +15,7 @@ use App\CMS\Handlers\Search\Presenters\AdminContent as AdminContentPresenter;
use App\CMS\Handlers\Search\Presenters\AdminFiles; use App\CMS\Handlers\Search\Presenters\AdminFiles;
use App\CMS\Repositories\Content\Content as ContentRepository; use App\CMS\Repositories\Content\Content as ContentRepository;
use App\CMS\Repositories\Module as ModuleRepository; use App\CMS\Repositories\Module as ModuleRepository;
use App\CMS\Repositories\Templates\Template as TemplateRepository;
use App\CMS\Widgets\HtmlCode\HtmlCode; use App\CMS\Widgets\HtmlCode\HtmlCode;
use App\CMS\Widgets\Menu\Menu; use App\CMS\Widgets\Menu\Menu;
use Barryvdh\Debugbar\ServiceProvider as DebugBarServiceProvider; use Barryvdh\Debugbar\ServiceProvider as DebugBarServiceProvider;
@@ -41,6 +43,7 @@ class AppServiceProvider extends ServiceProvider
$this->app->bind(IContent::class, ContentRepository::class); $this->app->bind(IContent::class, ContentRepository::class);
$this->app->bind(IModule::class, ModuleRepository::class); $this->app->bind(IModule::class, ModuleRepository::class);
$this->app->bind(ITemplate::class, TemplateRepository::class);
} }
/** /**
+54 -14
View File
@@ -1,18 +1,20 @@
<?php <?php
namespace Modules\Blog\Article\Handlers; namespace Modules\Blog\Article\Handlers;
use App\CMS\Enumerations\ModulesHandlerToId; use App\CMS\Contracts\Content\AdvancedContentModifier;
use App\CMS\Contracts\Modules\InstallableModule;
use App\CMS\Handlers\Contracts\ContentTitles; use App\CMS\Handlers\Contracts\ContentTitles;
use App\CMS\Handlers\Handler; use App\CMS\Handlers\Handler;
use App\Http\Controllers\Admin\Contents\EditContent; use App\Http\Controllers\Admin\Contents\EditContent;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\ActionLogType; use App\Models\ActionLog\ActionLogType;
use App\Models\Content\Content; use App\Models\Content\Content;
use App\Models\Module;
use App\Models\User; use App\Models\User;
use Modules\Blog\Article\Entities\Comment; use Modules\Blog\Article\Entities\Comment;
class Article extends Handler implements ContentTitles class Article extends Handler implements ContentTitles, AdvancedContentModifier, InstallableModule
{ {
/** /**
* Render given module into visitor area. * Render given module into visitor area.
@@ -109,22 +111,13 @@ class Article extends Handler implements ContentTitles
} }
$blogSubmenu->dropdown(trans('article::module.name'), function ($sub) { $blogSubmenu->dropdown(trans('article::module.name'), function ($sub) {
$sub->route('content.new', trans('article::article.new'), ['id' => self::getModuleId()], 10, ['icon' => 'fa fa-fw fa-pencil']); $sub->route('content.new', trans('article::article.new'), ['id' => config('article.alias')], 10, ['icon' => 'fa fa-fw fa-pencil']);
$sub->route('content.overview', trans('article::article.overview'), ['id' => self::getModuleId()], 30, ['icon' => 'fa fa-fw fa-book']); $sub->route('content.overview', trans('article::article.overview'), ['id' => config('article.alias')], 30, ['icon' => 'fa fa-fw fa-book']);
}, 10, ['icon' => 'fa fa-fw fa-book']); }, 10, ['icon' => 'fa fa-fw fa-book']);
$blogSubmenu->route('comments.overview', trans('article::module.commentsOverview'), [], 20, ['icon' => 'fa fa-fw fa-commenting-o']); $blogSubmenu->route('comments.overview', trans('article::module.commentsOverview'), [], 20, ['icon' => 'fa fa-fw fa-commenting-o']);
} }
public static function getModuleId()
{
$handler = config('article.handler');
$allModules = ModulesHandlerToId::getWithTranslations();
$moduleId = isset($allModules[$handler]) ? $allModules[$handler] : null;
return $moduleId;
}
/** /**
* Install module * Install module
*/ */
@@ -153,6 +146,19 @@ class Article extends Handler implements ContentTitles
} }
} }
/**
* Uninstalls module
*
* @param Module $module
*
* @return mixed|void
*/
public static function uninstall(Module $module)
{
ActionLogType::whereIn('string_id', ['commentCreated', 'commentDeleted', 'commentApproved'])
->delete();
}
/** /**
* Get translated title for pages overview of given type. * Get translated title for pages overview of given type.
* *
@@ -186,4 +192,38 @@ class Article extends Handler implements ContentTitles
{ {
return trans('article::module.editArticle'); return trans('article::module.editArticle');
} }
/**
* Method called right after content page is marked as deleted
*
* This method is supposed to clean after "deleted" page.
*
* @param Content $content
*
* @return mixed
*/
public static function delete(Content $content)
{
}
/**
* Load some extra data for content management form?
*
* @param Content $content
*
* @return mixed
*/
public static function loadExtraData(Content $content)
{
}
/**
* Does this module support categories?
*
* @return boolean
*/
public static function supportCategories()
{
return true;
}
} }
@@ -0,0 +1,9 @@
<?php
namespace Modules\Categories\Contracts\Repositories;
use App\CMS\Contracts\Repositories\BaseRepository;
use App\Models\Module;
interface Category {
public function getForModule(Module $module);
}
+1 -1
View File
@@ -5,7 +5,7 @@ use App\Models\Content\Content;
use App\Models\Module; use App\Models\Module;
use Franzose\ClosureTable\Models\Entity; use Franzose\ClosureTable\Models\Entity;
class Category extends Entity implements CategoryInterface class Category extends Entity
{ {
/** /**
* The table associated with the model. * The table associated with the model.
@@ -3,7 +3,7 @@ namespace Modules\Categories\Entities;
use Franzose\ClosureTable\Models\ClosureTable; use Franzose\ClosureTable\Models\ClosureTable;
class CategoryClosure extends ClosureTable implements CategoryClosureInterface class CategoryClosure extends ClosureTable
{ {
/** /**
* The table associated with the model. * The table associated with the model.
@@ -1,8 +0,0 @@
<?php
namespace Modules\Categories\Entities;
use Franzose\ClosureTable\Contracts\ClosureTableInterface;
interface CategoryClosureInterface extends ClosureTableInterface
{
}
@@ -1,7 +0,0 @@
<?php
namespace App;namespace Modules\Categories\Entities;
use Franzose\ClosureTable\Contracts\EntityInterface;
interface CategoryInterface extends EntityInterface
{
}
+2 -24
View File
@@ -1,21 +1,11 @@
<?php <?php
namespace Modules\Categories\Handlers; namespace Modules\Categories\Handlers;
use App\CMS\Enumerations\ModulesHandlerToId; use App\CMS\Contracts\Modules\BaseModuleHandler;
use App\CMS\Handlers\BaseHandler;
use App\Models\User; use App\Models\User;
class Categories extends BaseHandler class Categories implements BaseModuleHandler
{ {
public static function getModuleId()
{
$handler = config('categories.handler');
$allModules = ModulesHandlerToId::getWithTranslations();
$moduleId = isset($allModules[$handler]) ? $allModules[$handler] : null;
return $moduleId;
}
/** /**
* Register admin menu (or multiple ones) * Register admin menu (or multiple ones)
* *
@@ -26,8 +16,6 @@ class Categories extends BaseHandler
*/ */
public static function registerAdminMenu(User $user) public static function registerAdminMenu(User $user)
{ {
parent::registerAdminMenu($user);
// register links in admin menu // register links in admin menu
$menu = \Menu::instance('mainMenu'); $menu = \Menu::instance('mainMenu');
$menu->dropdown(trans('categories::categories.name'), function ($sub) { $menu->dropdown(trans('categories::categories.name'), function ($sub) {
@@ -35,14 +23,4 @@ class Categories extends BaseHandler
$sub->route('categories.overview', trans('categories::categories.overview'), [], 30, ['icon' => 'fa fa-fw fa-tags']); $sub->route('categories.overview', trans('categories::categories.overview'), [], 30, ['icon' => 'fa fa-fw fa-tags']);
}, 55, ['icon' => 'fa fa-fw fa-tags']); }, 55, ['icon' => 'fa fa-fw fa-tags']);
} }
/**
* Install module
*
* @return mixed
*/
public static function install()
{
// nothing to install
}
} }
@@ -1,6 +1,9 @@
<?php namespace Modules\Categories\Providers; <?php
namespace Modules\Categories\Providers;
use App\Providers\ModuleServiceProvider; use App\Providers\ModuleServiceProvider;
use Modules\Categories\Contracts\Repositories\Category as ICategory;
use Modules\Categories\Repositories\Category as Category;
class CategoriesServiceProvider extends ModuleServiceProvider class CategoriesServiceProvider extends ModuleServiceProvider
{ {
@@ -9,6 +12,13 @@ class CategoriesServiceProvider extends ModuleServiceProvider
$this->alias = 'categories'; $this->alias = 'categories';
} }
public function boot()
{
parent::boot();
$this->app->bind(ICategory::class, Category::class);
}
protected function setModulePath() protected function setModulePath()
{ {
$this->path = __DIR__; $this->path = __DIR__;
@@ -0,0 +1,22 @@
<?php
namespace Modules\Categories\Repositories;
use App\Models\Module;
use Modules\Categories\Entities\Category as CategoryModel;
use Modules\Categories\Contracts\Repositories\Category as ICategory;
use Pingpong\Modules\Facades\Module as ModuleInstance;
class Category implements ICategory
{
public function getForModule(Module $module)
{
$categoryModule = ModuleInstance::get('categories');
$categories = [];
if ($module->support_categories && !is_null($categoryModule) && $categoryModule->enabled()) {
$categories = CategoryModel::where('module_id', $module->id)
->get();
}
return $categories;
}
}
+36 -22
View File
@@ -1,6 +1,7 @@
<?php <?php
namespace Modules\ContactForm\Handlers; namespace Modules\ContactForm\Handlers;
use App\CMS\Contracts\Content\AdvancedContentModifier;
use App\CMS\Enumerations\ModulesHandlerToId; use App\CMS\Enumerations\ModulesHandlerToId;
use App\CMS\Handlers\Contracts\ContentTitles; use App\CMS\Handlers\Contracts\ContentTitles;
use App\CMS\Handlers\Handler; use App\CMS\Handlers\Handler;
@@ -9,7 +10,7 @@ use App\Http\Requests\Request;
use App\Models\Content\Content; use App\Models\Content\Content;
use App\Models\User; use App\Models\User;
class ContactForm extends Handler implements ContentTitles class ContactForm extends Handler implements ContentTitles, AdvancedContentModifier
{ {
public static function getHistoryHandler() public static function getHistoryHandler()
{ {
@@ -152,27 +153,6 @@ class ContactForm extends Handler implements ContentTitles
return true; return true;
} }
/**
* Install module
*
* @return mixed
*/
public static function install()
{
}
/**
* Load some extra data for content management form?
*
* @param Content $content
*
* @return mixed
*/
public static function loadExtraData(Content $content)
{
// nothing to do
}
/** /**
* Get translated title for pages overview of given type. * Get translated title for pages overview of given type.
* *
@@ -206,4 +186,38 @@ class ContactForm extends Handler implements ContentTitles
{ {
return trans('contactform::module.editForm'); return trans('contactform::module.editForm');
} }
/**
* Does this module support categories?
*
* @return boolean
*/
public static function supportCategories()
{
return true;
}
/**
* Method called right after content page is marked as deleted
*
* This method is supposed to clean after "deleted" page.
*
* @param Content $content
*
* @return mixed
*/
public static function delete(Content $content)
{
}
/**
* Load some extra data for content management form?
*
* @param Content $content
*
* @return mixed
*/
public static function loadExtraData(Content $content)
{
}
} }
+22 -81
View File
@@ -4,8 +4,6 @@ namespace Modules\StaticPages\Handlers;
use App\CMS\Enumerations\ModulesHandlerToId; use App\CMS\Enumerations\ModulesHandlerToId;
use App\CMS\Handlers\Contracts\ContentTitles; use App\CMS\Handlers\Contracts\ContentTitles;
use App\CMS\Handlers\Handler; use App\CMS\Handlers\Handler;
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;
@@ -13,93 +11,16 @@ class StaticPage extends Handler implements ContentTitles
{ {
public static function registerAdminMenu(User $user) public static function registerAdminMenu(User $user)
{ {
parent::registerAdminMenu($user);
// register links in admin menu // register links in admin menu
$menu = \Menu::instance('mainMenu'); $menu = \Menu::instance('mainMenu');
$submenu = $menu->whereTitle(trans('admin/mainMenu.contentPages')); $submenu = $menu->whereTitle(trans('admin/mainMenu.contentPages'));
$submenu->dropdown(trans('staticpages::adminMenu.staticPages'), function ($submenu) use ($user) { $submenu->dropdown(trans('staticpages::adminMenu.staticPages'), function ($submenu) use ($user) {
$submenu->route('content.new', trans('staticpages::adminMenu.new'), ['moduleId' => self::getModuleId()], 10, ['icon' => 'fa fa-plus']); $submenu->route('content.new', trans('staticpages::adminMenu.new'), ['module' => config('staticpages.alias')], 10, ['icon' => 'fa fa-plus']);
$submenu->route('content.overview', trans('staticpages::adminMenu.overview'), ['moduleId' => self::getModuleId()], 20, ['icon' => 'fa fa-list']); $submenu->route('content.overview', trans('staticpages::adminMenu.overview'), ['module' => config('staticpages.alias')], 20, ['icon' => 'fa fa-list']);
}, 15, ['icon' => 'fa fa-newspaper-o']); }, 15, ['icon' => 'fa fa-newspaper-o']);
} }
public static function getModuleId()
{
$handler = config('staticpages.handler');
$allModules = ModulesHandlerToId::getWithTranslations();
$moduleId = isset($allModules[$handler]) ? $allModules[$handler] : null;
return $moduleId;
}
/**
* Does given module manage content? Or is it just module with widgets/something internal/something absolutely else?
*
* @return bool
*/
public static function managesContent()
{
return true;
}
/**
* Save module-specific values into database
*
* @param Content $content
* @param Request $request
*
* @return mixed
*/
public static function createNew(Content &$content, Request $request)
{
// There is nothing more we can save. Static pages are only text saved into database.
// This funcionality is already covered in saving content page alone.
}
/**
* 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 string $revisionId
*
* @return mixed
*/
public static function edit(Content &$content, Request $request, $revisionId)
{
// There is nothing more we can save. Static pages are only text saved into database.
// This funcionality is already covered in saving content page alone.
return 0;
}
/**
* Install module
*
* @return mixed
*/
public static function install()
{
// nothing to do
}
/**
* Load some extra data for content management form?
*
* @param Content $content
*
* @return mixed
*/
public static function loadExtraData(Content $content)
{
// nothing to do
}
/** /**
* Get translated title for pages overview of given type. * Get translated title for pages overview of given type.
* *
@@ -133,4 +54,24 @@ class StaticPage extends Handler implements ContentTitles
{ {
return trans('staticpages::module.editPage'); return trans('staticpages::module.editPage');
} }
/**
* Does given module manage content? Or is it just module with widgets/something internal/something absolutely else?
*
* @return bool
*/
public static function managesContent()
{
return true;
}
/**
* Does this module support categories?
*
* @return boolean
*/
public static function supportCategories()
{
return true;
}
} }
+1 -1
View File
@@ -10,7 +10,7 @@
</div> </div>
@endif @endif
<form method="POST" enctype="multipart/form-data" action="{{route('content.newPost', ['moduleId' => $moduleId])}}"> <form method="POST" enctype="multipart/form-data" action="{{route('content.newPost', ['moduleId' => $module->id])}}">
{!! csrf_field() !!} {!! csrf_field() !!}
@include('admin.content.formInputs') @include('admin.content.formInputs')
@@ -34,7 +34,7 @@
@foreach($pages as $page) @foreach($pages as $page)
<div class="row p-tb-15"> <div class="row p-tb-15">
<div class="col-md-1 hidden-sm-down text-center with-placeholder"> <div class="col-md-1 hidden-sm-down text-center with-placeholder">
<a href="{{route('content.edit', ['id' => $page->id])}}"> <a href="{{route('content.edit', ['url' => $page->url])}}">
@if(!view()->exists(\App\CMS\Helpers\Template::name($page->template, false))) @if(!view()->exists(\App\CMS\Helpers\Template::name($page->template, false)))
<i class="fa fa-2x text-warning fa-warning" data-toggle="tooltip" <i class="fa fa-2x text-warning fa-warning" data-toggle="tooltip"
title="@lang('admin/contents.invalidTemplateSelected')"></i> title="@lang('admin/contents.invalidTemplateSelected')"></i>
@@ -51,7 +51,7 @@
</a> </a>
</div> </div>
<div class="col-xs-10 col-md-3 col-lg-4"> <div class="col-xs-10 col-md-3 col-lg-4">
<a href="{{route('content.edit', ['id' => $page->id])}}"> <a href="{{route('content.edit', ['url' => $page->url])}}">
{{$page->title}} {{$page->title}}
</a> </a>
@@ -92,7 +92,7 @@
@endif @endif
<li> <li>
<a class="edit" href="{{route('content.edit', ['id' => $page->id])}}" <a class="edit" href="{{route('content.edit', ['url' => $page->url])}}"
data-toggle="tooltip" title="@lang('admin/contents.editPlain')"> data-toggle="tooltip" title="@lang('admin/contents.editPlain')">
<i class="fa fa-pencil"></i> <i class="fa fa-pencil"></i>
</a> </a>
+6 -5
View File
@@ -1,24 +1,25 @@
<?php <?php
namespace Templates\Base\OnePage\Handlers; namespace Templates\Base\OnePage\Handlers;
use App\CMS\Handlers\Contracts\TemplateHandler; use App\CMS\Contracts\Modules\InstallableModule;
use App\CMS\Contracts\Modules\TemplateHandler;
use App\CMS\Helpers\CurrentTemplate; use App\CMS\Helpers\CurrentTemplate;
use App\CMS\Helpers\PageRenderer; use App\CMS\Helpers\PageRenderer;
use App\CMS\Helpers\Settings; use App\CMS\Helpers\Settings;
use App\CMS\Helpers\Template; use App\CMS\Helpers\Template;
use App\Models\ActionLogType; use App\Models\ActionLog\ActionLogType;
use App\Models\Content\Content; use App\Models\Content\Content;
use App\Models\Module; use App\Models\Module;
use App\Models\Settings as SettingsModel; use App\Models\Settings as SettingsModel;
use App\Models\User; use App\Models\User;
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 App\Models\Widgets\WidgetType; use App\Models\Widgets\WidgetType;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Templates\Base\OnePage\Widgets\OnePageMenu\OnePageMenu; use Templates\Base\OnePage\Widgets\OnePageMenu\OnePageMenu;
abstract class OnePage implements TemplateHandler abstract class OnePage implements TemplateHandler, InstallableModule
{ {
/** /**
* Name of settings key for list of pages used on homepage * Name of settings key for list of pages used on homepage