diff --git a/.env.example b/.env.example index dba86cf7..4744a660 100644 --- a/.env.example +++ b/.env.example @@ -16,4 +16,4 @@ MAIL_PASSWORD= SITE_URL=/ UPLOAD_URL=/public/uploads -THUMBNAILS_URL=/uploads/thumbnails \ No newline at end of file +THUMBNAIL_URL=/public/uploads/thumbnails \ No newline at end of file diff --git a/app/CMS/Contracts/Content/AdvancedContentModifier.php b/app/CMS/Contracts/Content/AdvancedContentModifier.php index 6956dd9b..03ba33f1 100644 --- a/app/CMS/Contracts/Content/AdvancedContentModifier.php +++ b/app/CMS/Contracts/Content/AdvancedContentModifier.php @@ -5,27 +5,6 @@ use App\Http\Requests\Request; use App\Models\Content\Content; 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 * diff --git a/app/CMS/Contracts/Content/DisplayPipeline/Pipeline.php b/app/CMS/Contracts/Content/DisplayPipeline/Pipeline.php new file mode 100644 index 00000000..1736f35a --- /dev/null +++ b/app/CMS/Contracts/Content/DisplayPipeline/Pipeline.php @@ -0,0 +1,16 @@ +template, ['page' => $content, 'extra' => $parameters]); - } - public static function getExtendedFormSections() { return [ diff --git a/app/CMS/Helpers/CurrentTemplate.php b/app/CMS/Helpers/CurrentTemplate.php index 222d455a..070ce033 100644 --- a/app/CMS/Helpers/CurrentTemplate.php +++ b/app/CMS/Helpers/CurrentTemplate.php @@ -96,37 +96,4 @@ class CurrentTemplate implements TemplateHandler { 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]); - } } \ No newline at end of file diff --git a/app/CMS/Helpers/PageRenderer.php b/app/CMS/Helpers/PageRenderer.php index 8a164872..bab9d042 100644 --- a/app/CMS/Helpers/PageRenderer.php +++ b/app/CMS/Helpers/PageRenderer.php @@ -29,11 +29,8 @@ class PageRenderer /** * @var $handler AppHandler */ - // get handler $handler = new $page->moduleHandler; - $page->content = Shortcode::compile($page->content); - // render page return $handler->render($page, $parameters); } diff --git a/app/CMS/Interactions/Admin/Content/EditContent.php b/app/CMS/Interactions/Admin/Content/EditContent.php index ff68d18f..621f8398 100644 --- a/app/CMS/Interactions/Admin/Content/EditContent.php +++ b/app/CMS/Interactions/Admin/Content/EditContent.php @@ -37,32 +37,18 @@ class EditContent implements Interaction * @param array $data * @param array $parameters * - * @return mixed|void + * @return mixed */ public function handle($data, $parameters) { /** * @var $page Content */ - list($page, $titlePhoto, $relatedFiles) = $parameters; + list($page) = $parameters; - // let template to modify request and content page - CurrentTemplate::beforeSave($page, $data); + app('saveContentPipeline')->run($page, $data); - // upload file - if provided - $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); + return $page; } /** diff --git a/app/CMS/Interactions/Admin/Content/NewContent.php b/app/CMS/Interactions/Admin/Content/NewContent.php index b65d7ee0..348a0733 100644 --- a/app/CMS/Interactions/Admin/Content/NewContent.php +++ b/app/CMS/Interactions/Admin/Content/NewContent.php @@ -43,29 +43,14 @@ class NewContent implements Interaction */ public function handle($data, $parameters) { - list($moduleHandler, $titlePhoto, $relatedFiles) = $parameters; - - // upload file - if provided - $file = !is_null($titlePhoto) ? $this->file->upload($titlePhoto) : null; + list($moduleHandler) = $parameters; $data['userId'] = \Auth::user()->id; $data['language'] = LaravelLocalization::getCurrentLocale(); - $data['titlePhoto'] = $file ? $file['filename'] : null; $data['moduleHandler'] = $moduleHandler; - $page = Content::create($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); + $page = new Content(); + app('saveContentPipeline')->run($page, $data); return $page; } diff --git a/app/CMS/Pipeline/AbstractPipeline.php b/app/CMS/Pipeline/AbstractPipeline.php new file mode 100644 index 00000000..de9b4215 --- /dev/null +++ b/app/CMS/Pipeline/AbstractPipeline.php @@ -0,0 +1,71 @@ +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; + } +} \ No newline at end of file diff --git a/app/CMS/Pipeline/DisplayPipeline/DisplayPipeline.php b/app/CMS/Pipeline/DisplayPipeline/DisplayPipeline.php new file mode 100644 index 00000000..9feda74d --- /dev/null +++ b/app/CMS/Pipeline/DisplayPipeline/DisplayPipeline.php @@ -0,0 +1,58 @@ +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); + } + } +} \ No newline at end of file diff --git a/app/CMS/Pipeline/DisplayPipeline/Process/AddViewedToPage.php b/app/CMS/Pipeline/DisplayPipeline/Process/AddViewedToPage.php new file mode 100644 index 00000000..870269a9 --- /dev/null +++ b/app/CMS/Pipeline/DisplayPipeline/Process/AddViewedToPage.php @@ -0,0 +1,19 @@ +view(); + } +} \ No newline at end of file diff --git a/app/CMS/Pipeline/DisplayPipeline/Process/CompileShortcodes.php b/app/CMS/Pipeline/DisplayPipeline/Process/CompileShortcodes.php new file mode 100644 index 00000000..89809a2d --- /dev/null +++ b/app/CMS/Pipeline/DisplayPipeline/Process/CompileShortcodes.php @@ -0,0 +1,20 @@ +pageContent = Shortcode::compile($page->pageContent); + } +} \ No newline at end of file diff --git a/app/CMS/Pipeline/Exceptions/InvalidProcessType.php b/app/CMS/Pipeline/Exceptions/InvalidProcessType.php new file mode 100644 index 00000000..85acf59f --- /dev/null +++ b/app/CMS/Pipeline/Exceptions/InvalidProcessType.php @@ -0,0 +1,6 @@ +exists == false) ? $page = Content::create($input): $page->update($input); + } +} \ No newline at end of file diff --git a/app/Models/Content/ModelTraits/Content.php b/app/CMS/Pipeline/SavePipeline/Process/UploadRelatedFiles.php similarity index 55% rename from app/Models/Content/ModelTraits/Content.php rename to app/CMS/Pipeline/SavePipeline/Process/UploadRelatedFiles.php index 6b4a8206..447897f0 100644 --- a/app/Models/Content/ModelTraits/Content.php +++ b/app/CMS/Pipeline/SavePipeline/Process/UploadRelatedFiles.php @@ -1,32 +1,33 @@ removeRelatedFiles($revisionId, $assignedFiles); + $this->removeRelatedFiles($page, $assignedFiles); // allow uploading only on created pages - if (!$this->id || !$files[0]) { - return $changed; + if (!$page->id || !$files[0]) { + return; } // find or create new directory for files assigned to content @@ -37,7 +38,7 @@ trait Content $data = new \stdClass(); $data->directoryId = $directory->id; - $fileModel = App::make(File::class); + $fileModel = app(File::class); foreach ($files as $file) { if (!$file) { @@ -48,38 +49,27 @@ trait Content // add assignement ContentHasFile::create([ 'file_id' => $uploaded['id'], - 'content_id' => $this->id + 'content_id' => $page->id ]); - - if ($revisionId) { - $this->saveHistory($revisionId, 'file', null, ['file' => $uploaded['file']->getClientOriginalName()]); - } - - $changed++; } - - return $changed; } /** * Delete files from association * - * @param $revisionId - * - * @return int + * @param Content $page + * @param $assignedFiles */ - private function removeRelatedFiles($revisionId, $assignedFiles) + private function removeRelatedFiles(Content $page, $assignedFiles) { - $allFiles = $this->files() + $allFiles = $page->files() ->whereNotIn('id', array_keys($assignedFiles)) ->get(); foreach ($allFiles as $file) { - ContentHasFile::where('content_id', $this->id) + ContentHasFile::where('content_id', $page->id) ->where('file_id', $file->id) ->delete(); } - - return count($allFiles); } } \ No newline at end of file diff --git a/app/CMS/Pipeline/SavePipeline/Process/UploadTitlePhoto.php b/app/CMS/Pipeline/SavePipeline/Process/UploadTitlePhoto.php new file mode 100644 index 00000000..3ea87338 --- /dev/null +++ b/app/CMS/Pipeline/SavePipeline/Process/UploadTitlePhoto.php @@ -0,0 +1,33 @@ +titlePhoto = isset($input['existingTitlePhoto']) ? $input['existingTitlePhoto'] : null; + + if (!is_null($titlePhoto)) { + $file = $fileModel->upload($titlePhoto); + + $page->titlePhoto = $file ? $file['filename'] : null; + } + + $page->save(); + } +} \ No newline at end of file diff --git a/app/CMS/Pipeline/SavePipeline/SavePipeline.php b/app/CMS/Pipeline/SavePipeline/SavePipeline.php new file mode 100644 index 00000000..efe69ebd --- /dev/null +++ b/app/CMS/Pipeline/SavePipeline/SavePipeline.php @@ -0,0 +1,69 @@ +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); + } + } +} \ No newline at end of file diff --git a/app/CMS/Repositories/Content/Content.php b/app/CMS/Repositories/Content/Content.php index 86d41501..2bdfb55b 100644 --- a/app/CMS/Repositories/Content/Content.php +++ b/app/CMS/Repositories/Content/Content.php @@ -46,7 +46,7 @@ class Content extends Repository implements IContent public function all() { return $this->getPageQuery() - ->get(); + ->get(); } /** @@ -63,7 +63,7 @@ class Content extends Repository implements IContent $page->status = IContent::STATUS_DRAFT; $page->moduleSettings = []; } else { - $page = $this->model->findOrFail($id); + $page = $this->model->findOrFail($id); } return $page; @@ -76,9 +76,8 @@ class Content extends Repository implements IContent public function getHomepage() { return $this->getPageQuery() - ->where('isHomepage', 1) - ->first(); - + ->where('isHomepage', 1) + ->first(); } /** @@ -91,8 +90,8 @@ class Content extends Repository implements IContent public function getByURL($url) { return $this->getPageQuery() - ->where('url', $url) - ->first(); + ->where('url', $url) + ->first(); } /** @@ -126,8 +125,6 @@ class Content extends Repository implements IContent $query = $query->whereIn('contents.status', $statuses); } - $pages = $query->paginate(setting('paginatedResults', 20)); - - return $pages; + return $query; } } \ No newline at end of file diff --git a/app/CMS/Repositories/Widgets/Widget.php b/app/CMS/Repositories/Widgets/Widget.php index 25156d9f..bb924ce4 100644 --- a/app/CMS/Repositories/Widgets/Widget.php +++ b/app/CMS/Repositories/Widgets/Widget.php @@ -19,7 +19,7 @@ class Widget $widget->name = $data['name']; $widget->description = $data['description']; $widget->container_class = $data['containerClass']; - $widget->container_id = $data['containerId']; + $widget->container_id = empty($data['containerId']) ? null : $data['containerId']; $widget->settings = json_encode(call_user_func([$widgetType->handler, 'save'], $request)); // save into database diff --git a/app/CMS/Widgets/Menu/Presenters/Menu.php b/app/CMS/Widgets/Menu/Presenters/Menu.php index b65702f9..7a1ccb02 100644 --- a/app/CMS/Widgets/Menu/Presenters/Menu.php +++ b/app/CMS/Widgets/Menu/Presenters/Menu.php @@ -107,7 +107,8 @@ class Menu implements WidgetRenderer $content = App::make(ContentContract::class); // get list of all pages - $pages = $content->getOverview(); + $pages = $content->getOverview() + ->get(); // make object from JSON if (!isset($widget->settings->links)) { diff --git a/app/Events/DeleteWidgetArea.php b/app/Events/DeleteWidgetArea.php index 8e667d6d..d01d7951 100644 --- a/app/Events/DeleteWidgetArea.php +++ b/app/Events/DeleteWidgetArea.php @@ -2,7 +2,7 @@ namespace App\Events; -use App\Models\WidgetArea; +use App\Models\Widgets\WidgetArea; use Illuminate\Queue\SerializesModels; class DeleteWidgetArea extends Event @@ -20,7 +20,6 @@ class DeleteWidgetArea extends Event */ public function __construct(WidgetArea $widgetArea) { - // $this->widgetArea = $widgetArea; } } diff --git a/app/Http/Controllers/Admin/Contents/ContentOverview.php b/app/Http/Controllers/Admin/Contents/ContentOverview.php index 28f5ac5d..b4f09afa 100644 --- a/app/Http/Controllers/Admin/Contents/ContentOverview.php +++ b/app/Http/Controllers/Admin/Contents/ContentOverview.php @@ -39,7 +39,8 @@ class ContentOverview extends Controller // get pages for overview $handler = $module !== null ? $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 $homepage = $this->content->getHomepage(); diff --git a/app/Http/Controllers/Admin/Contents/CreateNewContent.php b/app/Http/Controllers/Admin/Contents/CreateNewContent.php index 6abe97e5..18081270 100644 --- a/app/Http/Controllers/Admin/Contents/CreateNewContent.php +++ b/app/Http/Controllers/Admin/Contents/CreateNewContent.php @@ -4,13 +4,13 @@ namespace App\Http\Controllers\Admin\Contents; 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; use App\CMS\Enumerations\ContentStatuses; use App\Cms\Handlers\Interactions\Interaction; use App\Cms\Interactions\Admin\Content\NewContent; use App\Http\Controllers\Admin\Controller; use App\Http\Requests\CreateNewContentRequest; use App\Http\Requests\Request; +use Modules\Categories\Contracts\Repositories\Category as ICategory; /** * Class CreateNewContent @@ -85,7 +85,8 @@ class CreateNewContent extends Controller 'module' => $module, 'categories' => $categories, 'page' => $page, - 'rootPages' => $this->content->getOverview(), + 'rootPages' => $this->content->getOverview() + ->get(), 'formSectionNames' => call_user_func([$module->handler, 'getExtendedFormSections']), 'formSections' => call_user_func([$module->handler, 'getExtendedFormInputsCreate']), ]); @@ -103,11 +104,8 @@ class CreateNewContent extends Controller { $module = $this->module->getOne($moduleId); - $titlePhoto = $request->file('titlePhoto'); - $relatedFiles = $request->all()['files']; - // create new page - Interaction::handle(NewContent::class, $request->all(), $module->handler, $titlePhoto, $relatedFiles); + Interaction::handle(NewContent::class, $request->all(), $module->handler); return redirect() ->route('content.overview') diff --git a/app/Http/Controllers/Admin/Contents/EditContent.php b/app/Http/Controllers/Admin/Contents/EditContent.php index b18c1dad..4d0104cb 100644 --- a/app/Http/Controllers/Admin/Contents/EditContent.php +++ b/app/Http/Controllers/Admin/Contents/EditContent.php @@ -87,9 +87,6 @@ class EditContent extends Controller $categories = $this->category->getForModule($module); $history = $this->history->getStructuredHistoryOf($page); - // modify data for edit form according to installed template - CurrentTemplate::beforePopulatingEditForm($page); - // render view return view('admin.content.edit', [ 'pageHeading' => $pageHeading, @@ -97,7 +94,7 @@ class EditContent extends Controller 'page' => $page, 'module' => $module, 'categories' => $categories, - 'rootPages' => $this->content->getOverview(), + 'rootPages' => $this->content->getOverview()->get(), 'templates' => $templates, 'formSectionNames' => $this->module->call($module, 'getExtendedFormSections'), 'formSections' => $this->module->call($module, 'getExtendedFormInputsEdit'), @@ -132,10 +129,7 @@ class EditContent extends Controller } // edit page - $titlePhoto = $request->file('titlePhoto'); - $relatedFiles = $request->all()['files']; - - Interaction::handle(EditContentInteraction::class, $request->all(), $page, $titlePhoto, $relatedFiles); + Interaction::handle(EditContentInteraction::class, $request->all(), $page); // something was changed, inform user return redirect() diff --git a/app/Http/Controllers/Admin/Templates/EditTemplate.php b/app/Http/Controllers/Admin/Templates/EditTemplate.php index e154b8d2..2938c129 100644 --- a/app/Http/Controllers/Admin/Templates/EditTemplate.php +++ b/app/Http/Controllers/Admin/Templates/EditTemplate.php @@ -12,6 +12,21 @@ use Illuminate\Support\Facades\File; class EditTemplate extends Controller { + /** + * @var TemplateRepositoryContract + */ + private $templateRepository; + + /** + * EditTemplate constructor. + * + * @param TemplateRepositoryContract $templateRepository + */ + public function __construct(TemplateRepositoryContract $templateRepository) + { + $this->templateRepository = $templateRepository; + } + /** * Render form for editing template * @@ -26,11 +41,10 @@ class EditTemplate extends Controller */ $template = Template::findOrFail($template); - $repo = app(TemplateRepositoryContract::class); - $repo->setModel($template); + $this->templateRepository->setModel($template); // load template content - $absolutePath = $repo->getPathToTemplate(); + $absolutePath = $this->templateRepository->getPathToTemplate(); $content = @file_get_contents($absolutePath); return view('admin.templates.edit', [ @@ -78,9 +92,11 @@ class EditTemplate extends Controller */ private function saveContent(Template $template, EditTemplateRequest $request) { + $this->templateRepository->setModel($template); + // get templates with paths - $originalTemplate = $template->getPathToTemplate(); - $customTemplate = $template->getPathToTemplate(Template::CUSTOM_EDIT_DIRECTORY); + $originalTemplate = $this->templateRepository->getPathToTemplate(); + $customTemplate = $this->templateRepository->getPathToTemplate(TemplateRepositoryContract::CUSTOM_EDIT_DIRECTORY); // get paths $originalDir = dirname($originalTemplate); diff --git a/app/Http/Controllers/Visitor/ContentPage.php b/app/Http/Controllers/Visitor/ContentPage.php index 3f0de8ef..6610bb50 100644 --- a/app/Http/Controllers/Visitor/ContentPage.php +++ b/app/Http/Controllers/Visitor/ContentPage.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Visitor; use App\CMS\Contracts\Repositories\Content; -use App\CMS\Helpers\PageRenderer; use App\Http\Controllers\Controller; use App\Models\Content\Content as ContentModel; use Illuminate\Support\Facades\Auth; @@ -24,11 +23,20 @@ class ContentPage extends Controller $this->content = $content; } + /** + * Load page by URL + * + * This method also caches content + * + * @param $url + * + * @return mixed + */ public function getPage($url) { - $contentModel = $this->content; - $page = Cache::remember('content-' . $url, setting('contentCacheLifetime', 5), function () use ($contentModel, $url) { - return $contentModel->getByURL($url); + $contentRepository = $this->content; + $page = Cache::remember('content-' . $url, setting('contentCacheLifetime', 5), function () use ($contentRepository, $url) { + return $contentRepository->getByURL($url); }); // no page available @@ -54,9 +62,10 @@ class ContentPage extends Controller abort(404); } - // add one new "view" for page - $page->view(); + $displayPipeline = app('displayPipeline'); + $page = $displayPipeline->run($page); + + return Controller::VisitorsView($page->template, ['page' => $page]); - return PageRenderer::render($page); } } diff --git a/app/Models/Content/Content.php b/app/Models/Content/Content.php index 8361c3ff..e016392b 100644 --- a/app/Models/Content/Content.php +++ b/app/Models/Content/Content.php @@ -17,7 +17,7 @@ use Modules\Categories\Entities\Category; */ class Content extends Model { - use SoftDeletes, ModelTraits\Content, Nullable; + use SoftDeletes, Nullable; public $timestamps = true; protected $fillable = [ 'userId', diff --git a/app/Models/Content/ModelTraits/ContentHistory.php b/app/Models/Content/ModelTraits/ContentHistory.php index 791d89dc..3b92184f 100644 --- a/app/Models/Content/ModelTraits/ContentHistory.php +++ b/app/Models/Content/ModelTraits/ContentHistory.php @@ -10,7 +10,7 @@ trait ContentHistory /** * Returns history grouped by revisions (edit_batches) * - * @param Content $content + * @param ContentModel $content * * @return array */ diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index d48a6a6f..e25b2de4 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -13,6 +13,13 @@ use App\CMS\Handlers\Search\Content; use App\CMS\Handlers\Search\Files; use App\CMS\Handlers\Search\Presenters\AdminContent as AdminContentPresenter; use App\CMS\Handlers\Search\Presenters\AdminFiles; +use App\CMS\Pipeline\DisplayPipeline\DisplayPipeline; +use App\CMS\Pipeline\DisplayPipeline\Process\AddViewedToPage; +use App\CMS\Pipeline\DisplayPipeline\Process\CompileShortcodes; +use App\CMS\Pipeline\SavePipeline\Process\SaveCommonFields; +use App\CMS\Pipeline\SavePipeline\Process\UploadRelatedFiles; +use App\CMS\Pipeline\SavePipeline\Process\UploadTitlePhoto; +use App\CMS\Pipeline\SavePipeline\SavePipeline; use App\CMS\Repositories\Content\Content as ContentRepository; use App\CMS\Repositories\Module as ModuleRepository; use App\CMS\Repositories\Templates\Template as TemplateRepository; @@ -41,6 +48,8 @@ class AppServiceProvider extends ServiceProvider $this->registerWidgets(); $this->registerSettings(); $this->registerSearch(); + $this->registerDisplayPipeline(); + $this->registerSavePipeline(); } } @@ -64,6 +73,16 @@ class AppServiceProvider extends ServiceProvider return new WidgetRegistrator($app); }); + // create singleton for display pipeline - pipeline used for displaying visitor pages + $this->app->singleton('displayPipeline', function ($app) { + return new DisplayPipeline(); + }); + + // create singleton for display pipeline - pipeline used for displaying visitor pages + $this->app->singleton('saveContentPipeline', function ($app) { + return new SavePipeline(); + }); + // create registrator for template directories $this->app->singleton('registerTemplateDir', function ($app) { return new TemplateRegistrator($app); @@ -115,4 +134,21 @@ class AppServiceProvider extends ServiceProvider $registrator->register(new Content(), new AdminContentPresenter(), SearchEngineRegistrator::ADMIN); $registrator->register(new Files(), new AdminFiles(), SearchEngineRegistrator::ADMIN); } + + private function registerDisplayPipeline() + { + $registrator = $this->app->make('displayPipeline'); + + $registrator->add(AddViewedToPage::class); + $registrator->add(CompileShortcodes::class); + } + + private function registerSavePipeline() + { + $pipeline = $this->app->make('saveContentPipeline'); + + $pipeline->add(SaveCommonFields::class); + $pipeline->add(UploadTitlePhoto::class); + $pipeline->add(UploadRelatedFiles::class); + } } diff --git a/config/mail.php b/config/mail.php index 56cc97fd..7c60a671 100644 --- a/config/mail.php +++ b/config/mail.php @@ -54,7 +54,10 @@ return [ | */ - 'from' => ['address' => null, 'name' => null], + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', env('MAIL_USERNAME')), + 'name' => env('MAIL_FROM_NAME', '') + ], /* |-------------------------------------------------------------------------- diff --git a/modules/Blog/Article/Handlers/Article.php b/modules/Blog/Article/Handlers/Article.php index f8234344..9a2b2615 100644 --- a/modules/Blog/Article/Handlers/Article.php +++ b/modules/Blog/Article/Handlers/Article.php @@ -16,28 +16,6 @@ use Modules\Blog\Article\Entities\Comment; class Article extends Handler implements ContentTitles, AdvancedContentModifier, InstallableModule { - /** - * 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) - { - $content->comments = new Collection(); - if (isset($content->moduleSettings['allowComments']) && $content->moduleSettings['allowComments']) { - $content->comments = Comment::where('content_id', $content->id) - ->with('author') - ->where('approved', 1) - ->orderBy('created_at') - ->get(); - } - - return Controller::VisitorsView($content->template, ['page' => $content, 'extra' => $parameters]); - } - public static function getExtendedFormInputsCreate() { $sections = parent::getExtendedFormInputsCreate(); @@ -52,41 +30,6 @@ class Article extends Handler implements ContentTitles, AdvancedContentModifier, return self::getExtendedFormInputsCreate(); } - /** - * Save module-specific values into database - * - * @param Content $content - * @param Request $request - * - * @return mixed|void - */ - public static function createNew(Content &$content, array $inputData) - { - $content->moduleSettings = ['allowComments' => (int)isset($inputData['allowComments'])]; - } - - /** - * 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 - * - * @return void - */ - public static function edit(Content $content, $request) - { - $settings = $content->moduleSettings; - if (!is_object($settings)) - $settings = new \stdClass(); - - $settings->allowComments = isset($request['allowComments']) ? (int)$request['allowComments'] : 0; - - $content->moduleSettings = $settings; - $content->save(); - } - /** * Register admin menu * @@ -198,17 +141,6 @@ class Article extends Handler implements ContentTitles, AdvancedContentModifier, { } - /** - * Load some extra data for content management form? - * - * @param Content $content - * - * @return mixed - */ - public static function loadExtraData(Content $content) - { - } - /** * Does this module support categories? * diff --git a/modules/Blog/Article/Pipeline/DisplayContent/LoadCommentsForBlogpost.php b/modules/Blog/Article/Pipeline/DisplayContent/LoadCommentsForBlogpost.php new file mode 100644 index 00000000..575f9249 --- /dev/null +++ b/modules/Blog/Article/Pipeline/DisplayContent/LoadCommentsForBlogpost.php @@ -0,0 +1,33 @@ +moduleHandler != Article::class) + return; + + $content->comments = new Collection(); + if (isset($content->moduleSettings['allowComments']) && $content->moduleSettings['allowComments']) { + $content->comments = Comment::where('content_id', $content->id) + ->with('author') + ->where('approved', 1) + ->orderBy('created_at') + ->get(); + } + } +} \ No newline at end of file diff --git a/modules/Blog/Article/Pipeline/SaveContent/TurnCommentsOnOrOff.php b/modules/Blog/Article/Pipeline/SaveContent/TurnCommentsOnOrOff.php new file mode 100644 index 00000000..f52e4bc1 --- /dev/null +++ b/modules/Blog/Article/Pipeline/SaveContent/TurnCommentsOnOrOff.php @@ -0,0 +1,29 @@ +moduleHandler, '\\') !== Article::class) { + return; + } + + $settings = $content->moduleSettings; + $settings['allowComments'] = isset($input['allowComments']) ? (int)$input['allowComments'] : 0; + $content->moduleSettings = $settings; + $content->save(); + } +} \ No newline at end of file diff --git a/modules/Blog/Article/Providers/ArticleServiceProvider.php b/modules/Blog/Article/Providers/ArticleServiceProvider.php index ccfe2120..bae25fe8 100644 --- a/modules/Blog/Article/Providers/ArticleServiceProvider.php +++ b/modules/Blog/Article/Providers/ArticleServiceProvider.php @@ -1,6 +1,8 @@ app->register(ArticleEventServiceProvider::class); + + // load comments for blogpost + app('displayPipeline')->add(LoadCommentsForBlogpost::class); + + app('saveContentPipeline')->add(TurnCommentsOnOrOff::class); } protected function setModuleAlias() diff --git a/modules/Blog/Article/Resources/views/admin/comments/overview.blade.php b/modules/Blog/Article/Resources/views/admin/comments/overview.blade.php index d45480c6..adccff8f 100644 --- a/modules/Blog/Article/Resources/views/admin/comments/overview.blade.php +++ b/modules/Blog/Article/Resources/views/admin/comments/overview.blade.php @@ -10,8 +10,8 @@
-
- {{$comment->author->name}} ({{$comment->author->email}})
+
+ {{$comment->name}} ({{$comment->email}})
-Ahoj {{$data->name}} -
-{{$data->message}} \ No newline at end of file diff --git a/modules/ContactForm/Widgets/Address/Presenter.php b/modules/ContactForm/Widgets/Address/Presenter.php index 568cf176..d828752d 100644 --- a/modules/ContactForm/Widgets/Address/Presenter.php +++ b/modules/ContactForm/Widgets/Address/Presenter.php @@ -24,15 +24,15 @@ class Presenter implements WidgetRenderer if (!$form) return null; - $formData = json_decode($form->moduleSettings); + $formData = $form->moduleSettings; $code = '"; return $code; diff --git a/resources/lang/cs/admin/contents.php b/resources/lang/cs/admin/contents.php index b3ef981b..f4ce8ddd 100644 --- a/resources/lang/cs/admin/contents.php +++ b/resources/lang/cs/admin/contents.php @@ -1,59 +1,59 @@ "Akce", -"alreadyHomepage" => "Domovská stránka", -"appearance" => "Vzhled", -"basicInfo" => "Základní informace", -"category" => "Kategorie", -"content" => "Obsah stránky", -"createdAt" => "Vytvořeno", -"deletePage" => "Smazat", -"deleteTitlePhoto" => "Smazat titulní obrázek", -"edit" => "Editace :name", -"editPlain" => "Editace", -"field_meta_description" => "Popis stránky", -"field_meta_keywords" => "Klíčová slova", -"field_published_from" => "Publikováno od", -"field_published_to" => "Publikováno do", -"field_title" => "Titulek stránky", -"field_url" => "URL", -"files" => "Soubory", -"homepage" => "Domovská stránka", -"homepageProtected" => "Domovská stránka je zobrazena jen pro přihlášené uživatele. Toto může i nemusí být chyba.", -"homepageSetup" => "Domovská stránka úspěšně nastavena.", -"invalidPage" => "Požadovaná stránka neexistuje.", -"invalidStatus" => "Nelze změnit stav stránky na něco nedefinovaného.", -"invalidTemplateSelected" => "Není zvolena šablona pro vykreslení stránky! Stránka nebude pro návštěvníky vykreslena!", -"lockUrl" => "Zamknout URL?", -"makeDraft" => "Převést na koncept", -"makeProtected" => "Zobrazit jen pro přihlášené", -"makePublic" => "Publikovat", -"metaOptions" => "Meta informace", -"moduleName" => "Modul", -"new" => "Vytvořit nový :name", -"noCategory" => "-- Žádná kategorie --", -"noHomepage" => "Domovská stránka není nastavena (a nebo je nastavena jako Koncept)! Vyberte prosím jinou stránku, nebo stávající publikujte.", -"noPagesAvailable" => "Nejsou dostupné žádné stránky. Pro zobrazení přehledu nejprve nějakou vytvořte.", -"noParentPage" => "-- Nadřazená stránka nevybrána --", -"noTemplates" => "Nelze vytvořit stránku. Pro tento modul neexistuje žádná šablona, která by šla použít pro vykreslení obsahu.", -"nothingToEdit" => "Nebyly provedeny žádné změny, proto nedošlo k editaci.", -"overview" => "Seznam všech obsahových stránek", -"pageDeleted" => "Stránka :name (:url) úspěšně smazána.", -"parentPage" => "Nadřazená stránka", -"publicationOptions" => "Nastavení publikace", -"save" => "Uložit", -"setHomepage" => "Nastavit jako domovskou stránku", -"showHistory" => "Historie (:count)", -"status" => "Stav", -"statusChanged" => "Stav úspěšně změněn.", -"status_deleted" => "Smazáno", -"status_draft" => "Koncept", -"status_protected" => "Jen pro přihlášené", -"status_public" => "Veřejné", -"successfullyCreated" => "Stránka úspěšně vytvořena", -"successfullyEdited" => "Úprava úspěšně uložena.", -"template" => "Šablona pro tuto stránku", -"title" => "Titulek", -"uploadTitleImage" => "Nahrát titulní obrázek", -"viewPage" => "Zobrazit", + "actions" => "Akce", + "alreadyHomepage" => "Domovská stránka", + "appearance" => "Vzhled", + "basicInfo" => "Základní informace", + "category" => "Kategorie", + "content" => "Obsah stránky", + "createdAt" => "Vytvořeno", + "deletePage" => "Smazat", + "deleteTitlePhoto" => "Smazat titulní obrázek", + "edit" => "Editace :name", + "editPlain" => "Editace", + "field_meta_description" => "Popis stránky", + "field_meta_keywords" => "Klíčová slova", + "field_published_from" => "Publikováno od", + "field_published_to" => "Publikováno do", + "field_title" => "Titulek stránky", + "field_url" => "URL", + "files" => "Soubory", + "homepage" => "Domovská stránka", + "homepageProtected" => "Domovská stránka je zobrazena jen pro přihlášené uživatele. Toto může i nemusí být chyba.", + "homepageSetup" => "Domovská stránka úspěšně nastavena.", + "invalidPage" => "Požadovaná stránka neexistuje.", + "invalidStatus" => "Nelze změnit stav stránky na něco nedefinovaného.", + "invalidTemplateSelected" => "Není zvolena šablona pro vykreslení stránky! Stránka nebude pro návštěvníky vykreslena!", + "lockUrl" => "Zamknout URL?", + "makeDraft" => "Převést na koncept", + "makeProtected" => "Zobrazit jen pro přihlášené", + "makePublic" => "Publikovat", + "metaOptions" => "Meta informace", + "moduleName" => "Modul", + "new" => "Vytvořit nový :name", + "noCategory" => "-- Žádná kategorie --", + "noHomepage" => "Domovská stránka není nastavena (a nebo je nastavena jako Koncept)! Vyberte prosím jinou stránku, nebo stávající publikujte.", + "noPagesAvailable" => "Nejsou dostupné žádné stránky. Pro zobrazení přehledu nejprve nějakou vytvořte.", + "noParentPage" => "-- Nadřazená stránka nevybrána --", + "noTemplates" => "Nelze vytvořit stránku. Pro tento modul neexistuje žádná šablona, která by šla použít pro vykreslení obsahu.", + "nothingToEdit" => "Nebyly provedeny žádné změny, proto nedošlo k editaci.", + "overview" => "Seznam všech obsahových stránek", + "pageDeleted" => "Stránka :name (:url) úspěšně smazána.", + "parentPage" => "Nadřazená stránka", + "publicationOptions" => "Nastavení publikace", + "save" => "Uložit", + "setHomepage" => "Nastavit jako domovskou stránku", + "showHistory" => "Historie (:count)", + "status" => "Stav", + "statusChanged" => "Stav úspěšně změněn.", + "status_deleted" => "Smazáno", + "status_draft" => "Koncept", + "status_protected" => "Jen pro přihlášené", + "status_public" => "Veřejné", + "successfullyCreated" => "Stránka úspěšně vytvořena", + "successfullyEdited" => "Úprava úspěšně uložena.", + "template" => "Šablona pro tuto stránku", + "title" => "Titulek", + "uploadTitleImage" => "Nahrát titulní obrázek", + "viewPage" => "Zobrazit", ]; diff --git a/resources/views/admin/content/formParts/appearance.blade.php b/resources/views/admin/content/formParts/appearance.blade.php index 253db68f..341a5ca3 100644 --- a/resources/views/admin/content/formParts/appearance.blade.php +++ b/resources/views/admin/content/formParts/appearance.blade.php @@ -18,9 +18,9 @@ - + - @include('admin.snippets.hasError', ['field' => 'titlePhoto']) + @include('admin.snippets.hasError', ['field' => 'titlePhotoFile'])