FEATURE #1528: add button for creating slider from gallery

This commit is contained in:
Michal Kváček
2016-04-02 13:14:58 +02:00
parent 2797ff0a89
commit 497708283f
20 changed files with 360 additions and 121 deletions
+9
View File
@@ -19,6 +19,15 @@ interface AppHandler
public static function getHistoryHandler(); public static function getHistoryHandler();
/**
* Load some extra data for content management form?
*
* @param Content $content
*
* @return mixed
*/
public static function loadExtraData(Content $content);
/** /**
* Save module-specific values into database * Save module-specific values into database
* *
@@ -56,6 +56,7 @@ class CreateNewContent extends Controller
'page' => $this->content, 'page' => $this->content,
'rootPages' => $this->content->rootPages(), 'rootPages' => $this->content->rootPages(),
'moduleName' => trans($module->name), 'moduleName' => trans($module->name),
'extraData' => call_user_func([$module->handler, 'loadExtraData'], $this->content),
'formSectionNames' => call_user_func([$module->handler, 'getExtendedFormSections']), 'formSectionNames' => call_user_func([$module->handler, 'getExtendedFormSections']),
'formSections' => call_user_func([$module->handler, 'getExtendedFormInputsCreate']), 'formSections' => call_user_func([$module->handler, 'getExtendedFormInputsCreate']),
]); ]);
+11 -18
View File
@@ -13,6 +13,16 @@ use Illuminate\Support\Facades\Event;
class CreateNewWidget extends Controller class CreateNewWidget extends Controller
{ {
/**
* @var Widget
*/
private $widget;
public function __construct(Widget $widget)
{
$this->widget = $widget;
}
/** /**
* Form for new widget area * Form for new widget area
* *
@@ -41,20 +51,9 @@ class CreateNewWidget extends Controller
{ {
$widgetType = WidgetType::findOrFail($type); $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 to save this widget
try { try {
$widget = call_user_func([$widgetType->handler, 'save'], $widget, $request); $this->widget->createNew($widgetType, $request->all());
} catch (MissingParameterException $e) { } catch (MissingParameterException $e) {
// user omitted some value // user omitted some value
return $this->invalidWidget($type, $e->getMessage()); 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()])); 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 // redirect with success notification
return redirect() return redirect()
->route('widgets.new', ['type' => $type]) ->route('widgets.new', ['type' => $type])
@@ -59,6 +59,7 @@ class EditContent extends Controller
'page' => $page, 'page' => $page,
'rootPages' => $page->rootPages(), 'rootPages' => $page->rootPages(),
'templates' => $templates, 'templates' => $templates,
'extraData' => call_user_func([$page->module_handler, 'loadExtraData'], $page),
'formSectionNames' => call_user_func([$page->module_handler, 'getExtendedFormSections']), 'formSectionNames' => call_user_func([$page->module_handler, 'getExtendedFormSections']),
'formSections' => call_user_func([$page->module_handler, 'getExtendedFormInputsEdit']), 'formSections' => call_user_func([$page->module_handler, 'getExtendedFormInputsEdit']),
'historySize' => count($history['changesets']) 'historySize' => count($history['changesets'])
+1 -1
View File
@@ -32,7 +32,7 @@ class EditWidget extends Controller
// try to save this widget // try to save this widget
try { try {
$widget = call_user_func([$widget->widget_type_handler, 'save'], $widget, $request); $widget = call_user_func([$widget->widget_type_handler, 'save'], $widget, (object)$request->all());
} catch (MissingParameterException $e) { } catch (MissingParameterException $e) {
// user omitted some value // user omitted some value
return $this->invalidWidget($e->getMessage()); return $this->invalidWidget($e->getMessage());
+32
View File
@@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Event;
/** /**
* Class Widget * Class Widget
@@ -22,5 +23,36 @@ class Widget extends Model
protected $guarded = []; 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;
}
} }
+2 -2
View File
@@ -29,11 +29,11 @@ interface PublicWidget
/** /**
* @param Widget $widget * @param Widget $widget
* @param Request $request * @param \stdClass $data
* *
* @return mixed * @return mixed
*/ */
public static function save(Widget $widget, Request $request); public static function save(Widget $widget, \stdClass $data);
/** /**
* Function for installing given widget * Function for installing given widget
+5 -5
View File
@@ -41,20 +41,20 @@ class HtmlCode extends NonInstallableWidget
/** /**
* @param Widget $widget * @param Widget $widget
* @param Request $request * @param \stdClass $data
* *
* @return Widget * @return Widget
* @throws MissingParameterException * @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'); throw new MissingParameterException('code');
} }
$widgetSettings = [ $widgetSettings = [
'code' => $request->code, 'code' => $data->code,
'containerClass' => isset($request->containerClass) ? $request->containerClass : '' 'containerClass' => isset($data->containerClass) ? $data->containerClass : ''
]; ];
$widget->settings = json_encode($widgetSettings); $widget->settings = json_encode($widgetSettings);
+5 -5
View File
@@ -40,19 +40,19 @@ class Menu extends NonInstallableWidget
/** /**
* @param \App\Models\Widget $widget * @param \App\Models\Widget $widget
* @param Request $request * @param \stdClass $data
* *
* @return mixed * @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'); throw new MissingParameterException('settings');
} }
$settings = [ $settings = [
'links' => json_decode($request->settings), 'links' => json_decode($data->settings),
'containerClass' => $request->containerClass 'containerClass' => $data->containerClass
]; ];
$widget->settings = json_encode($settings); $widget->settings = json_encode($settings);
+58 -40
View File
@@ -1,7 +1,6 @@
<?php <?php
namespace App\Widgets\OrbitSlider; namespace App\Widgets\OrbitSlider;
use App\Http\Requests\Request;
use App\Models\Directory; use App\Models\Directory;
use App\Models\Widget; use App\Models\Widget;
use App\Widgets\Contracts\PublicWidget; use App\Widgets\Contracts\PublicWidget;
@@ -35,59 +34,80 @@ class OrbitSlider implements PublicWidget
return 'widgets/orbitSlider.widgetDescription'; return 'widgets/orbitSlider.widgetDescription';
} }
/**
* @param $name
* @param $directoryId
* @param $parentDirectoryId
*
* @throws WidgetExistsException
*/
protected static function checkIfDirectoryExists($name, $directoryId, $parentDirectoryId)
{
// check if directory does not exists
$exists = Directory::where('name', $name)
->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 Widget $widget
* @param Request $request * @param \stdClass $data
* *
* @throws WidgetExistsException * @throws WidgetExistsException
* *
* @return Widget * @return Widget
*/ */
public static function save(Widget $widget, Request $request) public static function save(Widget $widget, \stdClass $data)
{ {
$settings = json_decode($widget->settings); $settings = json_decode($widget->settings);
$parentDirectoryId = Storage::get(self::CONFIG_FILENAME); $parentDirectoryId = Storage::get(self::CONFIG_FILENAME);
$directoryId = isset($settings->directoryId) ? $settings->directoryId : null; $directoryId = isset($settings->directoryId) ? $settings->directoryId : null;
$edit = false;
// check if directory does not exists if (!isset($data->useExistingDirectory)) {
$exists = Directory::where('name', $request->name) // check if name with same name does not exists yet
->where('parent_id', $parentDirectoryId); self::checkIfDirectoryExists($data->name, $directoryId, $parentDirectoryId);
if ($directoryId) {
$edit = true;
$exists = $exists->where('id', '!=', $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 // 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->user_id = Auth::user()->id;
$directory->parent_id = $parentDirectoryId; $directory->parent_id = $parentDirectoryId;
$directory->name = $request->name; }
$directory->description = $request->description;
// common info both for edit and creation
$directory->name = $data->name;
$directory->description = $data->description;
// save into database
$directory->save(); $directory->save();
$directoryId = $directory->id;
} else {
$directoryId = $data->directoryId;
}
$settings = [ $settings = [
'directoryId' => $directory->id, 'directoryId' => $directoryId,
'imagePerSlide' => $request->imagePerSlide, 'imagePerSlide' => isset($data->imagePerSlide) ? $data->imagePerSlide : 4,
'displayBullets' => $request->has('displayBullets'), 'displayBullets' => isset($data->displayBullets),
'sliderClass' => isset($request->containerClass) ? $request->containerClass : '', 'sliderClass' => isset($data->containerClass) ? $data->containerClass : '',
'slideContainerClass' => isset($request->slideContainerClass) ? $request->slideContainerClass : '', 'slideContainerClass' => isset($data->slideContainerClass) ? $data->slideContainerClass : '',
'code' => $request->code 'code' => isset($data->code) ? $data->code : ''
]; ];
$widget->settings = self::createSettings($settings); self::checkSettings($settings);
$widget->settings = json_encode($settings);;
return $widget; return $widget;
} }
@@ -97,8 +117,12 @@ class OrbitSlider implements PublicWidget
* *
* @param $settings * @param $settings
*/ */
public static function prepareSettings(&$settings) public static function checkSettings(&$settings)
{ {
if (!is_object($settings)) {
$settings = (object)$settings;
}
if (!isset($settings->slideContainerClass)) { if (!isset($settings->slideContainerClass)) {
$settings->slideContainerClass = ''; $settings->slideContainerClass = '';
} }
@@ -122,12 +146,6 @@ class OrbitSlider implements PublicWidget
} }
} }
public static function createSettings($settings) {
self::prepareSettings($settings);
return json_encode($settings);
}
/** /**
* Getter for presenter/renderer of this widget * Getter for presenter/renderer of this widget
* *
@@ -39,7 +39,7 @@ class OrbitSlider implements WidgetRenderer
->get(); ->get();
// add some non-existing values // 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); $slidesCount = ($settings->imagePerSlide == 'fullscreen') ? count($images) : ceil(count($images) / $settings->imagePerSlide);
$htmlGridNumber = ($settings->imagePerSlide == 'fullscreen') ? false : 12 / $settings->imagePerSlide; $htmlGridNumber = ($settings->imagePerSlide == 'fullscreen') ? false : 12 / $settings->imagePerSlide;
@@ -65,7 +65,7 @@ class OrbitSlider implements WidgetRenderer
// create default object with settings // create default object with settings
$settings = new \stdClass(); $settings = new \stdClass();
\App\Widgets\OrbitSlider\OrbitSlider::prepareSettings($settings); \App\Widgets\OrbitSlider\OrbitSlider::checkSettings($settings);
return view('admin.widgets.orbitSlider.new', [ return view('admin.widgets.orbitSlider.new', [
'type' => $type, 'type' => $type,
@@ -87,7 +87,7 @@ class OrbitSlider implements WidgetRenderer
$settings = json_decode($widget->settings); $settings = json_decode($widget->settings);
// create default object with settings // create default object with settings
\App\Widgets\OrbitSlider\OrbitSlider::prepareSettings($settings); \App\Widgets\OrbitSlider\OrbitSlider::checkSettings($settings);
return view('admin.widgets.orbitSlider.edit', [ return view('admin.widgets.orbitSlider.edit', [
'widget' => $widget, 'widget' => $widget,
@@ -169,4 +169,16 @@ class ContactForm extends Handler
{ {
// TODO: Implement install() method. // 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
}
} }
+18
View File
@@ -50,6 +50,24 @@ class Gallery implements AppHandler
return History::class; 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 * Save module-specific values into database
* *
@@ -0,0 +1,113 @@
<?php namespace Modules\Gallery\Http\Controllers\Admin;
use App\Models\Content;
use App\Models\Widget;
use App\Models\WidgetType;
use App\Widgets\OrbitSlider\OrbitSlider;
use Pingpong\Modules\Routing\Controller;
class CreateOrbitSlider extends Controller
{
/**
* @var Widget
*/
private $widget;
/**
* CreateOrbitSlider constructor.
*
* @param Widget $widget
*/
public function __construct(Widget $widget)
{
$this->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'));
}
}
+10
View File
@@ -1 +1,11 @@
<?php <?php
Route::group([
'middleware' => ['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');
});
@@ -1,5 +1,11 @@
<?php <?php
return [ return [
'upload' => 'Upload photos', 'upload' => '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',
]; ];
@@ -1,3 +1,12 @@
<div class="row column"> <div class="row column">
<a href="{{route('upload.overview', ['id' => $page->module_settings->directoryId])}}" class="button large expanded success">@lang('gallery::admin/content.upload')</a> <a href="{{route('upload.overview', ['id' => $page->module_settings->directoryId])}}" class="button large expanded success">@lang('gallery::admin/content.upload')</a>
</div> </div>
<div class="row column text-center">
@if (!$extraData['slider'])
<a href="{{route('gallery.makeSlider', ['id' => $page->id])}}" class="button primary">@lang('gallery::admin/content.makeSlider')</a>
@else
<a href="{{route('widgets.edit', ['id' => $extraData['slider']])}}" class="button secondary">@lang('gallery::admin/content.sliderEdit')</a>
@endif
</div>
<div class="clearfix"></div>
@@ -96,4 +96,16 @@ class StaticPage extends Handler
{ {
// nothing to do // nothing to do
} }
/**
* Load some extra data for content management form?
*
* @param Content $content
*
* @return mixed
*/
public static function loadExtraData(Content $content)
{
// nothing to do
}
} }
@@ -1,13 +1,14 @@
<div class="orbit {{$settings->sliderClass}}" role="region" data-orbit> @if (!empty($images))
<div class="orbit {{$settings->sliderClass}}" role="region" data-orbit>
<ul class="orbit-container"> <ul class="orbit-container">
<button class="orbit-previous" aria-label="previous"> <p class="orbit-previous" aria-label="previous">
<span class="show-for-sr">Previous Slide</span> <span class="show-for-sr">Previous Slide</span>
<i class="fa fa-fw fa-2x fa-chevron-left"></i> <i class="fa fa-fw fa-2x fa-chevron-left"></i>
</button> </p>
<button class="orbit-next" aria-label="next"> <p class="orbit-next" aria-label="next">
<span class="show-for-sr">Next Slide</span> <span class="show-for-sr">Next Slide</span>
<i class="fa fa-fw fa-2x fa-chevron-right"></i> <i class="fa fa-fw fa-2x fa-chevron-right"></i>
</button> </p>
@if ($settings->imagePerSlide == 'fullscreen') @if ($settings->imagePerSlide == 'fullscreen')
@foreach($images as $i => $image) @foreach($images as $i => $image)
@@ -22,8 +23,11 @@
@for($i = 0; $i < $slidesCount; $i++) @for($i = 0; $i < $slidesCount; $i++)
<li class="orbit-slide row {{$settings->slideContainerClass}} @if($i == 0)is-active @endif"> <li class="orbit-slide row {{$settings->slideContainerClass}} @if($i == 0)is-active @endif">
@for ($j = 0; $j < $settings->imagePerSlide; $j++) @for ($j = 0; $j < $settings->imagePerSlide; $j++)
@if (!isset($images[$i*$settings->imagePerSlide + $j]))
@break
@endif
<div class="column medium-{{$gridNumber}}"> <div class="column medium-{{$gridNumber}}">
<img src="{{config('app.upload_url')}}/{{$images[$j]->filename}}" /> <img src="{{config('app.upload_url')}}/{{$images[$i*$settings->imagePerSlide + $j]->filename}}" />
</div> </div>
@endfor @endfor
</li> </li>
@@ -40,4 +44,5 @@
@endif @endif
{!! $settings->code !!} {!! $settings->code !!}
</div> </div>
@endif