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}})

@@ -21,12 +21,12 @@

@@ -105,14 +105,14 @@ + value="{{$page->moduleSettings['contactEmail'] or \Auth::user()->email}}" /> + value="{{$page->moduleSettings['subject'] or trans('contactform::admin/content.defaultSubject')}}" />
@@ -120,7 +120,7 @@ @lang('contactform::admin/content.gpsLat') -
@@ -128,7 +128,7 @@ @lang('contactform::admin/content.gpsLng') -
diff --git a/modules/ContactForm/Resources/views/visitor/emails/default.blade.php b/modules/ContactForm/Resources/views/visitor/emails/default.blade.php deleted file mode 100644 index 31ff49bd..00000000 --- a/modules/ContactForm/Resources/views/visitor/emails/default.blade.php +++ /dev/null @@ -1,4 +0,0 @@ -

-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 = '
container_id) { $code .= ' id="' . e($widget->container_id).'"'; } $code .= '>'; - $code .= "

".e($formData->companyName).'

'; - $code .= nl2br($formData->address); + $code .= "

".e($formData['companyName']).'

'; + $code .= nl2br($formData['address']); $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'])
@@ -34,6 +34,10 @@ content->getOverview(); + $allPages = $this->content->getOverview() + ->get(); // separate pages to used and not used - with help of $usedPAgesIds array defined above $pages = $used = $notUsed = []; diff --git a/templates/Binarity/Handler.php b/templates/Binarity/Handler.php index 032aaea0..8b4e98e0 100644 --- a/templates/Binarity/Handler.php +++ b/templates/Binarity/Handler.php @@ -6,10 +6,7 @@ use App\Models\Content\Content; use App\Models\Module; use App\Models\User; use App\Models\Widgets\WidgetArea; -use Templates\Binarity\Shortcodes\DarkBlock; -use Templates\Binarity\Shortcodes\TechnologiesWrapper; -use Templates\Binarity\Shortcodes\Technology; -use Webwizo\Shortcodes\Facades\Shortcode; + class Handler implements TemplateHandler { @@ -85,37 +82,4 @@ class Handler implements TemplateHandler ], ]; } - - /** - * Prepare Content object to be rendered using Blade template - * - * @param Content $content - */ - public static function beforeRender(Content & $content) - { - Shortcode::register('technologies', TechnologiesWrapper::class); - Shortcode::register('tech', Technology::class); - Shortcode::register('dark', DarkBlock::class); - } - - /** - * Modify input data into format which can be understood by edit template - * - * @param Content $content - */ - public static function beforePopulatingEditForm(Content & $content) - { - } - - /** - * Slightly modify Content object before saving into database. - * - * This way we can do almost whatever we want - even in template - * - * @param Content $content - * @param $request - */ - public static function beforeSave(Content & $content, $inputData) - { - } } \ No newline at end of file diff --git a/templates/Binarity/Providers/ServiceProvider.php b/templates/Binarity/Providers/ServiceProvider.php new file mode 100644 index 00000000..63a5dd58 --- /dev/null +++ b/templates/Binarity/Providers/ServiceProvider.php @@ -0,0 +1,22 @@ +content !!}--}} {{----}} - @foreach($articles as $article) + @foreach($page->articles as $article)
-
- {{$articles->render()}} -
+ @if (!is_null($page->articles)) +
+ {{$page->articles->render()}} +
+ @endif @endforeach @endsection \ No newline at end of file diff --git a/templates/Binarity/Resources/views/modules/staticpages/visitor/references.blade.php b/templates/Binarity/Resources/views/modules/staticpages/visitor/references.blade.php index 858d5d8f..9f063b40 100644 --- a/templates/Binarity/Resources/views/modules/staticpages/visitor/references.blade.php +++ b/templates/Binarity/Resources/views/modules/staticpages/visitor/references.blade.php @@ -12,7 +12,7 @@
subpages('contents.created_at', 'DESC'); + $subpages = $page->subpages()->orderBy('created_at', 'DESC')->get(); ?> @foreach($subpages as $reference) diff --git a/templates/Binarity/Resources/views/visitor/layout.blade.php b/templates/Binarity/Resources/views/visitor/layout.blade.php index abe1079c..f3d45acd 100644 --- a/templates/Binarity/Resources/views/visitor/layout.blade.php +++ b/templates/Binarity/Resources/views/visitor/layout.blade.php @@ -97,7 +97,7 @@ .cz
  • +420 775 553 552

  • -
  • © 2016 binarity s.r.o.
  • +
  • © {{date('Y')}} binarity s.r.o.
  • @@ -140,7 +140,7 @@ .cz
  • +420 775 323 455

  • -
  • © 2016 binarity s.r.o.
  • +
  • © {{date('Y')}} binarity s.r.o.
  • @@ -149,7 +149,7 @@ - + diff --git a/templates/Binarity/config.php b/templates/Binarity/config.php index 40741a9c..249defd2 100644 --- a/templates/Binarity/config.php +++ b/templates/Binarity/config.php @@ -1,6 +1,6 @@ [], + 'providers' => [\Templates\Binarity\Providers\ServiceProvider::class], 'files' => [], 'handler' => \Templates\Binarity\Handler::class, 'name' => 'binarity s.r.o.', diff --git a/templates/PragueTennisCamp/Handler.php b/templates/PragueTennisCamp/Handler.php index 08b377c8..077566e1 100644 --- a/templates/PragueTennisCamp/Handler.php +++ b/templates/PragueTennisCamp/Handler.php @@ -66,46 +66,22 @@ class Handler implements TemplateHandler 'module' => 'StaticPages', 'templateName' => 'staticpages::admin.templatePath' ], + + [ + 'module' => 'ArticleList', + 'alias' => config('articlelist.alias'), + 'templateName' => 'articlelist::module.templatePath' + ], + [ + 'module' => 'Article', + 'alias' => config('articleias'), + 'templateName' => 'article::module.templatePath' + ], + [ 'module' => 'ContactForm', 'templateName' => 'contactform::admin/adminMenu.templatePath' ], ]; } - - /** - * Prepare Content object to be rendered using Blade template - * - * @param Content $content - */ - public static function beforeRender(Content & $content) - { - if ($content->isHomepage) { - $category = Category::where('url', 'trenersky-tym') - ->first(); - - $content->traineeTeamCategory = $category; - } - } - - /** - * Modify input data into format which can be understood by edit template - * - * @param Content $content - */ - public static function beforePopulatingEditForm(Content & $content) - { - } - - /** - * Slightly modify Content object before saving into database. - * - * This way we can do almost whatever we want - even in template - * - * @param Content $content - * @param $request - */ - public static function beforeSave(Content & $content, $inputData) - { - } } \ No newline at end of file diff --git a/templates/PragueTennisCamp/Pipeline/AddHotelsCategory.php b/templates/PragueTennisCamp/Pipeline/AddHotelsCategory.php new file mode 100644 index 00000000..8631be85 --- /dev/null +++ b/templates/PragueTennisCamp/Pipeline/AddHotelsCategory.php @@ -0,0 +1,26 @@ +template == 'staticpages::pageWithHotels') { + $category = Category::where('url', 'hotely') + ->first(); + + $page->hotelsCategory = $category; + } + } +} \ No newline at end of file diff --git a/templates/PragueTennisCamp/Pipeline/AddTraineeTeamCategory.php b/templates/PragueTennisCamp/Pipeline/AddTraineeTeamCategory.php new file mode 100644 index 00000000..9e710278 --- /dev/null +++ b/templates/PragueTennisCamp/Pipeline/AddTraineeTeamCategory.php @@ -0,0 +1,26 @@ +template == 'staticpages::traineeTeam' || $page->isHomepage == true) { + $category = Category::where('url', 'trenersky-tym') + ->first(); + + $page->traineeTeamCategory = $category; + } + } +} \ No newline at end of file diff --git a/templates/PragueTennisCamp/Providers/ServiceProvider.php b/templates/PragueTennisCamp/Providers/ServiceProvider.php index 4242fd8a..c997e288 100644 --- a/templates/PragueTennisCamp/Providers/ServiceProvider.php +++ b/templates/PragueTennisCamp/Providers/ServiceProvider.php @@ -3,6 +3,8 @@ namespace Templates\PragueTennisCamp\Providers; use App\CMS\Helpers\Template; use Modules\ContactForm\Widgets\Form\Presenter; +use Templates\PragueTennisCamp\Pipeline\AddHotelsCategory; +use Templates\PragueTennisCamp\Pipeline\AddTraineeTeamCategory; class ServiceProvider extends \Illuminate\Support\ServiceProvider { @@ -22,5 +24,9 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider } Presenter::$template = Template::name('widgets.contact.form'); + + $pipeline = app('displayPipeline'); + $pipeline->add(AddTraineeTeamCategory::class); + $pipeline->add(AddHotelsCategory::class); } } \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/assets/css/app.css b/templates/PragueTennisCamp/Resources/assets/css/app.css index 48b3e9f5..8352c238 100644 --- a/templates/PragueTennisCamp/Resources/assets/css/app.css +++ b/templates/PragueTennisCamp/Resources/assets/css/app.css @@ -3,16 +3,44 @@ body { font-family: Ubuntu; text-align: justify; - background: #eef4d4 url("./images/bg.png"); + background: #EEF4D4 url("./images/bg.png"); } +body.photo-bg { + background: url("./images/clay-bg.jpg") no-repeat fixed; + background-size: cover; +} + +h1, h2, h3, h4 { + font-family: Comfortaa; + color: #FF7F11; +} + +a { + color: #FF7F11; +} + +a:hover { + color: #983628; +} + +/** HEADER **/ header.top-bar { - background: #3f3f37; + background: #3F3F37; padding: 0; + border-bottom: solid 1px #FF7F11; } header.top-bar h1 { - font-size: 100%; + font-size: 130%; + line-height: 38px; + margin-top: 0; + margin-bottom: 0; + text-align: center; +} + +header.top-bar.centered .menu li { + display: inline-block; } header.top-bar ul { @@ -23,59 +51,62 @@ header.top-bar a { color: white; } +header.top-bar h1 a { + color: #FF7F11; +} + .menu .active > a { - background: #ff7f11; + background: #FF7F11; +} + +.menu a:hover { + background: #983628; + transition: background 400ms linear; } .logo { - max-height: 35px; + max-height: 25px; + margin: 0 15px; } -h1, h2, h3, h4 { - font-family: Comfortaa; - color: #ff7f11; -} - - +/** END HEADER **/ .stripe { - padding: 50px; - margin: 50px 0; width: 100%; } .stripe.light { - background: rgba(0, 0, 0, 0.1); -} - -.stripe h1 { - color: white; - font-size: 270%; -} - -.stripe p { - padding-left: 150px; + background: rgba(0, 0, 0, 0.3); } .content-container.row { + margin-top: 1em; line-height: 170%; padding: 1em; - background: #FFFEF0; + background: #F8FEF0; + box-shadow: 0 0 10px #CBCBCB; + border-radius: 5px 5px 0 0; + width: 98%; +} + +.content-container h1 { + text-align: center; } .orbit { position: relative; overflow: hidden; + background: silver; } .orbit-bullets { - margin-top: -54px; - padding-bottom: 11px; + margin-top: -100px; + padding-bottom: 20px; } .orbit .stripe { height: 20px; - background: rgba(255,255,255, 0.2); + background: rgba(255, 127, 17, 0.3); position: absolute; left: 0; right: 0; @@ -89,26 +120,82 @@ h1, h2, h3, h4 { .orbit-bottom { bottom: 0; + border-bottom: solid 1px #3F3F37; } .slow { - transition-duration: 4500ms !important; + transition-duration: 3500ms !important; +} + +.trainee-team { + margin-top: 2em; } .trainee-team .thumbnail { max-height: 150px; } -#footer { - margin-top: 10em; +.trainee-team p { + line-height: 20%; +} + +.trainee-team ul { + list-style: none; +} + +.trainee-team h2, .trainee-team h3, .trainee-team h4 { + font-size: 130%; } .rounded { border-radius: 50%; } +.title-photo img { + border-radius: 0 0 5px 5px; +} + .trainer { max-width: 25%; padding: 3px; border: solid 1px #CCC; } + +.hotel { + margin-top: 2em; +} + +.required input, .required textarea { + float: left; + width: calc(100% - 13px); +} +.required:after { + color: red; + content: ' *'; + float: right; + margin-top: 4%; +} + +.green { + color: #00A000; +} + +#footer { + margin-bottom: 50px; + width: 98%; + border-top: solid 2px #FF7F11; + background: #3F3F37; + padding: 1em; + border-radius: 0 0 5px 5px; + color: #EEF4D4; +} + +#binarity, #binarity a { + color: #ABA48E; +} + +@media screen and (max-width: 639px) { + .menu > li { + display: block !important; + } +} \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/assets/css/images/clay-bg.jpg b/templates/PragueTennisCamp/Resources/assets/css/images/clay-bg.jpg new file mode 100644 index 00000000..ac4adf4c Binary files /dev/null and b/templates/PragueTennisCamp/Resources/assets/css/images/clay-bg.jpg differ diff --git a/templates/PragueTennisCamp/Resources/assets/images/logo.png b/templates/PragueTennisCamp/Resources/assets/images/logo.png index 3a47e570..3c957d70 100644 Binary files a/templates/PragueTennisCamp/Resources/assets/images/logo.png and b/templates/PragueTennisCamp/Resources/assets/images/logo.png differ diff --git a/templates/PragueTennisCamp/Resources/assets/js/app.js b/templates/PragueTennisCamp/Resources/assets/js/app.js index 441b9994..08bc823d 100644 --- a/templates/PragueTennisCamp/Resources/assets/js/app.js +++ b/templates/PragueTennisCamp/Resources/assets/js/app.js @@ -1,7 +1,7 @@ $(document).foundation() $ ('#formSend').click (function () { - $ (this).value = 'Odesílám...'; + $ (this).value = '...'; var form = $(this).closest('form'); @@ -16,6 +16,6 @@ $ ('#formSend').click (function () { } else { alert (resp.message); } - $ (this).value = "ODESLAT"; + $ (this).value = "Senden"; }); }); \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/contactform/_partials/form.blade.php b/templates/PragueTennisCamp/Resources/views/modules/contactform/_partials/form.blade.php index 336d769b..4f365529 100644 --- a/templates/PragueTennisCamp/Resources/views/modules/contactform/_partials/form.blade.php +++ b/templates/PragueTennisCamp/Resources/views/modules/contactform/_partials/form.blade.php @@ -1,16 +1,35 @@ +@if(session('success')) +
    E-mail war gesendet.
    +@endif +
    {!! csrf_field() !!} -
    - +
    +
    -
    - +
    +
    -
    - - +
    + +
    + + +
    + +
    +
    + +
    + +
    + +
    + +
    +
    - ODESLAT +
    \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/contactform/visitor/default.blade.php b/templates/PragueTennisCamp/Resources/views/modules/contactform/visitor/default.blade.php index 09f233ef..e74e5256 100644 --- a/templates/PragueTennisCamp/Resources/views/modules/contactform/visitor/default.blade.php +++ b/templates/PragueTennisCamp/Resources/views/modules/contactform/visitor/default.blade.php @@ -1,61 +1,37 @@ @extendVisitor('defaultLayout') + +@section('topMenu') + @include(\App\CMS\Helpers\Template::name('commonHeader')) +@endsection + +@section('bodyClass', 'photo-bg') + + @section('content') -
    +
    -

    Kontakt

    +

    {{$page->title}}

    -
    -
    -

    Kontakt

    -

    {{$page->moduleSettings['companyName']}}

    -

    - {!! nl2br($page->moduleSettings['address']) !!} -
    - -
    - tel.: {{$page->moduleSettings['phone']}}
    - e-mail: {{$page->moduleSettings['email']}} -

    -
    -
    -
    -
    -
    +
    +

    {{$page->title}}

    -
    -
    -

    Napište nám

    +

    {{$page->moduleSettings['companyName']}}

    + +

    + {!! nl2br($page->moduleSettings['address']) !!} +

    + +

    + tel.: {{$page->moduleSettings['phone']}}
    + e-mail: {{$page->moduleSettings['email']}} +

    +
    + +
    @include('modules.contactform._partials.form')
    -@endsection - -@section('javascripts') - - - @endsection \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/contactform/visitor/emails/default.blade.php b/templates/PragueTennisCamp/Resources/views/modules/contactform/visitor/emails/default.blade.php index e69de29b..7a18fd6f 100644 --- a/templates/PragueTennisCamp/Resources/views/modules/contactform/visitor/emails/default.blade.php +++ b/templates/PragueTennisCamp/Resources/views/modules/contactform/visitor/emails/default.blade.php @@ -0,0 +1,9 @@ +

    Nová zpráva od {{$data->name}} {{$data->surname}}

    +

    E-mail: {{$data->email}}

    +

    Od: {{$data->from}}

    +

    Do: {{$data->to}}

    +

    Osob: {{$data->personCount}}

    + +

    + {{$data->message}} +

    \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/_partials/hotelList.blade.php b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/_partials/hotelList.blade.php new file mode 100644 index 00000000..8aadd74d --- /dev/null +++ b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/_partials/hotelList.blade.php @@ -0,0 +1,20 @@ +@if (isset($page->hotelsCategory)) +
    + @foreach($page->hotelsCategory->content as $i => $subpage) +
    +
    + @if(!empty($subpage->titlePhoto)) + {{$subpage->title}} + @endif +
    +
    +

    + {{$subpage->title}} +

    + + {!! $subpage->pageContent !!} +
    +
    + @endforeach +
    +@endif \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/_partials/slider.blade.php b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/_partials/slider.blade.php new file mode 100644 index 00000000..61ddc6e9 --- /dev/null +++ b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/_partials/slider.blade.php @@ -0,0 +1,21 @@ +@php $images = $page->files()->where('mime_type', 'like', 'image%')->get(); @endphp +@if(count($images) > 0) +
    +
      + @foreach($images as $i => $image) +
    • + +
    • + @endforeach +
    + + @if(!isset($hideBullets)) + + @endif +
    +@endif \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/_partials/traineeTeamList.blade.php b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/_partials/traineeTeamList.blade.php new file mode 100644 index 00000000..417d87c5 --- /dev/null +++ b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/_partials/traineeTeamList.blade.php @@ -0,0 +1,19 @@ +@if (isset($page->traineeTeamCategory)) +
    +

    {{$page->traineeTeamCategory->name}}

    + + @foreach($page->traineeTeamCategory->content as $i => $subpage) +
    + @if(empty($subpage->titlePhoto)) + {{$subpage->title}} + @else + {{$subpage->title}} + @endif +

    {{$subpage->title}}

    + + {!! $subpage->pageContent !!} +
    + @endforeach +
    +@endif \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/default.blade.php b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/default.blade.php index 3a28b608..a32bd688 100644 --- a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/default.blade.php +++ b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/default.blade.php @@ -1,14 +1,21 @@ @extendVisitor('defaultLayout') +@section('bodyClass', 'photo-bg') + +@section('topMenu') + @include(\App\CMS\Helpers\Template::name('commonHeader')) +@endsection + @section('content') + @if (!empty($page->titlePhoto)) +
    + +
    + @endif

    {{$page->title}}

    {!! $page->pageContent !!} -
    - - - @endsection \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/homepage.blade.php b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/homepage.blade.php index f3ea1333..bb878616 100644 --- a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/homepage.blade.php +++ b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/homepage.blade.php @@ -1,50 +1,35 @@ @extendVisitor('defaultLayout') -@section('content') - @php $images = $page->files()->where('mime_type', 'like', 'image%')->get(); @endphp - @if(count($images) > 0) -
    -
      - @foreach($images as $i => $image) -
    • - -
    • - @endforeach -
    +@section('bodyClass', 'photo-bg') - +@section('topMenu') +

    + + + {{setting('pageName')}} + +

    -
    -
    +
    + +
    + +
    + - @endif +
    + +@endsection + +@section('content') + @include('modules.staticpages.visitor._partials.slider', ['slideClass' => 'slow']) +
    + @widgetArea('mainMenu') +
    +
    {!! $page->pageContent !!} - -
    - -

    {{$page->traineeTeamCategory->name}}

    - - @foreach($page->traineeTeamCategory->content as $i => $subpage) - - @endforeach -
    -
    @endsection \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/hotel.blade.php b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/hotel.blade.php new file mode 100644 index 00000000..8c155988 --- /dev/null +++ b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/hotel.blade.php @@ -0,0 +1,16 @@ +@extendVisitor('defaultLayout') + +@section('bodyClass', 'photo-bg') + +@section('topMenu') + @include(\App\CMS\Helpers\Template::name('commonHeader')) +@endsection + +@section('content') +
    +

    {{$page->title}}

    + {!! $page->pageContent !!} + + @include('modules.staticpages.visitor._partials.slider') +
    +@endsection \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/pageWithHotels.blade.php b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/pageWithHotels.blade.php new file mode 100644 index 00000000..ef75f8f3 --- /dev/null +++ b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/pageWithHotels.blade.php @@ -0,0 +1,23 @@ +@extendVisitor('defaultLayout') + +@section('bodyClass', 'photo-bg') + +@section('topMenu') + @include(\App\CMS\Helpers\Template::name('commonHeader')) +@endsection + +@section('content') + + @if (!empty($page->titlePhoto)) +
    + +
    + @endif +
    +

    {{$page->title}}

    + + {!! $page->pageContent !!} + + @include('modules.staticpages.visitor._partials.hotelList') +
    +@endsection \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/traineeTeam.blade.php b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/traineeTeam.blade.php new file mode 100644 index 00000000..7607183e --- /dev/null +++ b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/traineeTeam.blade.php @@ -0,0 +1,23 @@ +@extendVisitor('defaultLayout') + +@section('bodyClass', 'photo-bg') + +@section('topMenu') + @include(\App\CMS\Helpers\Template::name('commonHeader')) +@endsection + +@section('content') + + @if (!empty($page->titlePhoto)) +
    + +
    + @endif +
    +

    {{$page->title}}

    + + {!! $page->pageContent !!} + + @include('modules.staticpages.visitor._partials.traineeTeamList') +
    +@endsection \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/trainer.blade.php b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/trainer.blade.php index 26b3e7c7..27e4acf9 100644 --- a/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/trainer.blade.php +++ b/templates/PragueTennisCamp/Resources/views/modules/staticpages/visitor/trainer.blade.php @@ -1,19 +1,19 @@ @extendVisitor('defaultLayout') +@section('bodyClass', 'photo-bg') + +@section('topMenu') + @include(\App\CMS\Helpers\Template::name('commonHeader')) +@endsection + @section('content')
    -

    {{$page->title}}

    - {!! $page->pageContent !!} -
    - - - @endsection \ No newline at end of file diff --git a/templates/PragueTennisCamp/Resources/views/visitor/commonHeader.blade.php b/templates/PragueTennisCamp/Resources/views/visitor/commonHeader.blade.php new file mode 100644 index 00000000..d43328c2 --- /dev/null +++ b/templates/PragueTennisCamp/Resources/views/visitor/commonHeader.blade.php @@ -0,0 +1,19 @@ +
    + +
    + + + diff --git a/templates/PragueTennisCamp/Resources/views/visitor/defaultLayout.blade.php b/templates/PragueTennisCamp/Resources/views/visitor/defaultLayout.blade.php index b8e7cc64..b023cc34 100644 --- a/templates/PragueTennisCamp/Resources/views/visitor/defaultLayout.blade.php +++ b/templates/PragueTennisCamp/Resources/views/visitor/defaultLayout.blade.php @@ -12,51 +12,45 @@ + @if (!empty($googleAnalyticsCode)) + + @endif + @include('visitor.metaInformation') - -@if (!empty($googleAnalyticsCode)) - -@endif
    - -
    - @widgetArea('mainMenu') -
    + @yield('topMenu')
    @yield('content')
    -