diff --git a/app/CMS/Helpers/WidgetAreas.php b/app/CMS/Helpers/WidgetAreas.php index 9b277701..d102c94d 100644 --- a/app/CMS/Helpers/WidgetAreas.php +++ b/app/CMS/Helpers/WidgetAreas.php @@ -1,6 +1,8 @@ increment('viewed'); + + $widgets = Cache::remember('widget-area-' . $uniqueCode, setting('widgetCacheLifetime', 5), function () use ($uniqueCode) { $widgetArea = new WidgetArea(); return $widgetArea->getWidgets($uniqueCode) ->get(); }); - WidgetArea::where('code', $uniqueCode) - ->increment('viewed'); - self::saveRenderedWidgetArea($widgets); } @@ -44,7 +47,7 @@ class WidgetAreas } $widgets = Cache::remember('widgets', setting('widgetCacheLifetime', 5), function () { - $widgetArea = new WidgetArea(); + $widgetArea = app(WidgetAreaRepository::class); return $widgetArea->getWidgets() ->get(); }); @@ -58,7 +61,7 @@ class WidgetAreas * * @param $uniqueCode * - * @return mixed + * @return void */ public static function render($uniqueCode) { diff --git a/app/CMS/Repositories/Widgets/Widget.php b/app/CMS/Repositories/Widgets/Widget.php index bb924ce4..84299373 100644 --- a/app/CMS/Repositories/Widgets/Widget.php +++ b/app/CMS/Repositories/Widgets/Widget.php @@ -1,4 +1,5 @@ description = $data['description']; $widget->container_class = $data['containerClass']; $widget->container_id = empty($data['containerId']) ? null : $data['containerId']; - $widget->settings = json_encode(call_user_func([$widgetType->handler, 'save'], $request)); + $widget->settings = call_user_func([$widgetType->handler, 'save'], $request); // save into database $widget->save(); @@ -30,4 +31,22 @@ class Widget return $widget; } + + public function edit(WidgetModel $widget, Request $request) + { + // update name + $widget->name = $request->name; + $widget->container_class = $request->containerClass; + $widget->container_id = empty($request->containerId) ? null : $request->containerId; + $widget->description = $request->description; + + // try to save this widget + $widget->settings = call_user_func([$widget->widget_type_handler, 'save'], $request); + + // save into database + $widget->save(); + + // fire event with editing widget + Event::fire(new \App\Events\EditWidget($widget)); + } } \ No newline at end of file diff --git a/app/CMS/Repositories/Widgets/WidgetArea.php b/app/CMS/Repositories/Widgets/WidgetArea.php new file mode 100644 index 00000000..a278549f --- /dev/null +++ b/app/CMS/Repositories/Widgets/WidgetArea.php @@ -0,0 +1,55 @@ +join('widget_in_widget_area', 'widget_in_widget_area.widget_id', '=', 'widgets.id') + ->join('widget_areas', 'widget_in_widget_area.widget_area_id', '=', 'widget_areas.id') + ->where('language', LaravelLocalization::getCurrentLocale()) + ->orderBy('widget_in_widget_area.position'); + if (!$uniqueCode) { + $widgets = $widgets->where('widget_areas.viewed', '>=', setting('preloadFrequentedWidgetAreasTreshold', 10)); + } else { + $widgets = $widgets->where('code', $uniqueCode); + } + + return $widgets; + } + + public function update(\App\Models\Widgets\WidgetArea $area, Request $request) { + $area->name = $request->name; + $area->description = $request->description; + $area->save(); + + // fire event with new widget area + Event::fire(new \App\Events\EditWidgetArea($area)); + } + + /** + * Create new instance of widget area + * + * @param Request $request + */ + public function create(Request $request) + { + $area = WidgetAreaModel::create([ + 'code' => $request->code, + 'name' => $request->name, + 'description' => $request->description + ]); + + // fire event with new widget area + Event::fire(new CreateNewWidgetArea($area)); + } +} \ No newline at end of file diff --git a/app/CMS/Widgets/Menu/Presenters/Menu.php b/app/CMS/Widgets/Menu/Presenters/Menu.php index c5617773..aa6b9cb3 100644 --- a/app/CMS/Widgets/Menu/Presenters/Menu.php +++ b/app/CMS/Widgets/Menu/Presenters/Menu.php @@ -84,13 +84,12 @@ class Menu implements WidgetRenderer // get list of all pages $pages = $content->getOverview() ->get(); - $widget->settings = new \stdClass(); - $widget->settings->links = []; return view('admin.widgets.menu.new', [ 'type' => $type, 'widget' => $widget, 'pages' => $pages, + 'links' => [] ]); } @@ -124,8 +123,6 @@ class Menu implements WidgetRenderer return $a->order - $b->order; }); - $widget->settings->links = (object)$links; - - return view('admin.widgets.menu.edit', ['widget' => $widget, 'pages' => $pages]); + return view('admin.widgets.menu.edit', ['widget' => $widget, 'pages' => $pages, 'links' => (object)$links]); } } \ No newline at end of file diff --git a/app/Events/EditWidgetArea.php b/app/Events/EditWidgetArea.php index 8aa5642d..c069772c 100644 --- a/app/Events/EditWidgetArea.php +++ b/app/Events/EditWidgetArea.php @@ -2,10 +2,8 @@ namespace App\Events; -use App\Events\Event; -use App\Models\WidgetArea; +use App\Models\Widgets\WidgetArea; use Illuminate\Queue\SerializesModels; -use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class EditWidgetArea extends Event { diff --git a/app/Http/Controllers/Admin/Widgets/Areas/CreateNewWidgetArea.php b/app/Http/Controllers/Admin/Widgets/Areas/CreateNewWidgetArea.php index a9ec44e3..636b469e 100644 --- a/app/Http/Controllers/Admin/Widgets/Areas/CreateNewWidgetArea.php +++ b/app/Http/Controllers/Admin/Widgets/Areas/CreateNewWidgetArea.php @@ -2,19 +2,34 @@ namespace App\Http\Controllers\Admin\Widgets\Areas; +use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository; use App\Http\Controllers\Admin\Controller; use App\Http\Requests\NewWidgetAreaRequest; use App\Models\Widgets\WidgetArea; -use Illuminate\Support\Facades\Event; class CreateNewWidgetArea extends Controller { + /** + * @var WidgetAreaRepository + */ + private $widgetAreaRepository; + + /** + * CreateNewWidgetArea constructor. + * + * @param WidgetAreaRepository $widgetAreaRepository + */ + public function __construct(WidgetAreaRepository $widgetAreaRepository) + { + $this->widgetAreaRepository = $widgetAreaRepository; + } + /** * Form for new widget area * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function getNew() + public function create() { return view('admin.widgets.area.new', ['area' => new WidgetArea()]); } @@ -24,18 +39,9 @@ class CreateNewWidgetArea extends Controller * * @return \Illuminate\Http\RedirectResponse */ - public function postNew(NewWidgetAreaRequest $request) + public function store(NewWidgetAreaRequest $request) { - $parameters = [ - 'code' => $request->code, - 'name' => $request->name, - 'description' => $request->description - ]; - - $area = WidgetArea::create($parameters); - - // fire event with new widget area - Event::fire(new \App\Events\CreateNewWidgetArea($area)); + $this->widgetAreaRepository->create($request); // redirect with success notification return redirect() diff --git a/app/Http/Controllers/Admin/Widgets/Areas/EditWidgetArea.php b/app/Http/Controllers/Admin/Widgets/Areas/EditWidgetArea.php index a512334c..57529865 100644 --- a/app/Http/Controllers/Admin/Widgets/Areas/EditWidgetArea.php +++ b/app/Http/Controllers/Admin/Widgets/Areas/EditWidgetArea.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Admin\Widgets\Areas; +use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository; use App\Http\Controllers\Admin\Controller; use App\Http\Requests\EditWidgetAreaRequest; use App\Models\Widgets\Widget; @@ -13,22 +14,37 @@ use Mcamara\LaravelLocalization\Facades\LaravelLocalization; class EditWidgetArea extends Controller { + /** + * @var WidgetAreaRepository + */ + private $widgetAreaRepository; + + /** + * EditWidgetArea constructor. + * + * @param WidgetAreaRepository $widgetAreaRepository + */ + public function __construct(WidgetAreaRepository $widgetAreaRepository) + { + $this->widgetAreaRepository = $widgetAreaRepository; + } + /** * Display form for editing given widget area * - * @param $id + * @param WidgetArea $widgetArea * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + * */ - public function getEdit($id) + public function edit(WidgetArea $widgetArea) { - $area = WidgetArea::findOrFail($id); - $associatedWidgetIds = WidgetInWidgetArea::getWidgetIdsFromArea($area->id); + $associatedWidgetIds = WidgetInWidgetArea::getWidgetIdsFromArea($widgetArea->id); $widgets = Widget::where('language', LaravelLocalization::getCurrentLocale()) ->paginate(25); return view('admin.widgets.area.edit', [ - 'area' => $area, + 'area' => $widgetArea, 'widgets' => $widgets, 'associatedWidgetIds' => $associatedWidgetIds ]); @@ -36,26 +52,14 @@ class EditWidgetArea extends Controller /** * @param EditWidgetAreaRequest $request - * @param $id + * @param WidgetArea $widgetArea * * @return \Illuminate\Http\RedirectResponse + * */ - public function postEdit(EditWidgetAreaRequest $request, $id) + public function update(EditWidgetAreaRequest $request, WidgetArea $widgetArea) { - try { - $area = WidgetArea::findOrFail($id); - } catch (ModelNotFoundException $e) { - return $this->invalidArea(); - } - - $area->name = $request->name; - $area->description = $request->description; - - $area->timestamps = true; - $area->save(); - - // fire event with new widget area - Event::fire(new \App\Events\EditWidgetArea($area)); + $this->widgetAreaRepository->update($widgetArea, $request); return redirect() ->route('widgetareas.overview') @@ -65,21 +69,14 @@ class EditWidgetArea extends Controller /** * Hard deletes widget area * - * @param $id + * @param WidgetArea $widgetArea * * @return \Illuminate\Http\RedirectResponse */ - public function deleteArea($id) + public function delete(WidgetArea $widgetArea) { - // try to find area - try { - $area = WidgetArea::findOrFail($id); - } catch (ModelNotFoundException $e) { - return $this->invalidArea(); - } - // check if widget area is deletable - if (!$area->deletable) { + if (!$widgetArea->deletable) { return redirect() ->back() ->with('error', trans('admin/widgetAreas.notDeletableArea')); diff --git a/app/Http/Controllers/Admin/Widgets/CreateNewWidget.php b/app/Http/Controllers/Admin/Widgets/CreateNewWidget.php index f50f749b..1195deac 100644 --- a/app/Http/Controllers/Admin/Widgets/CreateNewWidget.php +++ b/app/Http/Controllers/Admin/Widgets/CreateNewWidget.php @@ -23,14 +23,13 @@ class CreateNewWidget extends Controller /** * Form for new widget area * - * @param $type + * @param WidgetType $widgetType * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + * */ - public function getNew($type) + public function getNew(WidgetType $widgetType) { - $widgetType = WidgetType::findOrFail($type); - $presenter = call_user_func([$widgetType->handler, 'getPresenter']); return call_user_func([$presenter, 'renderAddForm'], $widgetType); @@ -40,23 +39,22 @@ class CreateNewWidget extends Controller * Create new instance of given widget type * * @param NewWidgetRequest $request - * @param $type + * + * @param WidgetType $widgetType * * @return \Illuminate\Http\RedirectResponse */ - public function postNew(NewWidgetRequest $request, $type) + public function postNew(NewWidgetRequest $request, WidgetType $widgetType) { - $widgetType = WidgetType::findOrFail($type); - // try to save this widget try { $this->widget->createNew($widgetType, $request); } catch (MissingParameterException $e) { // user omitted some value - return $this->invalidWidget($type, $e->getMessage()); - // } catch (\Exception $e) { - // // something went wrong - // return $this->invalidWidget($type, trans('admin/widgets.cannotSave', ['exception' => $e->getMessage()])); + return redirect() + ->back() + ->withInput() + ->with('error', $e->getMessage()); } // redirect with success notification @@ -64,12 +62,4 @@ class CreateNewWidget extends Controller ->route('widgets.overview') ->with('success', trans('admin/widgets.successfullyCreated')); } - - private function invalidWidget($widgetType, $error) - { - return redirect() - ->route('widgets.new', ['type' => $widgetType]) - ->withInput() - ->with('error', $error); - } } diff --git a/app/Http/Controllers/Admin/Widgets/EditWidget.php b/app/Http/Controllers/Admin/Widgets/EditWidget.php index 81ca9ad2..0548b895 100644 --- a/app/Http/Controllers/Admin/Widgets/EditWidget.php +++ b/app/Http/Controllers/Admin/Widgets/EditWidget.php @@ -1,26 +1,39 @@ widgetRepository = $widgetRepository; + } + /** * Render edit form * - * @param $id + * @param Widget $widget * * @return mixed */ - public function getEdit($id) + public function getEdit(Widget $widget) { - $widget = Widget::findOrFail($id); - $widget->settings = json_decode($widget->settings); - $presenter = call_user_func([$widget->widget_type_handler, 'getPresenter']); return call_user_func([$presenter, 'renderEditForm'], $widget); @@ -30,24 +43,14 @@ class EditWidget extends Controller * Save changes into database * * @param EditWidgetRequest $request - * @param $widget + * @param Widget $widget * * @return \Illuminate\Http\RedirectResponse */ - public function postEdit(EditWidgetRequest $request, $widget) + public function postEdit(EditWidgetRequest $request, Widget $widget) { - // create new widget - $widget = Widget::findOrFail($widget); - - // update name - $widget->name = $request->name; - $widget->container_class = $request->containerClass; - $widget->container_id = empty($request->containerId) ? null : $request->containerId; - $widget->description = $request->description; - - // try to save this widget try { - $widget->settings = json_encode(call_user_func([$widget->widget_type_handler, 'save'], $request)); + $this->widgetRepository->edit($widget, $request); } catch (MissingParameterException $e) { // user omitted some value return $this->invalidWidget($e->getMessage()); @@ -56,12 +59,6 @@ class EditWidget extends Controller return $this->invalidWidget(trans('admin/widgets.cannotSave', ['exception' => $e->getMessage()])); } - // save into database - $widget->save(); - - // fire event with editing widget - Event::fire(new \App\Events\EditWidget($widget)); - // redirect with success notification return redirect() ->back() @@ -71,15 +68,12 @@ class EditWidget extends Controller /** * Deletes widget * - * @param $id + * @param Widget $widget * * @return \Illuminate\Http\RedirectResponse */ - public function deleteWidget($id) + public function deleteWidget(Widget $widget) { - // create new widget - $widget = Widget::findOrFail($id); - // check if widget area is deletable if (!$widget->deletable) { return redirect() diff --git a/app/Http/Controllers/Admin/Widgets/WidgetsOverview.php b/app/Http/Controllers/Admin/Widgets/WidgetsOverview.php index 4f95be2c..4f7abf5d 100644 --- a/app/Http/Controllers/Admin/Widgets/WidgetsOverview.php +++ b/app/Http/Controllers/Admin/Widgets/WidgetsOverview.php @@ -7,7 +7,7 @@ use Mcamara\LaravelLocalization\Facades\LaravelLocalization; class WidgetsOverview extends Controller { - public function getOverview() + public function index() { $widgets = Widget::where('language', LaravelLocalization::getCurrentLocale()) ->paginate(25); diff --git a/app/Http/Controllers/Visitor/Homepage.php b/app/Http/Controllers/Visitor/Homepage.php index 38b77969..06e2b6a1 100644 --- a/app/Http/Controllers/Visitor/Homepage.php +++ b/app/Http/Controllers/Visitor/Homepage.php @@ -10,7 +10,7 @@ class Homepage extends ContentPage { // try to find some homepage $contentModel = $this->content; - $page = Cache::remember('hp', setting('homepageCacheLifetime', 5), function () use ($contentModel) { + $page = Cache::remember('homepage', setting('homepageCacheLifetime', 5), function () use ($contentModel) { return $contentModel->getHomepage(); }); diff --git a/app/Http/routes/admin/widgets.php b/app/Http/routes/admin/widgets.php index d10df3fd..a88e0a8f 100644 --- a/app/Http/routes/admin/widgets.php +++ b/app/Http/routes/admin/widgets.php @@ -3,35 +3,35 @@ Route::group(['namespace' => 'Widgets'], function () { // list of all installed widget types - Route::get('widgets/overview', 'WidgetsOverview@getOverview') + Route::get('widgets', 'WidgetsOverview@index') ->name('widgets.overview'); // create new instance of widget of given type - Route::get('widgets/new/{type}', 'CreateNewWidget@getNew') + Route::get('widgets/new/{widgetType}', 'CreateNewWidget@getNew') ->name('widgets.new'); - Route::post('widgets/new/{type}', 'CreateNewWidget@postNew') + Route::post('widgets/new/{widgetType}', 'CreateNewWidget@postNew') ->name('widgets.postNew'); // edit widget settings - Route::get('widgets/edit/{id}', 'EditWidget@getEdit') + Route::get('widgets/edit/{widget}', 'EditWidget@getEdit') ->name('widgets.edit'); // delete widget settings - Route::get('widgets/delete/{id}', 'EditWidget@deleteWidget') + Route::get('widgets/delete/{widget}', 'EditWidget@deleteWidget') ->name('widgets.delete'); - Route::post('widgets/edit/{id}', 'EditWidget@postEdit') + Route::post('widgets/edit/{widget}', 'EditWidget@postEdit') ->name('widgets.postEdit'); // display form for association of widget and widget area Route::get('widgets/associate/{widgetArea}', 'AssociateWidget@getList') ->name('widgets.associate'); - Route::get('widgets/deassociate/{widgetId}/{widgetArea}', 'AssociateWidget@deleteAssociation') + Route::get('widgets/deassociate/{widget}/{widgetArea}', 'AssociateWidget@deleteAssociation') ->name('widgets.deleteAssociation'); - Route::get('widgets/associate/{widgetId}/{widgetArea}', 'AssociateWidget@makeAssociation') + Route::get('widgets/associate/{widget}/{widgetArea}', 'AssociateWidget@makeAssociation') ->name('widgets.makeAssociation'); Route::group(['namespace' => 'Areas'], function () { @@ -39,22 +39,22 @@ Route::group(['namespace' => 'Widgets'], function () { ->name('widgetareas.overview'); // form for new widget area - Route::get('widgets/areas/new', 'CreateNewWidgetArea@getNew') + Route::get('widgets/areas/new', 'CreateNewWidgetArea@create') ->name('widgetareas.new'); // form for new widget area - Route::post('widgets/areas/new', 'CreateNewWidgetArea@postNew') + Route::post('widgets/areas/new', 'CreateNewWidgetArea@store') ->name('widgetareas.postNew'); // edit form for widget area - Route::get('widgets/areas/edit/{id}', 'EditWidgetArea@getEdit') + Route::get('widgets/areas/edit/{widgetArea}', 'EditWidgetArea@edit') ->name('widgetareas.edit'); - Route::post('widgets/areas/edit/{id}', 'EditWidgetArea@postEdit') + Route::post('widgets/areas/edit/{widgetArea}', 'EditWidgetArea@update') ->name('widgetareas.postEdit'); // edit form for widget area - Route::get('widgets/areas/delete/{id}', 'EditWidgetArea@deleteArea') + Route::get('widgets/areas/delete/{widgetArea}', 'EditWidgetArea@delete') ->name('widgetareas.delete'); }); }); diff --git a/app/Models/Widgets/ModelTraits/Widget.php b/app/Models/Widgets/ModelTraits/Widget.php deleted file mode 100644 index 82f1c263..00000000 --- a/app/Models/Widgets/ModelTraits/Widget.php +++ /dev/null @@ -1,41 +0,0 @@ -handler, 'save'], $request); - - // create new widget - $widget = WidgetModel::create([ - 'widget_type_handler' => $widgetType->handler, - 'language' => LaravelLocalization::getCurrentLocale(), - 'user_id' => \Auth::user()->id, - 'name' => $request->name, - 'container_class' => $request->containerClass, - 'container_id' => empty($request->containerId) ? null : $request->containerId, - 'description' => $request->description, - 'settings' => json_encode($settings), - ]); - - // fire event with newly created widget - \Event::fire(new CreateNewWidget($widget)); - - return $widget; - } -} \ No newline at end of file diff --git a/app/Models/Widgets/ModelTraits/WidgetArea.php b/app/Models/Widgets/ModelTraits/WidgetArea.php deleted file mode 100644 index f457fb35..00000000 --- a/app/Models/Widgets/ModelTraits/WidgetArea.php +++ /dev/null @@ -1,24 +0,0 @@ -join('widget_in_widget_area', 'widget_in_widget_area.widget_id', '=', 'widgets.id') - ->join('widget_areas', 'widget_in_widget_area.widget_area_id', '=', 'widget_areas.id') - ->where('language', LaravelLocalization::getCurrentLocale()) - ->orderBy('widget_in_widget_area.position'); - if (!$uniqueCode) { - $widgets = $widgets->where('widget_areas.viewed', '>=', setting('preloadFrequentedWidgetAreasTreshold', 10)); - } else { - $widgets = $widgets->where('code', $uniqueCode); - } - - return $widgets; - } -} \ No newline at end of file diff --git a/app/Models/Widgets/Widget.php b/app/Models/Widgets/Widget.php index fdb27d56..b4f25fff 100644 --- a/app/Models/Widgets/Widget.php +++ b/app/Models/Widgets/Widget.php @@ -22,4 +22,9 @@ class Widget extends Model 'viewed', 'deletable' ]; + + protected $casts = [ + 'settings' => 'object', + 'deletable' => 'boolean', + ]; } \ No newline at end of file diff --git a/app/Models/Widgets/WidgetArea.php b/app/Models/Widgets/WidgetArea.php index 2e32cb5b..d326783a 100644 --- a/app/Models/Widgets/WidgetArea.php +++ b/app/Models/Widgets/WidgetArea.php @@ -3,19 +3,24 @@ namespace App\Models\Widgets; use Illuminate\Database\Eloquent\Model; +use Mcamara\LaravelLocalization\Facades\LaravelLocalization; /** * Class WidgetArea */ class WidgetArea extends Model { - use ModelTraits\WidgetArea; - - public $timestamps = false; + public $timestamps = true; protected $fillable = [ 'name', 'code', 'description', 'deletable' ]; + + public function widgets() + { + return $this->hasMany(Widget::class) + ->where('language', LaravelLocalization::getCurrentLocale()); + } } \ No newline at end of file diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 8e8fa143..e25b2de4 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -122,7 +122,6 @@ class AppServiceProvider extends ServiceProvider $registrator->register('basic', 'admin/settings.basic', 'admin.settings.parts.basic'); $registrator->register('meta', 'admin/settings.meta', 'admin.settings.parts.meta'); $registrator->register('social', 'admin/settings.socialSites', 'admin.settings.parts.social'); - $registrator->register('recaptcha', 'admin/settings.recaptcha', 'admin.settings.parts.recaptcha'); } /** diff --git a/resources/views/admin/widgets/area/overview.blade.php b/resources/views/admin/widgets/area/overview.blade.php index 6d0d7b65..46b122bd 100644 --- a/resources/views/admin/widgets/area/overview.blade.php +++ b/resources/views/admin/widgets/area/overview.blade.php @@ -6,53 +6,60 @@
| @lang('admin/widgetAreas.name') | -@lang('admin/widgetAreas.uniqueCode') | -@lang('admin/widgetAreas.description') | -@lang('admin/widgetAreas.actions') | -||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{$area->name}} | -{{$area->code}} | -{{str_limit($area->description, 100)}} | -
-
-
-
-
-
-
-
+
+
+
+
|
+