content_sync-8.x-2.x-dev/src/Form/ContentSingleExportForm.php

src/Form/ContentSingleExportForm.php
<?php

namespace Drupal\content_sync\Form;

use Drupal\content_sync\Exporter\ContentExporterInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\EntityTypeBundleInfo;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\Entity\ContentEntityType;
use Symfony\Component\DependencyInjection\ContainerInterface;



/**
 * Provides a form for exporting a single content file.
 */
class ContentSingleExportForm extends FormBase {

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The entity bundle manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeBundleInfo
   */
  protected $entityBundleManager;

  /**
   * @var \Drupal\content_sync\Exporter\ContentExporterInterface
   */
  protected $contentExporter;

  /**
   * Constructs a new ContentSingleExportForm.
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *
   * @param \Drupal\Core\Entity\EntityTypeBundleInfo $entity_bundle_manager
   *
   * @param \Drupal\content_sync\Exporter\ContentExporterInterface $content_exporter
   */
  public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfo $entity_bundle_manager, ContentExporterInterface $content_exporter) {
    $this->entityTypeManager = $entity_type_manager;
    $this->entityBundleManager = $entity_bundle_manager;
    $this->contentExporter = $content_exporter;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('entity_type.manager'),
      $container->get('entity_type.bundle.info'),
      $container->get('content_sync.exporter')
    );
  }

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

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, $content_type = 'node', $content_name = NULL, $content_entity = NULL) {
    $entity_types = [];
    $entity_type_definitions = $this->entityTypeManager->getDefinitions();
    foreach ($entity_type_definitions as $entity_type => $definition) {
      if ($definition instanceof ContentEntityType) {
        $entity_types[$entity_type] = $definition->getLabel();
      }
    }

    uasort($entity_types, 'strnatcasecmp');
    $content_types = $entity_types;
    $form['content_type'] = [
      '#title' => $this->t('Content type'),
      '#type' => 'select',
      '#options' => $content_types,
      '#default_value' => $content_type,
      '#attributes' => array('onchange' => 'this.form.content_name.value = null; if(this.form.content_entity){ this.form.content_entity.value = null; } this.form.export.value = null; this.form.submit();'),
    ];

    $default_type = $form_state->getValue('content_type', $content_type);
    $default_name = $form_state->getValue('content_name', $content_name);
    $form['content_name'] = [
      '#title' => $this->t('Content name'),
      '#type' => 'select',
      '#options' => $this->findContent($default_type),
      '#default_value' => $content_name,
      '#attributes' => array('onchange' => 'if(this.form.content_entity){ this.form.content_entity.value = null; } this.form.export.value = null; this.form.submit();'),
    ];

    // Auto-complete field for the content entity
    if($default_type && $default_name){
      $form['content_entity'] = [
        '#title' => $this->t('Content Entity'),
        '#type' => 'entity_autocomplete',
        '#target_type' => $default_type,
        '#selection_handler' => 'default',
        '#selection_settings' => [
          'target_bundles' => [$default_name],
        ],
        '#ajax' => [
          'callback' => '::updateExport',
          'wrapper' => 'edit-export-wrapper',
            'event' => 'autocompleteclose',
        ],
      ];
      // Autocomplete doesn't support target bundles parameter on bundle-less entities.
      $target_type = $this->entityTypeManager->getDefinition($default_type);
      $target_type_bundles = $target_type->getBundleEntityType();
      if(is_null($target_type_bundles)){
        unset($form['content_entity']['#selection_settings']);
      }
    }

    $form['export'] = [
      '#title' => $this->t('Here is your configuration:'),
      '#type' => 'textarea',
      '#rows' => 24,
      '#prefix' => '<div id="edit-export-wrapper">',
      '#suffix' => '</div>',
    ];

    return $form;
  }

  /**
   * Handles switching the content type selector.
   */
  protected function findContent($content_type) {
    $names = [
      '' => $this->t('- Select -'),
    ];
    // For a given entity type, load all entities.
    if ($content_type) {
      $entity_storage = $this->entityBundleManager->getBundleInfo($content_type);
      foreach ($entity_storage as $entityKey => $entity) {
        $entity_id = $entityKey;
        if ($label = $entity['label']) {
          $names[$entity_id] = new TranslatableMarkup('@label (@id)', ['@label' => $label, '@id' => $entity_id]);
        }
        else {
          $names[$entity_id] = $entity_id;
        }
      }
    }
    return $names;
  }

  /**
   * Handles switching the export textarea.
   */
  public function updateExport($form, FormStateInterface $form_state) {
    // Get submitted values
    $entity_type = $form_state->getValue('content_type');
    $entity_id = $form_state->getValue('content_entity');

    // DB entity to YAML
    $entity = $this->entityTypeManager->getStorage($entity_type)->load($entity_id);

    // Generate the YAML file.
    $serializer_context = [];
    $exported_entity = $this->contentExporter->exportEntity($entity, $serializer_context);

    // Create the name
    $name = $entity_type . "." . $entity->bundle() . "." . $entity->uuid();

    // Return form values
    $form['export']['#value'] = $exported_entity;
    $form['export']['#description'] = $this->t('Filename: %name', ['%name' => $name . '.yml']);
    return $form['export'];
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    // Nothing to submit.
  }

}

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

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