diff --git a/app/Handlers/Contracts/AppHandler.php b/app/Handlers/Contracts/AppHandler.php index 5512f6d3..127bc94f 100644 --- a/app/Handlers/Contracts/AppHandler.php +++ b/app/Handlers/Contracts/AppHandler.php @@ -19,6 +19,15 @@ interface AppHandler public static function getHistoryHandler(); + /** + * Load some extra data for content management form? + * + * @param Content $content + * + * @return mixed + */ + public static function loadExtraData(Content $content); + /** * Save module-specific values into database * diff --git a/app/Http/Controllers/Admin/CreateNewContent.php b/app/Http/Controllers/Admin/CreateNewContent.php index 48697d0e..972f6507 100644 --- a/app/Http/Controllers/Admin/CreateNewContent.php +++ b/app/Http/Controllers/Admin/CreateNewContent.php @@ -56,6 +56,7 @@ class CreateNewContent extends Controller 'page' => $this->content, 'rootPages' => $this->content->rootPages(), 'moduleName' => trans($module->name), + 'extraData' => call_user_func([$module->handler, 'loadExtraData'], $this->content), 'formSectionNames' => call_user_func([$module->handler, 'getExtendedFormSections']), 'formSections' => call_user_func([$module->handler, 'getExtendedFormInputsCreate']), ]); diff --git a/app/Http/Controllers/Admin/CreateNewWidget.php b/app/Http/Controllers/Admin/CreateNewWidget.php index b2b7c72f..bc8d7c21 100644 --- a/app/Http/Controllers/Admin/CreateNewWidget.php +++ b/app/Http/Controllers/Admin/CreateNewWidget.php @@ -13,6 +13,16 @@ use Illuminate\Support\Facades\Event; class CreateNewWidget extends Controller { + /** + * @var Widget + */ + private $widget; + + public function __construct(Widget $widget) + { + $this->widget = $widget; + } + /** * Form for new widget area * @@ -41,20 +51,9 @@ class CreateNewWidget extends Controller { $widgetType = WidgetType::findOrFail($type); - // create new widget - $widget = new Widget(); - $widget->widget_type_handler = $widgetType->handler; - $widget->user_id = Auth::user()->id; - $widget->name = $request->name; - - // save description if available - if (isset($request->description)) { - $widget->description = $request->description; - } - // try to save this widget try { - $widget = call_user_func([$widgetType->handler, 'save'], $widget, $request); + $this->widget->createNew($widgetType, $request->all()); } catch (MissingParameterException $e) { // user omitted some value return $this->invalidWidget($type, $e->getMessage()); @@ -63,12 +62,6 @@ class CreateNewWidget extends Controller return $this->invalidWidget($type, trans('admin/widgets.cannotSave', ['exception' => $e->getMessage()])); } - // save into database - $widget->save(); - - // fire event with newly created widget - Event::fire(new \App\Events\CreateNewWidget($widget)); - // redirect with success notification return redirect() ->route('widgets.new', ['type' => $type]) diff --git a/app/Http/Controllers/Admin/EditContent.php b/app/Http/Controllers/Admin/EditContent.php index ed5f9dbc..d5f30bff 100644 --- a/app/Http/Controllers/Admin/EditContent.php +++ b/app/Http/Controllers/Admin/EditContent.php @@ -59,6 +59,7 @@ class EditContent extends Controller 'page' => $page, 'rootPages' => $page->rootPages(), 'templates' => $templates, + 'extraData' => call_user_func([$page->module_handler, 'loadExtraData'], $page), 'formSectionNames' => call_user_func([$page->module_handler, 'getExtendedFormSections']), 'formSections' => call_user_func([$page->module_handler, 'getExtendedFormInputsEdit']), 'historySize' => count($history['changesets']) diff --git a/app/Http/Controllers/Admin/EditWidget.php b/app/Http/Controllers/Admin/EditWidget.php index 34c0936e..b3a10148 100644 --- a/app/Http/Controllers/Admin/EditWidget.php +++ b/app/Http/Controllers/Admin/EditWidget.php @@ -32,7 +32,7 @@ class EditWidget extends Controller // try to save this widget try { - $widget = call_user_func([$widget->widget_type_handler, 'save'], $widget, $request); + $widget = call_user_func([$widget->widget_type_handler, 'save'], $widget, (object)$request->all()); } catch (MissingParameterException $e) { // user omitted some value return $this->invalidWidget($e->getMessage()); diff --git a/app/Models/Widget.php b/app/Models/Widget.php index 93413c3f..c4349426 100644 --- a/app/Models/Widget.php +++ b/app/Models/Widget.php @@ -3,6 +3,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Event; /** * Class Widget @@ -22,5 +23,36 @@ class Widget extends Model protected $guarded = []; + /** + * Create new widget of given type + * + * @param WidgetType $widgetType + * @param $data + * + * @return Widget + */ + public function createNew(WidgetType $widgetType, $data) { + // create new widget + $widget = new Widget(); + $widget->widget_type_handler = $widgetType->handler; + $widget->user_id = \Auth::user()->id; + $widget->name = $data->name; + + // save description if available + if (isset($data->description)) { + $widget->description = $data->description; + } + + $widget = call_user_func([$widgetType->handler, 'save'], $widget, $data); + + // save into database + $widget->save(); + + // fire event with newly created widget + Event::fire(new \App\Events\CreateNewWidget($widget)); + + return $widget; + } + } \ No newline at end of file diff --git a/app/Widgets/Contracts/PublicWidget.php b/app/Widgets/Contracts/PublicWidget.php index 65461887..9a12e128 100644 --- a/app/Widgets/Contracts/PublicWidget.php +++ b/app/Widgets/Contracts/PublicWidget.php @@ -29,11 +29,11 @@ interface PublicWidget /** * @param Widget $widget - * @param Request $request + * @param \stdClass $data * * @return mixed */ - public static function save(Widget $widget, Request $request); + public static function save(Widget $widget, \stdClass $data); /** * Function for installing given widget diff --git a/app/Widgets/HtmlCode/HtmlCode.php b/app/Widgets/HtmlCode/HtmlCode.php index 0f35e4df..3c1e4642 100644 --- a/app/Widgets/HtmlCode/HtmlCode.php +++ b/app/Widgets/HtmlCode/HtmlCode.php @@ -41,20 +41,20 @@ class HtmlCode extends NonInstallableWidget /** * @param Widget $widget - * @param Request $request + * @param \stdClass $data * * @return Widget * @throws MissingParameterException */ - public static function save(Widget $widget, Request $request) + public static function save(Widget $widget, \stdClass $data) { - if (!isset($request->code) || empty($request->code)) { + if (!isset($data->code) || empty($data->code)) { throw new MissingParameterException('code'); } $widgetSettings = [ - 'code' => $request->code, - 'containerClass' => isset($request->containerClass) ? $request->containerClass : '' + 'code' => $data->code, + 'containerClass' => isset($data->containerClass) ? $data->containerClass : '' ]; $widget->settings = json_encode($widgetSettings); diff --git a/app/Widgets/Menu/Menu.php b/app/Widgets/Menu/Menu.php index ebdf7e43..eff37d9c 100644 --- a/app/Widgets/Menu/Menu.php +++ b/app/Widgets/Menu/Menu.php @@ -40,19 +40,19 @@ class Menu extends NonInstallableWidget /** * @param \App\Models\Widget $widget - * @param Request $request + * @param \stdClass $data * * @return mixed */ - public static function save(\App\Models\Widget $widget, Request $request) + public static function save(\App\Models\Widget $widget, \stdClass $data) { - if (!isset($request->settings) || empty($request->settings) || !json_decode($request->settings)) { + if (!isset($data->settings) || empty($data->settings) || !json_decode($data->settings)) { throw new MissingParameterException('settings'); } $settings = [ - 'links' => json_decode($request->settings), - 'containerClass' => $request->containerClass + 'links' => json_decode($data->settings), + 'containerClass' => $data->containerClass ]; $widget->settings = json_encode($settings); diff --git a/app/Widgets/OrbitSlider/OrbitSlider.php b/app/Widgets/OrbitSlider/OrbitSlider.php index 8c06af88..4c406e25 100644 --- a/app/Widgets/OrbitSlider/OrbitSlider.php +++ b/app/Widgets/OrbitSlider/OrbitSlider.php @@ -1,7 +1,6 @@ where('parent_id', $parentDirectoryId); + + // if widget has some directory set, we are performing edit + if ($directoryId) { + $exists = $exists->where('id', '!=', $directoryId); + } + + if ($exists->exists()) { + throw new WidgetExistsException($name); + } + } + + /** + * @param Widget $widget + * @param \stdClass $data * * @throws WidgetExistsException * * @return Widget */ - public static function save(Widget $widget, Request $request) + public static function save(Widget $widget, \stdClass $data) { $settings = json_decode($widget->settings); $parentDirectoryId = Storage::get(self::CONFIG_FILENAME); $directoryId = isset($settings->directoryId) ? $settings->directoryId : null; - $edit = false; - // check if directory does not exists - $exists = Directory::where('name', $request->name) - ->where('parent_id', $parentDirectoryId); + if (!isset($data->useExistingDirectory)) { + // check if name with same name does not exists yet + self::checkIfDirectoryExists($data->name, $directoryId, $parentDirectoryId); - if ($directoryId) { - $edit = true; - $exists = $exists->where('id', '!=', $directoryId); + // setup some information about directory + $directory = $directoryId ? Directory::find($directoryId) : new Directory; + + // setup some info when creating new directory + if (!$directoryId) { + $directory->user_id = Auth::user()->id; + $directory->parent_id = $parentDirectoryId; + } + + // common info both for edit and creation + $directory->name = $data->name; + $directory->description = $data->description; + + // save into database + $directory->save(); + + $directoryId = $directory->id; + } else { + $directoryId = $data->directoryId; } - $exists = $exists->exists(); - - if ($exists) { - throw new WidgetExistsException($request->name); - } - - $directory = new Directory; - - if ($edit) { - $directory = Directory::find($directoryId); - } - - // setup some information about directory - $directory->user_id = Auth::user()->id; - $directory->parent_id = $parentDirectoryId; - $directory->name = $request->name; - $directory->description = $request->description; - $directory->save(); - $settings = [ - 'directoryId' => $directory->id, - 'imagePerSlide' => $request->imagePerSlide, - 'displayBullets' => $request->has('displayBullets'), - 'sliderClass' => isset($request->containerClass) ? $request->containerClass : '', - 'slideContainerClass' => isset($request->slideContainerClass) ? $request->slideContainerClass : '', - 'code' => $request->code + 'directoryId' => $directoryId, + 'imagePerSlide' => isset($data->imagePerSlide) ? $data->imagePerSlide : 4, + 'displayBullets' => isset($data->displayBullets), + 'sliderClass' => isset($data->containerClass) ? $data->containerClass : '', + 'slideContainerClass' => isset($data->slideContainerClass) ? $data->slideContainerClass : '', + 'code' => isset($data->code) ? $data->code : '' ]; - $widget->settings = self::createSettings($settings); + self::checkSettings($settings); + + $widget->settings = json_encode($settings);; return $widget; } @@ -97,8 +117,12 @@ class OrbitSlider implements PublicWidget * * @param $settings */ - public static function prepareSettings(&$settings) + public static function checkSettings(&$settings) { + if (!is_object($settings)) { + $settings = (object)$settings; + } + if (!isset($settings->slideContainerClass)) { $settings->slideContainerClass = ''; } @@ -121,12 +145,6 @@ class OrbitSlider implements PublicWidget $settings->code = ''; } } - - public static function createSettings($settings) { - self::prepareSettings($settings); - - return json_encode($settings); - } /** * Getter for presenter/renderer of this widget diff --git a/app/Widgets/OrbitSlider/Presenters/OrbitSlider.php b/app/Widgets/OrbitSlider/Presenters/OrbitSlider.php index 70e0c802..236d619a 100644 --- a/app/Widgets/OrbitSlider/Presenters/OrbitSlider.php +++ b/app/Widgets/OrbitSlider/Presenters/OrbitSlider.php @@ -37,9 +37,9 @@ class OrbitSlider implements WidgetRenderer $images = File::where('directory_id', $directoryId) ->where('mime_type', 'LIKE', 'image%') ->get(); - + // add some non-existing values - \App\Widgets\OrbitSlider\OrbitSlider::prepareSettings($settings); + \App\Widgets\OrbitSlider\OrbitSlider::checkSettings($settings); $slidesCount = ($settings->imagePerSlide == 'fullscreen') ? count($images) : ceil(count($images) / $settings->imagePerSlide); $htmlGridNumber = ($settings->imagePerSlide == 'fullscreen') ? false : 12 / $settings->imagePerSlide; @@ -65,7 +65,7 @@ class OrbitSlider implements WidgetRenderer // create default object with settings $settings = new \stdClass(); - \App\Widgets\OrbitSlider\OrbitSlider::prepareSettings($settings); + \App\Widgets\OrbitSlider\OrbitSlider::checkSettings($settings); return view('admin.widgets.orbitSlider.new', [ 'type' => $type, @@ -87,7 +87,7 @@ class OrbitSlider implements WidgetRenderer $settings = json_decode($widget->settings); // create default object with settings - \App\Widgets\OrbitSlider\OrbitSlider::prepareSettings($settings); + \App\Widgets\OrbitSlider\OrbitSlider::checkSettings($settings); return view('admin.widgets.orbitSlider.edit', [ 'widget' => $widget, diff --git a/modules/ContactForm/Handlers/ContactForm.php b/modules/ContactForm/Handlers/ContactForm.php index d5273ad3..b434c8ad 100644 --- a/modules/ContactForm/Handlers/ContactForm.php +++ b/modules/ContactForm/Handlers/ContactForm.php @@ -169,4 +169,16 @@ class ContactForm extends Handler { // TODO: Implement install() method. } + + /** + * Load some extra data for content management form? + * + * @param Content $content + * + * @return mixed + */ + public static function loadExtraData(Content $content) + { + // nothing to do + } } \ No newline at end of file diff --git a/modules/Gallery/Handlers/Gallery.php b/modules/Gallery/Handlers/Gallery.php index 1636fee8..dde4c303 100644 --- a/modules/Gallery/Handlers/Gallery.php +++ b/modules/Gallery/Handlers/Gallery.php @@ -50,6 +50,24 @@ class Gallery implements AppHandler return History::class; } + /** + * @param Content $content + * + * @return array + */ + public static function loadExtraData(Content $content) + { + if (is_string($content->module_settings)) { + $content->module_settings = json_decode($content->module_settings); + } + + $extra = [ + 'slider' => isset($content->module_settings->slider) ? $content->module_settings->slider : false + ]; + + return $extra; + } + /** * Save module-specific values into database * diff --git a/modules/Gallery/Http/Controllers/Admin/CreateOrbitSlider.php b/modules/Gallery/Http/Controllers/Admin/CreateOrbitSlider.php new file mode 100644 index 00000000..d3ad04f4 --- /dev/null +++ b/modules/Gallery/Http/Controllers/Admin/CreateOrbitSlider.php @@ -0,0 +1,113 @@ +widget = $widget; + } + + /** + * Load gallery or redirect user back to content edit form + * + * @param $id + * + * @return mixed + */ + protected function getGallery($id) + { + $content = Content::where('module_handler', config('gallery.handler')) + ->findOrFail($id); + $content->module_settings = json_decode($content->module_settings); + + // check if gallery has assigned some directory id + if (!isset($content->module_settings->directoryId)) { + return redirect() + ->route('content.edit', ['id' => $id]) + ->with('error', trans('gallery::admin/content.invalidGallery')); + } + + return $content; + } + + /** + * Load widget type for Orbit Slider. In case it does not exist, redirect user back to content edit form. + * + * @param $id + * + * @return mixed + */ + protected function getOrbitSliderWidgetType($id) + { + // try to load widget type for slider + $widgetType = WidgetType::where('handler', OrbitSlider::class) + ->first(); + + // check if widget type exists + if (!$widgetType) { + return redirect() + ->route('content.edit', ['id' => $id]) + ->with('error', trans('gallery::admin/content.orbitSliderMissing')); + } + + return $widgetType; + } + + /** + * Method for creating slider from photogallery + * + * @param $id + * + * @return mixed + */ + public function createNew($id) + { + // try to find gallery with specified ID + $content = $this->getGallery($id); + + // load info about orbit slider widget + $widgetType = $this->getOrbitSliderWidgetType($id); + + // create slider basic config + $sliderSettings = (object)[ + 'name' => $content->title, + 'description' => $content->meta_description, + 'directoryId' => $content->module_settings->directoryId, + 'useExistingDirectory' => true, + ]; + + // try to create the slider + try { + $slider = $this->widget->createNew($widgetType, $sliderSettings); + } catch (\Exception $e) { + return redirect() + ->route('content.edit', ['id' => $id]) + ->with('error', trans('gallery::admin/content.sliderFailed', ['message' => $e->getMessage()])); + } + + // update gallery info + $content->module_settings->slider = $slider->id; + $content->module_settings = json_encode($content->module_settings); + $content->save(); + + return redirect() + ->route('content.edit', ['id' => $id]) + ->with('success', trans('gallery::admin/content.sliderCreated')); + } +} \ No newline at end of file diff --git a/modules/Gallery/Http/routes.php b/modules/Gallery/Http/routes.php index b3d9bbc7..3aa33d49 100644 --- a/modules/Gallery/Http/routes.php +++ b/modules/Gallery/Http/routes.php @@ -1 +1,11 @@ ['web', 'auth', 'adminMenu'], + 'namespace' => 'Modules\Gallery\Http\Controllers\Admin', + 'prefix' => 'admin/gallery' + ], function () { + + // method for creating slider from photogallery + Route::get('makeSlider/{id}', 'CreateOrbitSlider@createNew') + ->name('gallery.makeSlider'); +}); \ No newline at end of file diff --git a/modules/Gallery/Resources/lang/en/admin/content.php b/modules/Gallery/Resources/lang/en/admin/content.php index 5458870a..c7741f22 100644 --- a/modules/Gallery/Resources/lang/en/admin/content.php +++ b/modules/Gallery/Resources/lang/en/admin/content.php @@ -1,5 +1,11 @@ 'Upload photos', - 'uploadAfterSavingGallery' => 'Uploading for this gallery is not available yet. You must create the gallery first and upload later.' + 'uploadAfterSavingGallery' => 'Uploading for this gallery is not available yet. You must create the gallery first and upload later.', + 'makeSlider' => 'Make slider from this photogallery', + 'orbitSliderMissing' => 'Cannot create slider. Widget for slider is not installed.', + 'invalidGallery' => 'This content page is not a valid gallery page.', + 'sliderFailed' => 'Slider could not be created. Reason: :message', + 'sliderCreated' => 'Slider successfully created.', + 'sliderEdit' => 'Slider settings', ]; \ No newline at end of file diff --git a/modules/Gallery/Resources/views/admin/content/editUpload.blade.php b/modules/Gallery/Resources/views/admin/content/editUpload.blade.php index d20f55a4..1b25903e 100644 --- a/modules/Gallery/Resources/views/admin/content/editUpload.blade.php +++ b/modules/Gallery/Resources/views/admin/content/editUpload.blade.php @@ -1,3 +1,12 @@
\ No newline at end of file + + +