View source
<?php
namespace Drupal\responsive_menus\Form;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\responsive_menus\ResponsiveMenusPluginManager;
use Symfony\Component\DependencyInjection\ContainerInterface;
class ResponsiveMenusAdminForm extends ConfigFormBase {
protected $pluginManager;
public function __construct(ConfigFactoryInterface $config_factory, ResponsiveMenusPluginManager $plugin_manager) {
parent::__construct($config_factory);
$this->pluginManager = $plugin_manager;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('config.factory'), $container
->get('plugin.manager.responsive_menus'));
}
public function getFormId() {
return 'responsive_menus_admin_form';
}
protected function getEditableConfigNames() {
return [
'responsive_menus.configuration',
];
}
public function buildForm(array $form, FormStateInterface $form_state) {
$config = $this
->config('responsive_menus.configuration');
$styles = $this->pluginManager
->getDefinitions();
$style_options = [];
foreach ($styles as $style => $values) {
$style_options[$style] = $values['label'];
}
$current_style = $config
->get('style');
if (!empty($form_state
->getValue('responsive_menus_style'))) {
$current_style = $form_state
->getValue('responsive_menus_style');
}
$form['responsive_menus_ignore_admin'] = [
'#type' => 'checkbox',
'#title' => 'Ignore admin pages?',
'#default_value' => $config
->get('ignore_admin'),
];
$style_plugin = $this->pluginManager
->createInstance($current_style, [
'settings' => $config
->get('style_settings'),
]);
$form['responsive_menus_style'] = [
'#type' => 'select',
'#title' => $this
->t('Responsive menu style'),
'#options' => $style_options,
'#default_value' => $current_style,
'#ajax' => [
'callback' => '::ajax',
'wrapper' => 'rm-style-options',
'method' => 'replace',
'effect' => 'fade',
],
];
$form['responsive_menus_style_settings'] = [
'#title' => $this
->t('Style settings'),
'#description' => $this
->t('Settings for chosen menu style.'),
'#prefix' => '<div id="rm-style-options">',
'#suffix' => '</div>',
'#type' => 'detail',
'#tree' => TRUE,
];
if (!empty($style_plugin
->getSelectorInfo())) {
$form['responsive_menus_style_settings']['selector_info'] = [
'#type' => 'item',
'#title' => $this
->t('Selector(s) to use for this style:'),
'#markup' => '<div class="messages status">' . $style_plugin
->getSelectorInfo() . '</div>',
];
}
foreach ($style_plugin
->settingsForm([], $form_state) as $name => $element) {
$form['responsive_menus_style_settings'][$name] = $element;
}
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Save configuration'),
];
return parent::buildForm($form, $form_state);
}
public function ajax(array &$form, FormStateInterface $form_state) {
return $form['responsive_menus_style_settings'];
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$values = $form_state
->getValues();
$this
->config('responsive_menus.configuration')
->set('style', $values['responsive_menus_style'])
->set('ignore_admin', $values['responsive_menus_ignore_admin'])
->set('style_settings', $values['responsive_menus_style_settings'])
->save();
$this
->messenger()
->addMessage($this
->t('The configuration options have been saved.'));
parent::submitForm($form, $form_state);
}
}