FEATURE: add functionality for creating new widget.

This commit adds functionality for creating widget of whatever type. Controller calls widget admin handler, which renders and handles input form.
This commit is contained in:
Michal Kváček
2016-02-15 12:19:54 +01:00
parent 043c842aef
commit ccc2d918c9
8 changed files with 289 additions and 0 deletions
@@ -0,0 +1,81 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests;
use App\Http\Requests\NewWidgetRequest;
use App\Models\Widget;
use App\Models\WidgetType;
use App\Widgets\Exceptions\MissingParameterException;
use Illuminate\Support\Facades\Auth;
class CreateNewWidget extends Controller
{
/**
* Form for new widget area
*
* @param $type
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getNew($type)
{
$widgetType = WidgetType::findOrFail($type);
$presenter = call_user_func([$widgetType->handler, 'getPresenter']);
return call_user_func([$presenter, 'renderAddForm'], $widgetType);
}
/**
* Create new instance of given widget type
*
* @param NewWidgetRequest $request
* @param $type
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postNew(NewWidgetRequest $request, $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 {
$widget = call_user_func([$widgetType->handler, 'save'], $widget, $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()]));
}
// save into database
$widget->save();
// redirect with success notification
return redirect()
->route('widgets.new', ['type' => $type])
->with('success', trans('admin/widgets.successfullyCreated'));
}
private function invalidWidget($widgetType, $error)
{
return redirect()
->route('widgets.new', ['type' => $widgetType])
->withInput()
->with('error', $error);
}
}
+18
View File
@@ -0,0 +1,18 @@
<?php
namespace App\Http\Requests;
class NewWidgetRequest extends Request
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required'
];
}
}