navigation_extra-1.0.x-dev/src/Form/SettingsForm.php

src/Form/SettingsForm.php
<?php

declare(strict_types=1);

namespace Drupal\navigation_extra\Form;

use Drupal\Component\Plugin\Exception\PluginException;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Menu\MenuLinkManagerInterface;
use Drupal\navigation_extra\NavigationExtraPluginManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Settings form for navigation extra.
 *
 * @package Drupal\navigation_extra\Form
 */
class SettingsForm extends ConfigFormBase {

  /**
   * Constructs a navigation extra SettingsForm object.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
   *   The factory for configuration objects.
   * @param \Drupal\Core\Config\TypedConfigManagerInterface|null $typedConfigManager
   *   The typed config manager.
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler
   *   The module handler service.
   * @param \Drupal\navigation_extra\NavigationExtraPluginManagerInterface $pluginManager
   *   The navigation extra plugin manager.
   * @param \Drupal\Core\Menu\MenuLinkManagerInterface $menuLinkManager
   *   The menu link manager.
   */
  public function __construct(
    ConfigFactoryInterface $configFactory,
    $typedConfigManager,
    protected ModuleHandlerInterface $moduleHandler,
    protected NavigationExtraPluginManagerInterface $pluginManager,
    protected MenuLinkManagerInterface $menuLinkManager,
  ) {
    parent::__construct($configFactory, $typedConfigManager);
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('config.factory'),
      $container->get('config.typed'),
      $container->get('module_handler'),
      $container->get('navigation_extra.manager'),
      $container->get('plugin.manager.menu.link')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId(): string {
    return 'navigation_extra_settings';
  }

  /**
   * {@inheritdoc}
   */
  protected function getEditableConfigNames(): array {
    return [
      'navigation_extra.settings',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state): array {
    $form = parent::buildForm($form, $form_state);

    $form['#attached']['library'][] = 'core/drupal.vertical-tabs';

    $form['tabs'] = [
      '#type' => 'vertical_tabs',
    ];

    $plugins = $this->pluginManager->getDefinitions();
    foreach ($plugins as $plugin_id => $definition) {
      try {
        /** @var \Drupal\navigation_extra\NavigationExtraPluginInterface $plugin */
        $plugin = $this->pluginManager->createInstance($plugin_id, $definition);

        // Plugin tab.
        $form['tabs'][$plugin_id] = [
          '#type' => 'details',
          '#title' => $definition['name'],
          '#group' => 'tabs',
          '#tree' => TRUE,
        ];

        // Plugin specific settings.
        $form['tabs'][$plugin_id] = $plugin->buildConfigForm($form, $form_state) + (array) $form['tabs'][$plugin_id];

        foreach ($form['tabs'][$plugin_id] as $key => &$field) {
          if ($key[0] === '#' || $key === 'enabled' || $field['#type'] == 'hidden' || $plugin_id == 'common') {
            continue;
          }

          // Automatically hide all config for a plugin if it is not enabled.
          $states = $field['#states'] ?? [];

          if (empty($states['visible'])) {
            $states['visible'] = [
              [
                ':input[name="' . $plugin_id . '[enabled]"]' => ['checked' => TRUE],
              ],
            ];
          }
          else {
            $states['visible'][0][':input[name="' . $plugin_id . '[enabled]"]'] = ['checked' => TRUE];
          }

          $field['#states'] = $states;

        }

      }
      catch (PluginException) {
        // Silently continue if plugin is not found.
      }
    }

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state): void {

    // Prepare values.
    $plugins = $this->pluginManager->getDefinitions();
    foreach ($plugins as $plugin_id => $definition) {
      /** @var \Drupal\navigation_extra\NavigationExtraPluginInterface $plugin */
      try {
        $plugin = $this->pluginManager->createInstance($plugin_id, $definition);
        $plugin->submitConfigForm($form, $form_state);
      }
      catch (PluginException) {
        // Continue silently.
      }
    }

    $form_state->addCleanValueKey('tabs__active_tab');
    $form_state->cleanValues();

    $values = $form_state->getValues();

    // Move submitted plugin values into the 'plugins' key.
    $values['plugins'] = [];
    $plugins = $this->pluginManager->getDefinitions();
    foreach ($plugins as $plugin_id => $definition) {
      $values['plugins'][$plugin_id] = $values[$plugin_id];
      unset($values[$plugin_id]);
    }

    // Save the config.
    $config = $this->config('navigation_extra.settings');
    $config->setData($values);
    $config->save();

    // Clear cache so admin menu can rebuild.
    $this->menuLinkManager->rebuild();

    parent::submitForm($form, $form_state);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc