FEATURE: make settings translatable

This commit is contained in:
Michal Kváček
2016-07-23 21:47:20 +02:00
parent b89941b909
commit ab3d8eab41
11 changed files with 150 additions and 47 deletions
+22 -25
View File
@@ -4,21 +4,23 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests;
use App\Models\Settings as SettingsModel;
use Illuminate\Support\Facades\App;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class Settings extends Controller
{
/**
* @var \App\Models\Settings
* @var SettingsModel
*/
protected $settings;
/**
* Settings constructor.
*
* @param \App\Models\Settings $settings
* @param SettingsModel $settings
*/
public function __construct(\App\Models\Settings $settings)
public function __construct(SettingsModel $settings)
{
$this->settings = $settings;
}
@@ -27,7 +29,7 @@ class Settings extends Controller
{
$sections = App::make('registerSettingsExtension')
->get();
$settings = $this->settings->getAll();
$settings = $this->settings->getAllWithLanguage();
return view('admin.settings.overview', [
'formSections' => $sections,
@@ -38,32 +40,27 @@ class Settings extends Controller
public function saveSettings(Requests\SaveSettingsRequest $request)
{
$data = $request->all();
$commonSettings = isset($data['commonSettings']) ? $data['commonSettings'] : [];
// remove CSRF token field
unset($data['_token']);
unset($data['_token'], $data['commonSettings']);
$settings = $this->settings->getAll();
$updated = 0;
foreach ($data as $key => $value) {
if (isset($settings->$key)) {
if ($settings->$key != $value) {
$updated++;
\App\Models\Settings::where('key', $key)
->update(['value' => $value]);
}
} else {
\App\Models\Settings::create(['key' => $key, 'value' => $value]);
$updated++;
// select language for this setting key
$language = isset($commonSettings[$key]) ? null : LaravelLocalization::getCurrentLocale();
$setting = SettingsModel::firstOrNew(['language' => $language, 'key' => $key]);
if ($setting->value == $value) {
continue;
}
// set value and save or delete
$setting->value = $value;
empty($value) ? $setting->delete() : $setting->save();
}
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'));
}
return redirect()
->route('settings.overview')
->with('success', trans('admin/settings.successfullySaved'));
}
}
+41 -6
View File
@@ -3,12 +3,26 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class Settings extends Model
{
protected $table = 'settings';
public $timestamps = false;
protected $fillable = ['key', 'value'];
protected $fillable = ['key', 'value', 'language'];
/**
* Prepares common query for selecting settings
*
* @return mixed
*/
protected function getSettingsQuery()
{
return Settings::select(['key', 'value', 'language'])
->where('language', LaravelLocalization::getCurrentLocale())
->orWhere('language', null)
->orderBy('language', 'DESC');
}
/**
* Load all settings
@@ -17,12 +31,33 @@ class Settings extends Model
*/
public function getAll()
{
$settings = Settings::select(['key', 'value'])
->get();
$settings = $this->getSettingsQuery()
->get();
return $this->returnPairs($settings);
}
/**
* Get all settings with language info
*
* @return \stdClass
*/
public function getAllWithLanguage()
{
$settings = $this->getSettingsQuery()
->get();
$data = new \stdClass();
foreach ($settings as $conf) {
$data->{$conf->key} = [
'val' => $conf->value,
'lang' => $conf->language
];
}
return $data;
}
/**
* Load only config for views
*
@@ -30,9 +65,9 @@ class Settings extends Model
*/
public function getForView()
{
$settings = Settings::select(['key', 'value'])
->where('load_into_views', 1)
->get();
$settings = $this->getSettingsQuery()
->where('load_into_views', 1)
->get();
return $this->returnPairs($settings);
}