View source
<?php
namespace Drupal\layout_builder_restrictions\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\layout_builder_restrictions\Plugin\LayoutBuilderRestrictionManager;
use Drupal\Core\Config\ConfigManager;
class RestrictionPluginConfigForm extends FormBase {
protected $pluginManagerLayoutBuilderRestriction;
protected $configManager;
public function __construct(LayoutBuilderRestrictionManager $plugin_manager_layout_builder_restriction, ConfigManager $config_manager) {
$this->pluginManagerLayoutBuilderRestriction = $plugin_manager_layout_builder_restriction;
$this->configManager = $config_manager;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('plugin.manager.layout_builder_restriction'), $container
->get('config.manager'));
}
public function getFormId() {
return 'restriction_plugin_config_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$plugin_list = $this->pluginManagerLayoutBuilderRestriction
->getSortedPlugins(TRUE);
$form['plugin-table'] = [
'#type' => 'table',
'#header' => [
$this
->t('Plugin'),
$this
->t('ID'),
$this
->t('Enabled'),
$this
->t('Weight'),
],
'#empty' => $this
->t('There are no restriction plugins defined.'),
'#tabledrag' => [
[
'action' => 'order',
'relationship' => 'sibling',
'group' => 'plugin-table-order-weight',
],
],
'#prefix' => '<p>Set the order the Layout Builder Restriction plugins should be called, and enable or disable as needed.</p>',
];
foreach ($plugin_list as $id => $data) {
$form['plugin-table'][$id]['#attributes']['class'][] = 'draggable';
$form['plugin-table'][$id]['#weight'] = $data['weight'];
if ($data['description']) {
$form['plugin-table'][$id]['title'] = [
'#markup' => '<strong>' . $data['title'] . '</strong><br>' . $data['description'],
];
}
else {
$form['plugin-table'][$id]['title'] = [
'#markup' => '<strong>' . $data['title'] . '</strong>',
];
}
$form['plugin-table'][$id]['id'] = [
'#plain_text' => $id,
];
$form['plugin-table'][$id]['enabled'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Enabled'),
'#title_display' => 'invisible',
'#default_value' => $data['enabled'],
'#attributes' => [
'class' => [
'plugin-table-enabled',
],
],
];
$form['plugin-table'][$id]['weight'] = [
'#type' => 'weight',
'#title' => $this
->t('Weight for @title', [
'@title' => $id,
]),
'#title_display' => 'invisible',
'#default_value' => $data['weight'],
'#attributes' => [
'class' => [
'plugin-table-order-weight',
],
],
];
}
$form['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Save configuration'),
];
return $form;
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$data_to_save = [];
$restriction_definitions = $this->pluginManagerLayoutBuilderRestriction
->getDefinitions();
foreach ($form_state
->getValue('plugin-table') as $plugin_id => $vals) {
if (isset($restriction_definitions[$plugin_id])) {
$data_to_save[$plugin_id] = [
'weight' => (int) $vals['weight'],
'enabled' => (bool) $vals['enabled'],
];
}
}
$plugin_weighting_config = $this
->configFactory()
->getEditable('layout_builder_restrictions.plugins');
$plugin_weighting_config
->set('plugin_config', $data_to_save);
$plugin_weighting_config
->save();
}
}