cms_content_sync-3.0.x-dev/modules/cms_content_sync_migrate_acquia_content_hub/src/Form/MigratePull.php

modules/cms_content_sync_migrate_acquia_content_hub/src/Form/MigratePull.php
<?php

namespace Drupal\cms_content_sync_migrate_acquia_content_hub\Form;

use Drupal\acquia_contenthub\EntityManager;
use Drupal\acquia_contenthub_subscriber\Entity\ContentHubFilter;
use Drupal\cms_content_sync\Controller\FlowControllerSimple;
use Drupal\cms_content_sync\Entity\Flow;
use Drupal\cms_content_sync\Entity\Pool;
use Drupal\cms_content_sync\PullIntent;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeManager;
use Drupal\Core\Extension\ModuleHandler;
use Drupal\Core\Field\FieldTypePluginManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;

/**
 * Migrate a Acquia Content Hub Filter to Content Sync.
 */
class MigratePull extends MigrationBase {

  /**
   * {@inheritdoc}
   */
  public function __construct(EntityManager $acquia_entity_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info, FieldTypePluginManagerInterface $field_type_plugin_manager, ConfigFactoryInterface $config_factory, ModuleHandler $moduleHandler, EntityTypeManager $entity_type_manager) {
    parent::__construct($acquia_entity_manager, $entity_type_bundle_info, $field_type_plugin_manager, $config_factory, $moduleHandler, $entity_type_manager);
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'cms_content_sync_migrate_acquia_content_hub.migrate_pull';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, $content_hub_filter_id = NULL) {
    // @todo Is it possible to load the argument within the constructer?
    $this->content_hub_filter_id = $content_hub_filter_id;
    $this->migrationType = 'pull';

    $content_hub_filter = $this->entityTypeManager
      ->getStorage('contenthub_filter')
      ->load($this->content_hub_filter_id);

    $this->content_hub_filter = $content_hub_filter;

    $publish_setting = $this->content_hub_filter->publish_setting;
    $from_date = $this->content_hub_filter->from_date;
    $to_date = $this->content_hub_filter->to_date;
    $sources = $this->content_hub_filter->source;
    $content_hub_entity_types = $content_hub_filter->getEntityTypes();
    $content_hub_bundles = $content_hub_filter->getBundles();

    if ('none' != $publish_setting) {
      \Drupal::messenger()->addMessage($this->t('Be aware that Content Sync does not support the Acquia Content Hub settings for: "Publish Setting" (Sets the Publish setting for this filter.), which is currently configured as "@value"', ['@value' => $publish_setting]), 'warning');
    }
    if ('' != $from_date || '' != $to_date) {
      \Drupal::messenger()->addMessage($this->t('Be aware that Content Sync does not support the Acquia Content Hub settings for: "Date From" (Date starting from) | "Date To" (Date until), which are currently configured as Date From: "@date_from_value" and Date To: "@date_to_value"', [
        '@date_from_value' => $from_date,
        '@date_to_value' => $to_date,
      ]), 'warning');
    }
    if ('' != $sources) {
      \Drupal::messenger()->addMessage($this->t('Be aware that Content Sync does not support the Acquia Content Hub settings for: "Sources" (Source origin site UUIDs, delimited by comma ",".), which is currently configured as @value', ['@value' => $sources]), 'warning');
    }
    if (empty($content_hub_entity_types)) {
      \Drupal::messenger()->addMessage($this->t('Since none entity types have been configured within this Acquia Content Hub filter, no entity types will be configured for this pull flow.'));
    }
    if (empty($content_hub_bundles)) {
      \Drupal::messenger()->addMessage($this->t('Since none bundles have been configured within this Acquia Content Hub filter, no bundles will be configured for this pull flow.'));
    }

    $form = parent::buildForm($form, $form_state);

    $url = Url::fromUri('https://support.content-sync.io/support/solutions/articles/80000818292-update-behaviors');
    $link = Link::fromTextAndUrl(t('here'), $url);
    $link = $link->toRenderable();
    $link['#attributes'] = ['class' => ['external']];
    $link = \Drupal::service('renderer')->render($link);

    $form['pull_updates_behavior'] = [
      '#title' => $this->t('Pull updates behavior'),
      '#description' => $this->t('This configuration allows to define the pull updates behaviors. Further information could be found @link.', [
        '@link' => $link,
      ]),
      '#type' => 'select',
      '#options' => [
        PullIntent::PULL_UPDATE_FORCE_AND_FORBID_EDITING => $this->t('Forbid local changes and update'),
        PullIntent::PULL_UPDATE_FORCE_UNLESS_OVERRIDDEN => $this->t('Update unless overridden locally'),
        PullIntent::PULL_UPDATE_FORCE => $this->t('Dismiss local changes'),
        PullIntent::PULL_UPDATE_IGNORE => $this->t('Ignore updates completely'),
      ],
      '#default_value' => PullIntent::PULL_UPDATE_FORCE_AND_FORBID_EDITING,
    ];

    return $form;
  }

