entity_activity-8.x-1.0-beta13/src/Form/GeneratorForm.php

src/Form/GeneratorForm.php
<?php

namespace Drupal\entity_activity\Form;

use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Extension\ThemeHandlerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\SubformState;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Plugin\Context\ContextRepositoryInterface;
use Drupal\Core\Plugin\PluginFormFactoryInterface;
use Drupal\entity_activity\Plugin\LogGeneratorManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class GeneratorForm.
 */
class GeneratorForm extends EntityForm {

  /**
   * A logger instance.
   *
   * @var \Psr\Log\LoggerInterface
   */
  protected $logger;

  /**
   * The generator entity.
   *
   * @var \Drupal\entity_activity\Entity\GeneratorInterface
   */
  protected $entity;

  /**
   * The log generator plugin manager.
   *
   * @var \Drupal\entity_activity\Plugin\LogGeneratorManagerInterface
   */
  protected $manager;

  /**
   * The event dispatcher service.
   *
   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
   */
  protected $dispatcher;

  /**
   * The language manager service.
   *
   * @var \Drupal\Core\Language\LanguageManagerInterface
   */
  protected $language;

  /**
   * The theme handler.
   *
   * @var \Drupal\Core\Extension\ThemeHandler
   */
  protected $themeHandler;

  /**
   * The context repository service.
   *
   * @var \Drupal\Core\Plugin\Context\ContextRepositoryInterface
   */
  protected $contextRepository;

