Skip to content
This repository has been archived by the owner on Apr 3, 2020. It is now read-only.

Adds ability to edit settings from ACP #282

Merged
merged 1 commit into from
Feb 20, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion app/Database/Repositories/Decorators/Forum/CachingDecorator.php
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ public function update(Forum $forum, $details)
return $this->decoratedRepository->update($forum, $details);
}

/**
/**
* {@inheritdoc}
*/
public function changeParent(Forum $forum, int $newParent)
Expand All @@ -256,4 +256,12 @@ public function changeParent(Forum $forum, int $newParent)
$this->cache->forget('forums.index_tree');
return $this->cache->forget('forums.all');
}

/**
* {@inheritdoc}
*/
public function onlyChildren()
{
return $this->decoratedRepository->onlyChildren();
}
}
8 changes: 8 additions & 0 deletions app/Database/Repositories/Eloquent/ForumRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -282,4 +282,12 @@ public function changeParent(Forum $forum, int $newParent)
{
//TODO implement function
}

/**
* {@inheritdoc}
*/
public function onlyChildren()
{
return $this->forumModel->where('parent_id', '!=', null)->get();
}
}
7 changes: 7 additions & 0 deletions app/Database/Repositories/ForumRepositoryInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -131,4 +131,11 @@ public function update(Forum $forum, $details);
* @return mixed
*/
public function changeParent(Forum $forum, int $newParent);

/**
* Get only children forums
*
* @return mixed
*/
public function onlyChildren();
}
33 changes: 33 additions & 0 deletions app/Exceptions/SettingNotFoundException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php
/**
* @author MyBB Group
* @version 2.0.0
* @package mybb/core
* @license http://www.mybb.com/licenses/bsd3 BSD-3
*/

namespace MyBB\Core\Exceptions;

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class SettingNotFoundException extends NotFoundHttpException
{
/**
* @var string
*/
protected $message = 'errors.setting_not_found';

/**
* @param null $message
* @param \Exception $previous
* @param int $code
*/
public function __construct($message = null, \Exception $previous = null, $code = 0)
{
if ($message === null) {
$message = trans($this->message);
}

parent::__construct($message, $previous, $code);
}
}
24 changes: 16 additions & 8 deletions app/Http/Controllers/AccountController.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use Illuminate\Translation\Translator;
use MyBB\Core\Database\Repositories\ProfileFieldGroupRepositoryInterface;
use MyBB\Core\Database\Repositories\UserProfileFieldRepositoryInterface;
use MyBB\Settings\Repositories\SettingRepositoryInterface;
use MyBB\Core\Http\Requests\Account\CropAvatarRequest;
use MyBB\Core\Http\Requests\Account\UpdateAvatarRequest;
use MyBB\Core\Http\Requests\Account\UpdateEmailRequest;
Expand All @@ -33,14 +34,21 @@ class AccountController extends AbstractController
*/
private $guard;

/**
* @var SettingRepositoryInterface
*/
private $settingRepository;

/**
* Create a new controller instance.
*
* @param Guard $guard
* @param SettingRepositoryInterface $settingRepository
*/
public function __construct(Guard $guard)
public function __construct(Guard $guard, SettingRepositoryInterface $settingRepository)
{
$this->guard = $guard;
$this->settingRepository = $settingRepository;
}

