View source
<?php
namespace Drupal\role_theme_switcher\Form;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Extension\ThemeHandlerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class AdminSettingsForm extends ConfigFormBase {
protected $themeHandler;
public function __construct(ConfigFactoryInterface $config_factory, ThemeHandlerInterface $theme_handler) {
parent::__construct($config_factory);
$this->themeHandler = $theme_handler;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('config.factory'), $container
->get('theme_handler'));
}
protected function getEditableConfigNames() {
return [
'role_theme_switcher.settings',
];
}
public function getFormId() {
return 'role_theme_switcher_admin_settings';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$themes = $this
->getThemeList();
$form['role_theme_switcher'] = [
'#type' => 'table',
'#title' => $this
->t('Role processing order'),
'#header' => [
$this
->t('Role name'),
$this
->t('Selected Theme'),
$this
->t('Weight'),
],
'#empty' => $this
->t('There are no items yet. Add roles.'),
'#tabledrag' => [
[
'table_id' => 'edit-role-theme-switcher',
'action' => 'order',
'relationship' => 'sibling',
'group' => 'role-order-weight',
],
],
];
$roles = $this
->getUserRoles();
foreach ($roles as $rid => $role) {
$form['role_theme_switcher'][$rid]['#attributes']['class'][] = 'draggable';
$form['role_theme_switcher'][$rid]['#weight'] = $role['weight'];
$form['role_theme_switcher'][$rid]['role'] = [
'#plain_text' => $role['name'],
];
$form['role_theme_switcher'][$rid]['theme'] = [
'#type' => 'select',
'#title' => $this
->t('Select Theme'),
'#options' => $themes,
'#empty_option' => $this
->t('Default theme'),
'#empty_value' => '',
'#default_value' => $role['theme'],
];
$form['role_theme_switcher'][$rid]['weight'] = [
'#type' => 'weight',
'#title' => $this
->t('Weight for @title', [
'@title' => $role['name'],
]),
'#title_display' => 'invisible',
'#default_value' => $role['weight'],
'#attributes' => [
'class' => [
'role-order-weight',
],
],
'#delta' => 50,
];
}
return parent::buildForm($form, $form_state);
}
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
}
public function submitForm(array &$form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
$data = [];
foreach (user_role_names() as $rid => $role) {
$data[$rid] = $form_state
->getValue('role_theme_switcher')[$rid];
}
$this
->config('role_theme_switcher.settings')
->set('roles', $data)
->save();
}
private function getUserRoles() {
$values = [];
$config = $this
->config('role_theme_switcher.settings')
->get('roles');
$roles = user_role_names();
foreach ($roles as $rid => $name) {
$values[$rid] = [
'rid' => $rid,
'name' => $name,
'weight' => $config[$rid]['weight'] ? $config[$rid]['weight'] : 0,
'theme' => $config[$rid]['theme'] ? $config[$rid]['theme'] : '',
];
}
uasort($values, [
'Drupal\\Component\\Utility\\SortArray',
'sortByWeightElement',
]);
return $values;
}
private function getThemeList() {
$themes_list = [];
$themes = $this->themeHandler
->listInfo();
foreach ($themes as $theme) {
if (!empty($theme->info['hidden'])) {
continue;
}
$themes_list[$theme
->getName()] = $theme->info['name'];
}
return $themes_list;
}
}