presto-8.x-2.2/src/Form/PrestoConfigureForm.php

src/Form/PrestoConfigureForm.php
<?php

namespace Drupal\presto\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\SubformState;
use Drupal\Core\Render\Element;
use Drupal\presto\Installer\OptionalDependencies\OptionalDependenciesInstaller;
use Drupal\presto\Installer\OptionalDependencies\OptionalDependencyManager;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Defines a form that configures Presto's additional functionality.
 *
 * @package Drupal\presto\Form
 */
class PrestoConfigureForm extends FormBase {

  /**
   * The optional dependency manager.
   *
   * @var \Drupal\presto\Installer\OptionalDependencies\OptionalDependencyManager
   */
  private $optionalDependencyManager;

  /**
   * PrestoConfigureForm constructor.
   *
   * @param \Drupal\presto\Installer\OptionalDependencies\OptionalDependencyManager $manager
   *   The optional dependency manager.
   */
  public function __construct(OptionalDependencyManager $manager) {
    $this->optionalDependencyManager = $manager;
  }

  /**
   * {@inheritdoc}
   *
   * @throws \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
   * @throws \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('plugin.manager.presto.optional_dependencies')
    );
  }

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

  /**
   * {@inheritdoc}
   *
   * @throws \Drupal\Component\Plugin\Exception\PluginException
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['#title'] = $this->t('Configure Presto functionality');

    // Clear any module success messages.
    drupal_get_messages('status');

    // Add configuration forms for optional deps if defined.
    $optionalDeps = $this->optionalDependencyManager->getDefinitions();
    $form['optional_dependencies'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Optional Dependencies'),
      '#collapsible' => FALSE,
      '#tree' => TRUE,
    ];

    $hasOptionalDepsForm = FALSE;
    $form_state->set('optional_dependencies', []);
    foreach ($optionalDeps as $optionalDep) {
      /** @var \Drupal\presto\Installer\OptionalDependencies\OptionalDependencyInterface $instance */
      $instance = $this->optionalDependencyManager->createInstance(
        $optionalDep['id']
      );

      $pluginForm = [];
      $subFormState = SubformState::createForSubform(
        $pluginForm,
        $form,
        $form_state
      );
      $form['optional_dependencies'][$optionalDep['id']] = $instance->buildConfigurationForm(
        $pluginForm,
        $subFormState
      );

      if (count($form['optional_dependencies'][$optionalDep['id']]) > 0) {
        $hasOptionalDepsForm = TRUE;
      }

      $form_state->set(['optional_dependencies', $optionalDep['id']], $instance);
    }

    // Hide optional dependencies fieldset if the config form is empty.
    $form['optional_dependencies']['#access'] = $hasOptionalDepsForm;

    $form['ecommerce'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('eCommerce'),
      '#collapsible' => FALSE,
    ];

    // Only enable commerce if this profile was installed via Composer
    // (which is when the below interface will exist).
    $enableCommerce = FALSE;
    /** @noinspection ClassConstantCanBeUsedInspection */
    if (interface_exists('CommerceGuys\Intl\Currency\CurrencyInterface')) {
      $enableCommerce = TRUE;
    }

    if (!$enableCommerce) {
      $disabledMsg = $this->t('<p><strong>Not supported.</strong></p><p>Unfortunately, eCommerce is only supported if you install Presto via Composer. <a href=":url">See the README for more information on installing via Composer.</a></p>', [
        ':url' => 'https://github.com/Sitback/presto#installing-presto',
      ]);
      $form['ecommerce']['disabled_info'] = [
        '#type' => 'markup',
        '#markup' => $disabledMsg,
      ];
    }

    $form['ecommerce']['enable_ecommerce'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enable eCommerce'),
      '#description' => $this->t(
        'Enables Drupal Commerce and some sane defaults to help you kickstart your eCommerce site.'
      ),
      '#disabled' => !$enableCommerce,
      '#default_value' => $enableCommerce,
    ];

    $form['ecommerce']['ecommerce_install_demo_content'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Install Demo Content'),
      '#description' => $this->t(
        'Creates a few demo products to help you test your new eCommerce site.'
      ),
      '#disabled' => !$enableCommerce,
      '#default_value' => $enableCommerce,
      '#states' => [
        'visible' => [
          'input[name="enable_ecommerce"]' => [
            'checked' => TRUE,
          ],
        ],
        'unchecked' => [
          'input[name="enable_ecommerce"]' => [
            'checked' => FALSE,
          ],
        ],
      ],
    ];

    $form['actions']['#type'] = 'actions';
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Save and continue'),
      '#button_type' => 'primary',
      '#submit' => ['::submitForm'],
    ];

    return $form;
  }

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

    $install_state = $buildInfo['args'];

    // Tell the 'presto_apply_configuration' install task that it should go
    // ahead and enable eCommerce if required.
    $install_state[0]['presto_ecommerce_enabled'] = (bool) $form_state->getValue(
      'enable_ecommerce'
    );
    $install_state[0]['presto_ecommerce_install_demo_content'] = (bool) $form_state->getValue(
      'ecommerce_install_demo_content'
    );
    $install_state[0]['form_state_values'] = $this->value(
      $form_state->getValues()
    );

    // Submit any plugin forms.
    $install_state[0][OptionalDependenciesInstaller::CONFIG_KEY] = [];
    $depConfig =& $install_state[0][OptionalDependenciesInstaller::CONFIG_KEY];
    foreach (Element::children($form['optional_dependencies']) as $dependencyId) {
      /** @var \Drupal\presto\Installer\OptionalDependencies\OptionalDependencyInterface $instance */
      /** @noinspection ReferenceMismatchInspection */
      $instance = $form_state->get(['optional_dependencies', $dependencyId]);

      $subFormState = SubformState::createForSubform(
        $form['optional_dependencies'][$dependencyId],
        $form,
        $form_state
      );

      $instance->submitConfigurationForm($form, $subFormState);
      $depConfig[$dependencyId] = $instance->getConfiguration();
    }

    $buildInfo['args'] = $install_state;

    $form_state->setBuildInfo($buildInfo);
  }

  /**
   * Converts a variable reference to a value.
   *
   * @param mixed $reference
   *   Reference to convert.
   *
   * @return mixed
   *   Value.
   */
  private function value(&$reference) {
    return $reference;
  }

}

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

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