presto-8.x-2.2/src/Installer/Ecommerce/EcommerceInstaller.php

src/Installer/Ecommerce/EcommerceInstaller.php
<?php

namespace Drupal\presto\Installer\Ecommerce;

use Drupal;
use Drupal\presto\Installer\DemoContentManager;
use Drupal\presto\Installer\DemoContentTypes;
use Drupal\presto\Installer\DependencyTypes;
use Drupal\presto\Installer\InstallerInterface;
use Drupal\presto\Mixins\DrupalDependencyInstallerTrait;

/**
 * Presto eCommerce module + content installer.
 *
 * @package Drupal\presto\Installer\Ecommerce
 */
class EcommerceInstaller implements InstallerInterface {

  use DrupalDependencyInstallerTrait;

  /**
   * All eCommerce dependencies.
   *
   * @var array
   */
  private $dependencies = [
    'commerce' => DependencyTypes::MODULE,
    'commerce_order' => DependencyTypes::MODULE,
    'commerce_price' => DependencyTypes::MODULE,
    'commerce_product' => DependencyTypes::MODULE,
    'commerce_cart' => DependencyTypes::MODULE,
    'commerce_checkout' => DependencyTypes::MODULE,
    'commerce_payment' => DependencyTypes::MODULE,
    'commerce_payment_example' => DependencyTypes::MODULE,
    'commerce_promotion' => DependencyTypes::MODULE,
    'commerce_tax' => DependencyTypes::MODULE,
    'commerce_log' => DependencyTypes::MODULE,
    'physical' => DependencyTypes::MODULE,
    'commerce_shipping' => DependencyTypes::MODULE,
  ];

  /**
   * Current install state.
   *
   * @var array
   */
  private $installState;

  /**
   * The demo content creation manager.
   *
   * @var \Drupal\presto\Installer\DemoContentManager
   */
  private $demoContentManager;

  /**
   * PrestoEcommerceInstaller constructor.
   *
   * @param \Drupal\presto\Installer\DemoContentManager $manager
   *   The demo content creation manager.
   * @param array $installState
   *   Current install state.
   */
  public function __construct(
    DemoContentManager $manager,
    array $installState = []
  ) {
    $this->installState = $installState;
    $this->demoContentManager = $manager;
  }

  /**
   * {@inheritdoc}
   */
  public function setInstallState(array $installState) {
    $this->installState = $installState;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function installIfEnabled() {
    $operations = [];

    // Attempt to install modules if we can.
    if ($this->shouldInstallModules()) {
      $operations = array_merge($operations, $this->addDependencyOperations());
    }

    if ($this->shouldInstallDemoContent()) {
      $operations = array_merge($operations, $this->addDemoContentOperations());
    }

    return $operations;
  }

  /**
   * Check if this installer is allowed to install eCommerce modules.
   *
   * @return bool
   *   TRUE if allowed, FALSE otherwise.
   */
  private function shouldInstallModules() {
    if (!array_key_exists('presto_ecommerce_enabled', $this->installState)) {
      return FALSE;
    }
    return (bool) $this->installState['presto_ecommerce_enabled'];
  }

  /**
   * Check if we should create demo content too.
   *
   * @return bool
   *   TRUE if allowed, FALSE otherwise.
   */
  private function shouldInstallDemoContent() {
    if (!array_key_exists('presto_ecommerce_install_demo_content', $this->installState)) {
      return FALSE;
    }
    $create = (bool) $this->installState['presto_ecommerce_install_demo_content'];
    return $this->shouldInstallModules() && $create;
  }

  /**
   * Crates a set of batch operations to install all required dependencies.
   *
   * @return array
   *   A set of Drupal batch operations.
   */
  private function addDependencyOperations() {
    $operations = [];

    foreach ($this->dependencies as $module => $type) {
      $operations[] = [
        [static::class, 'installDependency'],
        [
          $module,
          $type,
        ],
      ];
    }

    return $operations;
  }

  /**
   * Crates a set of batch operations to create demo content.
   *
   * @return array
   *   A set of Drupal batch operations.
   */
  private function addDemoContentOperations() {
    $operations = [];

    $contentDefs = $this->demoContentManager->getFilteredDefinitions(
      DemoContentTypes::ECOMMERCE
    );

    // Add module install task to install our commerce exports module.
    $operations[] = [
      [static::class, 'installDependency'],
      [
        'presto_commerce',
        DependencyTypes::MODULE,
      ],
    ];

    // Run any further content tasks.
    foreach ($contentDefs as $def) {
      $operations[] = [
        [static::class, 'createDemoContent'],
        [$def['id']],
      ];
    }

    return $operations;
  }

  /**
   * Creates a demo content item.
   *
   * This is a Drupal batch callback operation and as such, needs to be both a
   * public and a static function so that the Batch API can access it outside
   * the context of this class.
   *
   * @param string $pluginId
   *   Demo content class plugin ID.
   * @param array $context
   *   Batch context.
   *
   * @throws \Drupal\Component\Plugin\Exception\PluginException
   */
  public static function createDemoContent($pluginId, array &$context) {
    // Reset time limit so we don't timeout.
    drupal_set_time_limit(0);

    // Needs to be resolved manually since we don't have a context.
    /** @var \Drupal\presto\Installer\DemoContentManager $demoContentManager */
    $demoContentManager = Drupal::service(
      'plugin.manager.presto.demo_content'
    );

    $definition = $demoContentManager->getDefinition($pluginId);
    /** @var \Drupal\Core\StringTranslation\TranslatableMarkup $label */
    $label = $definition['label'];

    /** @var \Drupal\presto\Plugin\Presto\DemoContent\AbstractDemoContent $instance */
    $instance = $demoContentManager->createInstance($pluginId);
    $instance->createContent();

    $context['results'][] = $pluginId;
    $context['message'] = t('Running %task_name', [
      '%task_name' => lcfirst($label->render()),
    ]);
  }

}

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

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