/**
Expand Down Expand Up @@ -171,7 +179,7 @@ public function postEmail(UpdateEmailRequest $request)
/**
* @param string $token
*
* @return $this
* @return \Illuminate\Http\RedirectResponse
*/
public function confirmEmail($token)
{
Expand Down Expand Up @@ -464,12 +472,11 @@ public function getPreferences(Store $settings, Filesystem $files, Translator $t

/**
* @param UpdatePreferencesRequest $request
* @param Store $settings
* @param Translator $trans
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postPreferences(UpdatePreferencesRequest $request, Store $settings, Translator $trans)
public function postPreferences(UpdatePreferencesRequest $request, Translator $trans)
{
$input = $request->except(['_token']);

Expand Down Expand Up @@ -521,7 +528,8 @@ public function postPreferences(UpdatePreferencesRequest $request, Store $settin
$modifiedSettings["user.{$key}"] = $value;
}

$settings->set($modifiedSettings, null, true);
$user = $this->guard->user();
$this->settingRepository->updateSettings($modifiedSettings, $user->getAuthIdentifier());

return redirect()->route('account.preferences')->withSuccess(trans('account.saved_preferences'));
}
Expand All @@ -536,11 +544,10 @@ public function getPrivacy()

/**
* @param UpdatePrivacyRequest $request
* @param Store $settings
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postPrivacy(UpdatePrivacyRequest $request, Store $settings)
public function postPrivacy(UpdatePrivacyRequest $request)
{
$input = $request->except(['_token']);

Expand All @@ -557,7 +564,8 @@ public function postPrivacy(UpdatePrivacyRequest $request, Store $settings)
$modifiedSettings["user.{$key}"] = $value;
}

$settings->set($modifiedSettings, null, true);
$user = $this->guard->user();
$this->settingRepository->updateSettings($modifiedSettings, $user->getAuthIdentifier());

return redirect()->route('account.privacy')->withSuccess(trans('account.saved_privacy'));
}
Expand Down
162 changes: 162 additions & 0 deletions app/Http/Controllers/Admin/Settings/SettingsController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
<?php
/**
* @author MyBB Group
* @version 2.0.0
* @package mybb/core
* @license http://www.mybb.com/licenses/bsd3 BSD-3
*/

namespace MyBB\Core\Http\Controllers\Admin\Settings;

use Illuminate\Http\Request;
use DaveJamesMiller\Breadcrumbs\Manager as Breadcrumbs;
use MyBB\Core\Database\Repositories\ForumRepositoryInterface;
use MyBB\Core\Database\Repositories\RoleRepositoryInterface;
use MyBB\Core\Exceptions\SettingNotFoundException;
use MyBB\Core\Http\Controllers\Admin\AdminController;
use MyBB\Settings\Repositories\SettingRepositoryInterface;

class SettingsController extends AdminController
{
/**
* @var SettingRepositoryInterface
*/
protected $settingRepository;

/**
* @var RoleRepositoryInterface
*/
protected $roleRepository;

/**
* @var ForumRepositoryInterface
*/
protected $forumRepository;

/**
* SettingsController constructor.
* @param SettingRepositoryInterface $settingRepository
* @param RoleRepositoryInterface $roleRepository
* @param ForumRepositoryInterface $forumRepository
*/
public function __construct(
SettingRepositoryInterface $settingRepository,
RoleRepositoryInterface $roleRepository,
ForumRepositoryInterface $forumRepository
) {
$this->settingRepository = $settingRepository;
$this->roleRepository = $roleRepository;
$this->forumRepository = $forumRepository;
}

/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function listGroups()
{
$groups = $this->settingRepository->getSettingsGroups(['user'])->unique();

$core = [];
$extensions = [];
foreach ($groups as $group) {
if ($group['package']['original'] == 'mybb/core') {
$core[] = $group;
} else {
$extensions[] = $group;
}
}

return view('admin.settings.groups', compact('core', 'extensions'))->withActive('settings');
}

/**
* @param string $group
* @param string $package
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function editGroupOfSettings(string $group, string $package = 'mybb.core')
{
// get original package name
$originalPackage = str_replace('.', '/', $package);

$settings = $this->settingRepository->getSettingsForGroup($group, $originalPackage);
if (!count($settings) || $group == 'user') {
throw new SettingNotFoundException();
}

$roles = $this->roleRepository->all();
$forums = $this->forumRepository->onlyChildren();

$packageName = explode('.', $package);
$packageName = $packageName[1];
if ($packageName == 'core') {
$packageName = 'admin';
}

return view('admin.settings.edit', compact('settings', 'group', 'package', 'roles', 'forums', 'packageName'))
->withActive('settings');
}

/**
* @param Request $request
* @param string $group
* @param string $package
* @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse
*/
public function saveGroupOfSettings(Request $request, string $group, string $package = 'mybb.core')
{
$inputs = $request->get('setting');
// restore original package name
$package = str_replace('.', '/', $package);

$oldSettings = $this->settingRepository->getSettingsForGroup($group, $package)->keyBy('name');

$modifiedSettings = [];
foreach ($oldSettings as $name => $setting) {
switch ($setting['setting_type']) {
case 'number':
$value = (int)$inputs[$name];
break;
case 'checkbox':
$value = isset($inputs[$name]);
break;
case 'switch':
$value = (bool)$inputs[$name];
break;
case 'choose':
case 'radio':
case 'string':
$value = (string)$inputs[$name];
break;
case 'multichoose':
$value = implode("|", $inputs[$name]);
break;
case 'roleselect':
case 'forumselect':
if ($inputs[$name] == "-1") {
// none
$value = null;
} elseif ($inputs[$name] == 0) {
// all
$value = 0;
} else {
// select
if (isset($inputs[$name . '_select'])) {
$value = implode("|", $inputs[$name . '_select']);
} else {
$value = null;
}
}
break;
default:
$value = $inputs[$name];
break;
}
$modifiedSettings[$setting['name']] = $value;
}

$this->settingRepository->updateSettings($modifiedSettings, false, $package);

return redirect()->route('admin.settings')->withSuccess(trans('admin::general.success_saved'));
}
}
14 changes: 14 additions & 0 deletions app/Http/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,20 @@
'uses' => 'Admin\Forums\ForumsController@update',
]);
});
Route::group(['prefix' => 'settings'], function () {
Route::get('/', [
'as' => 'admin.settings',
'uses' => 'Admin\Settings\SettingsController@listGroups',
]);
Route::get('edit/{group}/{package?}', [
'as' => 'admin.settings.edit',
'uses' => 'Admin\Settings\SettingsController@editGroupOfSettings',
]);
Route::post('edit/{group}/{package?}', [
'as' => 'admin.settings.edit',
'uses' => 'Admin\Settings\SettingsController@saveGroupOfSettings',
]);
});
});

Route::get('captcha/{imagehash}', ['as' => 'captcha', 'uses' => 'CaptchaController@captcha', 'noOnline' => true]);
Expand Down
7 changes: 7 additions & 0 deletions app/Providers/AppServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@
use MyBB\Core\Database\Repositories\WarningTypesRepositoryInterface;
use MyBB\Core\Likes\Database\Repositories\Eloquent\LikesRepository;
use MyBB\Core\Likes\Database\Repositories\LikesRepositoryInterface;
use MyBB\Settings\Repositories\SettingRepositoryInterface;
use MyBB\Settings\Repositories\Eloquent\SettingRepository;
use MyBB\Core\Permissions\PermissionChecker;
use MyBB\Core\Renderers\Post\Quote\MyCode;
use MyBB\Core\Renderers\Post\Quote\QuoteInterface;
Expand Down Expand Up @@ -81,6 +83,11 @@ public function register()
PostRepository::class
);

$this->app->bind(
SettingRepositoryInterface::class,
SettingRepository::class
);

$this->app->bind(
TopicRepositoryInterface::class,
TopicRepository::class
Expand Down
Loading