adva-8.x-1.0-rc9/src/Form/SettingsForm.php

src/Form/SettingsForm.php
<?php

namespace Drupal\adva\Form;

use Drupal\adva\Batch\ConsumerAccessRebuildBatchInterface;
use Drupal\adva\Plugin\adva\Manager\AccessConsumerManagerInterface;

use Drupal\adva\Plugin\adva\Manager\AccessProviderManagerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;

use Drupal\Core\Form\SubformState;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Advanced Access Control Settings form.
 */
class SettingsForm extends ConfigFormBase {

  /**
   * Access Consumer being updated.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * Access Consumer manager Service.
   *
   * @var \Drupal\adva\Plugin\adva\Manager\AccessConsumerManagerInterface
   */
  protected $accessConsumerManager;

  /**
   * Access Consumer manager Service.
   *
   * @var \Drupal\adva\Plugin\adva\Manager\AccessProviderManagerInterface
   */
  protected $accessProviderManager;

  /**
   * The access rebuild batch service.
   */
  protected ConsumerAccessRebuildBatchInterface $consumerAccessRebuildBatch;

  /**
   * Create an instance of the Form.
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_manager
   *   Current Entity Type manager.
   * @param \Drupal\adva\Plugin\adva\Manager\AccessConsumerManagerInterface $consumer_manager
   *   Access Consumer Manager.
   * @param \Drupal\adva\Plugin\adva\Manager\AccessProviderManagerInterface $provider_manager
   *   Access Provider Manager.
   */
  public function __construct(
    EntityTypeManagerInterface $entity_manager,
    AccessConsumerManagerInterface $consumer_manager,
    AccessProviderManagerInterface $provider_manager,
    ConsumerAccessRebuildBatchInterface $consumer_access_rebuild_batch
  ) {
    $this->entityTypeManager = $entity_manager;
    $this->accessConsumerManager = $consumer_manager;
    $this->accessProviderManager = $provider_manager;
    $this->consumerAccessRebuildBatch = $consumer_access_rebuild_batch;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('entity_type.manager'),
      $container->get('plugin.manager.adva.consumer'),
      $container->get('plugin.manager.adva.provider'),
      $container->get('adva.batch.consumer_access_rebuild')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getEditableConfigNames() {
    return ["adva.settings"];
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'adva_settings';
  }

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

    $consumers = $this->accessConsumerManager->getConsumers();

    foreach ($consumers as $consumer_id => $consumer) {
      $entityType = $this->entityTypeManager->getDefinition($consumer->getEntityTypeId());
      $context = [
        "%entity_type" => $entityType->getLabel(),
      ];
      $form["consumers"][$consumer_id] = [
        "#type" => "details",
        "#title" => $this->t("Configure Access For %entity_type", $context),
        "#open" => TRUE,
      ];

      $availableProviders = $this->accessProviderManager->getAvailableProvidersForEntityType($entityType);
      $providers = $consumer->getAccessProviders();
      $form["consumers"][$consumer_id]["providers"] = [
        "#type" => "checkboxes",
        "#title" => $this->t("Enabled Types"),
        "#description" => $this->t("Which Access Providers should be enabled for %entity_type entities?", $context),
        "#parents" => ["consumers", $consumer_id, "providers"],
      ];

      $provider_options = [];
      $default_options = [];

      $form["consumers"][$consumer_id]["config"] = [
        "#type" => "item",
        "#parents" => ["consumers", $consumer_id, "config"],
      ];
      $form["consumers"][$consumer_id]["config"]["providers"] = [
        "#type" => "item",
        "#parents" => ["consumers", $consumer_id, "config", "providers"],
      ];

      // Construct ui to configure providers for the given consumer.
      foreach ($availableProviders as $provider_id => $provider_definition) {
        $provider_options[$provider_id] = $provider_definition["label"];
        if (array_key_exists($provider_id, $providers)) {
          $default_options[] = $provider_id;
          $provider = $providers[$provider_id];
          $form["consumers"][$consumer_id]["config"]["providers"][$provider_id] = [
            "#type" => "details",
            "#title" => $provider_definition["label"],
            "#parents" => [
              "consumers",
              $consumer_id,
              "config",
              "providers",
              $provider_id,
            ],
            "#states" => [
              "visible" => [
                '[name="consumers[' . $consumer_id . '][providers][' . $provider_id . ']"' => ["checked" => TRUE],
              ],
            ],
          ];
          $subform_state = SubformState::createForSubform($form["consumers"][$consumer_id]["config"]["providers"][$provider_id], $form, $form_state);
          $form["consumers"][$consumer_id]["config"]["providers"][$provider_id] = $provider->buildConfigForm($form["consumers"][$consumer_id]["config"]["providers"][$provider_id], $subform_state);
        }
      }
      $form["consumers"][$consumer_id]["providers"]["#options"] = $provider_options;
      $form["consumers"][$consumer_id]["providers"]["#default_value"] = $default_options;

      // If there are no supported providers for the consumer, display message.
      if (!count($availableProviders)) {
        $form["consumers"][$consumer_id]["#open"] = FALSE;
        $form["consumers"][$consumer_id]["providers"]["#access"] = FALSE;
        $form["consumers"][$consumer_id]["message"] = [
          "#type" => "item",
          "#title" => $this->t("Enabled Types"),
          "#markup" => $this->t("There are no available Access Providers for <em>%entity_type</em> entites.", $context),
        ];
      }
    }

    $form['actions'] = ['#type' => 'actions'];
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Save'),
      '#button_type' => 'primary',
    ];
    // Add a batch action that saves changes and processes the rebuilding of all
    // access records.
    $form['actions']['batch'] = [
      '#type' => 'submit',
      '#value' => $this->t('Save and Update Access Records'),
      '#submit' => [
        '::submitForm',
        '::triggerBatch',
      ],
    ];

