Merge branch 'settings' into dev

This commit is contained in:
Michal Kváček
2016-03-14 00:53:48 +01:00
22 changed files with 484 additions and 31 deletions
+1 -1
View File
@@ -123,7 +123,7 @@ abstract class Handler implements AppHandler
$sub->route('customfields.overview', trans('admin/mainMenu.customFieldsOverview'), [], 50, ['icon' => 'fa fa-code-fork']);
}, 30, ['icon' => 'fa fa-code']);
$menu->route('log.overview', trans('admin/mainMenu.actionLog'), [], 40, ['icon' => 'fa fa-history']);
$menu->url('#', trans('admin/mainMenu.settings'), 50, ['icon' => 'fa fa-gear']);
$menu->route('settings.overview', trans('admin/mainMenu.settings'), [], 50, ['icon' => 'fa fa-gear']);
});
// order
@@ -0,0 +1,56 @@
<?php
namespace App\Handlers\Registrators\Items;
class SettingExtension
{
/**
* @var string human readable ID of settings section (used e.g. as ID parameter in html)
*/
protected $id;
/**
* @var string translations string used for describing briefly settings section
*/
protected $name;
/**
* @var string view used for rendering given settings part
*/
protected $view;
/**
* SettingExtension constructor.
*
* @param string $id
* @param string $name
* @param string $view
*/
public function __construct($id, $name, $view)
{
$this->id = $id;
$this->name = $name;
$this->view = $view;
}
/**
* @return string
*/
public function getId()
{
return $this->id;
}
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @return string
*/
public function getView()
{
return $this->view;
}
}
@@ -0,0 +1,68 @@
<?php
namespace App\Handlers\Registrators;
use App\Enumerations\Exceptions\EnumerationExistsException;
use App\Handlers\Registrators\Items\SettingExtension;
class SettingsExtensionRegistrator
{
protected $settingsExtensions;
function __construct($app)
{
$this->settingsExtensions = [];
}
/**
* Method for registering new settings extensions/parts
*
* @param $sectionId
* @param $sectionName
* @param $sectionView
*
* @throws EnumerationExistsException
*/
public function register($sectionId, $sectionName, $sectionView)
{
$this->checkIfRegistered($sectionId);
// register new extension
$this->settingsExtensions[$sectionId] = new SettingExtension($sectionId, $sectionName, $sectionView);
}
/**
* Registers new setting part - only as SettingExtension directly
*
* @param SettingExtension $extension
*/
public function registerObject(SettingExtension $extension)
{
$this->checkIfRegistered($extension->getId());
$this->settingsExtensions[$extension->getId()] = $extension;
}
/**
* Getter for all registered extensions
*
* @return array
*/
public function get()
{
return $this->settingsExtensions;
}
/**
* Checks if this section is not already defined
*
* @param $sectionId
*
* @throws EnumerationExistsException
*/
private function checkIfRegistered($sectionId)
{
if (isset($this->settingsExtensions[$sectionId])) {
throw new EnumerationExistsException('Already existing key ' . $sectionId);
}
}
}
+60
View File
@@ -0,0 +1,60 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests;
use Illuminate\Support\Facades\App;
class Settings extends Controller
{
/**
* @var \App\Models\Settings
*/
protected $settings;
/**
* Settings constructor.
*
* @param \App\Models\Settings $settings
*/
public function __construct(\App\Models\Settings $settings)
{
$this->settings = $settings;
}
public function getOverview()
{
$sections = App::make('registerSettingsExtension')
->get();
$settings = $this->settings->getAll();
return view('admin.settings.overview', [
'formSections' => $sections,
'settings' => $settings
]);
}
public function saveSettings(Requests\SaveSettingsRequest $request)
{
$data = $request->all();
// remove CSRF token field
unset($data['_token']);
$settings = $this->settings->getAll();
$updated = 0;
foreach($data as $key => $value) {
if ($settings->$key != $value) {
$updated ++;
\App\Models\Settings::where('key', $key)->update(['value' => $value]);
}
}
if ($updated > 0) {
return redirect()->route('settings.overview')->with('success', trans('admin/settings.successfullySaved'));
} else {
return redirect()->route('settings.overview')->with('error', trans('admin/settings.nothingToSave'));
}
}
}
+18
View File
@@ -0,0 +1,18 @@
<?php
namespace App\Http\Requests;
class SaveSettingsRequest extends Request
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'pageName' => 'required',
];
}
}
+7
View File
@@ -215,6 +215,13 @@ Route::group([
Route::post('upload/image', 'UploadFile@postImage')
->name('upload.postImage');
// form with settings
Route::get('settings', 'Settings@getOverview')
->name('settings.overview');
Route::post('settings', 'Settings@saveSettings')
->name('settings.save');
// custom fields
// ------------------------------
+56
View File
@@ -0,0 +1,56 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Settings extends Model
{
protected $table = 'settings';
public $timestamps = false;
protected $fillable = ['key', 'value'];
/**
* Load all settings
*
* @return \stdClass
*/
public function getAll()
{
$settings = Settings::select(['key', 'value'])
->get();
return $this->returnPairs($settings);
}
/**
* Load only config for views
*
* @return \stdClass
*/
public function getForView()
{
$settings = Settings::select(['key', 'value'])
->where('load_into_views', 1)
->get();
return $this->returnPairs($settings);
}
/**
* From pair <key, value> create object key => value
*
* @param $settings
*
* @return \stdClass
*/
private function returnPairs($settings)
{
$data = new \stdClass();
foreach ($settings as $conf) {
$data->{$conf->key} = $conf->value;
}
return $data;
}
}
+17
View File
@@ -2,6 +2,7 @@
namespace App\Providers;
use App\Handlers\Registrators\SettingsExtensionRegistrator;
use App\Handlers\Registrators\TemplateRegistrator;
use App\Handlers\Registrators\WidgetRegistrator;
use App\Widgets\HtmlCode\HtmlCode;
@@ -18,6 +19,7 @@ class AppServiceProvider extends ServiceProvider
{
$this->registerWidgets();
$this->registerTemplates();
$this->registerSettings();
}
/**
@@ -45,6 +47,10 @@ class AppServiceProvider extends ServiceProvider
$this->app->singleton('registerTemplateDir', function ($app) {
return new TemplateRegistrator($app);
});
$this->app->singleton('registerSettingsExtension', function ($app) {
return new SettingsExtensionRegistrator($app);
});
}
/**
@@ -74,4 +80,15 @@ class AppServiceProvider extends ServiceProvider
$registrator->register(config('app.theme'), 'admin/templates.core');
}
/**
* Register setting sections
*/
private function registerSettings()
{
$registrator = $this->app->make('registerSettingsExtension');
$registrator->register('basic', 'admin/settings.basic', 'admin.settings.parts.basic');
$registrator->register('meta', 'admin/settings.meta', 'admin.settings.parts.meta');
}
}
+36 -23
View File
@@ -2,6 +2,7 @@
namespace App\Providers;
use App\Models\Settings;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
@@ -14,8 +15,42 @@ class GlobalViewDataProvider extends ServiceProvider
*/
public function boot()
{
view()->share('vendorName', 'ja s.r.o.');
$settings = new Settings();
foreach ($settings->getForView() as $key => $value) {
view()->share($key, $value);
}
$this->extendBlade();
}
/**
* Creates pattern for matching Blade directives
*
* @param $function
*
* @return string
*/
private function createPattern($function)
{
return '/(?<!\w)(\s*)@' . $function . '\(\s*(.*)\)/';
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Create new Blade directives
*/
private function extendBlade()
{
// extend Blade "@extends" macro - with this macro allows to use "hierarchy" in templates
Blade::extend(function ($view) {
$pattern = $this->createPattern('extendVisitor');
@@ -48,26 +83,4 @@ class GlobalViewDataProvider extends ServiceProvider
return preg_replace($pattern, $code, $view);
});
}
/**
* Creates pattern for matching Blade directives
*
* @param $function
*
* @return string
*/
private function createPattern($function)
{
return '/(?<!\w)(\s*)@' . $function . '\(\s*(.*)\)/';
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}