  /**
   * The plugin form manager.
   *
   * @var \Drupal\Core\Plugin\PluginFormFactoryInterface
   */
  protected $pluginFormFactory;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('logger.factory')->get('asset_injector'),
      $container->get('plugin.manager.log_generator'),
      $container->get('context.repository'),
      $container->get('language_manager'),
      $container->get('theme_handler'),
      $container->get('plugin_form.factory')
    );
  }

  /**
   * GeneratorFormBase constructor.
   *
   * @param \Psr\Log\LoggerInterface $logger
   *   A logger instance.
   * @param \Drupal\entity_activity\Plugin\LogGeneratorManagerInterface $log_generator_manager
   *   The LogGeneratorManager for building the generators UI.
   * @param \Drupal\Core\Plugin\Context\ContextRepositoryInterface $context_repository
   *   The lazy context repository service.
   * @param \Drupal\Core\Language\LanguageManagerInterface $language
   *   The language manager.
   * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
   *   The theme handler.
   * @param \Drupal\Core\Plugin\PluginFormFactoryInterface $plugin_form_manager
   *   The plugin form manager.
   */
  public function __construct(LoggerInterface $logger, LogGeneratorManagerInterface $log_generator_manager, ContextRepositoryInterface $context_repository, LanguageManagerInterface $language, ThemeHandlerInterface $theme_handler, PluginFormFactoryInterface $plugin_form_manager) {
    $this->logger = $logger;
    $this->manager = $log_generator_manager;
    $this->contextRepository = $context_repository;
    $this->language = $language;
    $this->themeHandler = $theme_handler;
    $this->pluginFormFactory = $plugin_form_manager;
  }

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

    $form['#tree'] = TRUE;

    /** @var \Drupal\entity_activity\Entity\GeneratorInterface $entity */
    $entity = $this->entity;

    $form['label'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Label'),
      '#maxlength' => 255,
      '#default_value' => $entity->label(),
      '#description' => $this->t("Label for the Generator."),
      '#required' => TRUE,
    ];

    $form['id'] = [
      '#type' => 'machine_name',
      '#default_value' => $entity->id(),
      '#machine_name' => [
        'exists' => '\Drupal\entity_activity\Entity\Generator::load',
      ],
      '#disabled' => !$entity->isNew(),
    ];

    $form['generators'] = $this->buildLogGeneratorsInterface([], $form_state);
    $form['generators']['#weight'] = 99;

    // $form['status'] = [];.
    return $form;
  }

  /**
   * Helper function for building the generators UI form.
   *
   * @param array $form
   *   An associative array containing the structure of the form.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The current state of the form.
   *
   * @return array
   *   The form array with the generators UI added in.
   *
   * @throws \Drupal\Component\Plugin\Exception\PluginException
   */
  protected function buildLogGeneratorsInterface(array $form, FormStateInterface $form_state) {
    $form['generators_tabs'] = [
      '#type' => 'vertical_tabs',
      '#title' => $this->t('Generators'),
      '#parents' => ['generators_tabs'],
      '#attached' => [
        'library' => [
          'entity_activity/admin',
        ],
      ],
    ];

    $log_generators = $this->entity->getLogGenerators();
    $log_generators_definitions = $this->manager->getDefinitions();
    $log_generators_definitions = $this->manager->removeExcludeDefinitions($log_generators_definitions);
    foreach ($log_generators_definitions as $log_generator_id => $definition) {

      $log_generator_config = isset($log_generators[$log_generator_id]) ? $log_generators[$log_generator_id] : [];
      /** @var \Drupal\entity_activity\Plugin\LogGeneratorInterface $log_generator */
      $log_generator = $this->manager->createInstance($log_generator_id, $log_generator_config);
      $form_state->set(['generators', $log_generator_id], $log_generator);
      $log_generator_form = $log_generator->buildConfigurationForm([], $form_state);
      $log_generator_form['#type'] = 'details';
      $log_generator_form['#title'] = $log_generator->getPluginDefinition()['label'];
      $log_generator_form['#group'] = 'generators_tabs';

      $form[$log_generator_id] = $log_generator_form;
    }

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function actionsElement(array $form, FormStateInterface $form_state) {
    $element = parent::actionsElement($form, $form_state);
    $element['saveContinue'] = [
      '#type' => 'submit',
      '#value' => $this->t('Save and Continue Editing'),
      '#name' => 'save_continue',
      '#submit' => ['::submitForm', '::save'],
      '#weight' => 7,
    ];
    return $element;
  }

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

    $generators = $form_state->getValue('generators');
    // Validate generators log generator settings.
    foreach ($generators as $log_generator_id => &$values) {
      // Allow the log generator to validate the form.
      $log_generator = $form_state->get(['generators', $log_generator_id]);
      $log_generator->validateConfigurationForm($form['generators'][$log_generator_id], SubformState::createForSubform($form['generators'][$log_generator_id], $form, $form_state));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    parent::submitForm($form, $form_state);
    $generators = $form_state->getValue('generators');
    foreach ($form_state->getValue('generators') as $log_generator_id => $values) {
      // Allow the log generator to submit the form.
      $log_generator = $form_state->get(['generators', $log_generator_id]);
      $log_generator->submitConfigurationForm($form['generators'][$log_generator_id], SubformState::createForSubform($form['generators'][$log_generator_id], $form, $form_state));
      $log_generator_configuration = $log_generator->getConfiguration();
      // Update the log generators generators on the entity.
      $this->entity->getLogGeneratorsCollection()
        ->addInstanceId($log_generator_id, $log_generator_configuration);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function save(array $form, FormStateInterface $form_state) {
    $entity = $this->entity;
    $status = $entity->save();

    switch ($status) {
      case SAVED_NEW:
        $this->messenger()->addMessage($this->t('Created the %label Generator.', [
          '%label' => $entity->label(),
        ]));
        break;

      default:
        $this->messenger()->addMessage($this->t('Saved the %label Generator.', [
          '%label' => $entity->label(),
        ]));
    }
    $trigger = $form_state->getTriggeringElement();
    if (isset($trigger['#name']) && $trigger['#name'] != 'save_continue') {
      $form_state->setRedirectUrl($entity->toUrl('collection'));
    }
    else {
      $form_state->setRedirectUrl($entity->toUrl());
    }
  }

}

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

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