    $form['#attached']['library'] = ['adva/form.admin'];

    $form['helpers'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Provider Details'),
    ];

    foreach ($this->accessProviderManager->getDefinitions() as $definition_id => $definition) {
      $provider_class = $this->accessProviderManager->getDefinitionClass($definition_id, $definition);
      $form['helpers'][$definition_id] = [
        '#type' => 'details',
        '#title' => $definition['label'],
        'message' => [
          '#type' => 'item',
          '#markup' => $provider_class::getHelperMessage($definition),
        ],
      ];
    }

    $form['submit_text'] = [
      '#markup' => '<em>' . $this->t('On save, all affected access records are deleted and automatically created over time. To create them immediately, choose "Save and Update Access Records".') . '</em>',
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $values = $form_state->getValues();

    $consumers = $this->accessConsumerManager->getConsumers();

    // Run validation of consumers and providers.
    foreach ($consumers as $consumer_id => $consumer) {
      $data = $values["consumers"][$consumer_id] ?: [];
      $providerIds = $data["providers"];
      $consumer->setAccessProviderIds(array_filter($providerIds));
      $providers = $consumer->getAccessProviders();

      foreach ($providerIds as $provider_id) {
        if (isset($form["consumers"][$consumer_id]["config"]["providers"][$provider_id])) {
          $subform_state = SubformState::createForSubform($form["consumers"][$consumer_id]["config"]["providers"][$provider_id], $form, $form_state);
          $providers[$provider_id]->validateConfigForm($form["consumers"][$consumer_id]["config"]["providers"][$provider_id], $subform_state);
        }
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $values = $form_state->getValues();

    $consumers = $this->accessConsumerManager->getConsumers();

    // Update per comsumer config.
    foreach ($consumers as $consumer_id => $consumer) {
      $data = $values["consumers"][$consumer_id] ?: [];
      $providerIds = $data["providers"];
      $consumer->setAccessProviderIds(array_filter($providerIds));
      $providers = $consumer->getAccessProviders();

      foreach ($providerIds as $provider_id) {
        if (isset($form["consumers"][$consumer_id]["config"]["providers"][$provider_id])) {
          $subform_state = SubformState::createForSubform($form["consumers"][$consumer_id]["config"]["providers"][$provider_id], $form, $form_state);
          $providers[$provider_id]->submitConfigForm($form["consumers"][$consumer_id]["config"]["providers"][$provider_id], $subform_state);
        }
      }
    }

    // Save the consumer configs. We don't have any specific config right now.
    $this->accessConsumerManager->saveConsumers();

    $this->messenger()->addMessage($this->t("Advanced Access configuration updated."));
  }

  /**
   * Processes queued access records for all entity types via the batch API.
   */
  public function triggerBatch(array &$form, FormStateInterface $form_state) {
    $consumers = $this->accessConsumerManager->getOverrideConsumers();
    foreach ($consumers as $consumer) {
      $this->consumerAccessRebuildBatch->createBatch($consumer);
    }
  }

}

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

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