This commit adds functionality for creating widget of whatever type. Controller calls widget admin handler, which renders and handles input form.
82 lines
2.3 KiB
PHP
82 lines
2.3 KiB
PHP
<?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);
|
|
}
|
|
}
|