  /**
   * Create the CMS Content Hub pull flow for the content hub filter.
   *
   * @param string $pool_id
   *   The Content Sync Pools ID.
   * @param string $pull_updates_behavior
   *   The Content Hub update behavior.
   * @param \Drupal\acquia_contenthub_subscriber\Entity\ContentHubFilter $content_hub_filter
   *   The Content Hub Filter.
   * @param bool $force_update
   *   The Content Sync Force Update option.
   * @param array $override
   *   The Content Sync Override option.
   *
   * @return mixed|string
   *   Returns flow_id, flow_configurations and flow type = pull.
   */
  public static function createFlow($pool_id, $pull_updates_behavior, ContentHubFilter $content_hub_filter, $force_update = FALSE, ?array $override = NULL) {
    $configurations = [];

    $setup = FlowControllerSimple::createFlow(Flow::TYPE_PULL, $content_hub_filter->label(), $content_hub_filter->id() . '_migrated', TRUE, [$pool_id], [
      'config' => [
        'cms_content_sync.pool.' . $pool_id,
      ],
    ], $force_update);
    $setup->setUpdateBehavior($pull_updates_behavior);

    // Since Acquia does not save the relation between entity types and bundles
    // we need to take care of the mapping.
    $content_hub_entity_types = $content_hub_filter->getEntityTypes();
    $content_hub_bundles = $content_hub_filter->getBundles();
    $tags = MigrationBase::getTermsFromFilter($content_hub_filter->tags);

    foreach ($content_hub_entity_types as $content_hub_entity_type) {
      $entity_type_bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo($content_hub_entity_type);

      foreach ($content_hub_bundles as $content_hub_bundle_key => $content_hub_bundle) {
        if (array_key_exists($content_hub_bundle, $entity_type_bundles)) {
          // General configurations.
          $configurations[$content_hub_entity_type][$content_hub_bundle]['import_configuration'] = [
            'import_deletion' => TRUE,
            'allow_local_deletion_of_import' => TRUE,
            'import_updates' => $pull_updates_behavior,
          ];

          // Pool configuration.
          $configurations[$content_hub_entity_type][$content_hub_bundle]['import_configuration']['import_pools'][$pool_id] = Pool::POOL_USAGE_FORCE;

          // Import everything beside nodes as dependencies but allow overrides.
          if (isset($override[$content_hub_entity_type][$content_hub_bundle]['import_configuration']['behavior'])) {
            $configurations[$content_hub_entity_type][$content_hub_bundle]['import_configuration']['behavior'] = $override[$content_hub_entity_type][$content_hub_bundle]['import_configuration']['behavior'];
            $setup->enableBundle($content_hub_entity_type, $content_hub_bundle, PullIntent::PULL_AS_DEPENDENCY === $override[$content_hub_entity_type][$content_hub_bundle]['import_configuration']['behavior']);
          }
          elseif ('node' == $content_hub_entity_type) {
            $configurations[$content_hub_entity_type][$content_hub_bundle]['import_configuration']['behavior'] = PullIntent::PULL_AUTOMATICALLY;
            $setup->enableBundle($content_hub_entity_type, $content_hub_bundle, FALSE, $tags);
            if (!empty($tags)) {
              $configurations[$content_hub_entity_type][$content_hub_bundle]['tags'] = $tags;
            }
          }
          else {
            $configurations[$content_hub_entity_type][$content_hub_bundle]['import_configuration']['behavior'] = PullIntent::PULL_AS_DEPENDENCY;
            $setup->enableBundle($content_hub_entity_type, $content_hub_bundle, TRUE);
          }
        }
      }
    }

    $setup->save();
    $flow = $setup->getFlow();

    \Drupal::messenger()->addMessage('The pull flow has been created, please review your settings.');

    return [
      'flow_id' => $flow->id,
      'flow_configuration' => $configurations,
      'type' => 'pull',
    ];
  }

}

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

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