content_deploy-1.0.1/src/Utility/ContentDeployNodesWithDependencyHelper.php

src/Utility/ContentDeployNodesWithDependencyHelper.php
<?php

namespace Drupal\content_deploy\Utility;

use Drupal\Component\Serialization\Yaml;

/**
 * Helper class for functionality node export/import with dependencies.
 */
class ContentDeployNodesWithDependencyHelper {

  /**
   * Exports the nodes.
   *
   * @param array $entityDependencies
   *   dependencies of exported node.
   * @param $archiver
   *   archiver of exported the node.
   * @param int $defaultOwnerUid
   *   Author UID of exported node.
   * @param array $exportedFiles
   *   array of exported files.
   *
   * @return
   */
  public static function export_entity_dependencies($entityDependencies, $archiver, $defaultOwnerUid, $exportedFiles, $nodeTargetStatus = NULL) {

    $basename = pathinfo($archiver->_tarname, PATHINFO_FILENAME);
    $exportDirName = str_replace('.' . pathinfo($basename, PATHINFO_EXTENSION), '', $basename);

    $file_system = \Drupal::service('file_system');
    $contentExporter = \Drupal::service('content_deploy.exporter');
    foreach ($entityDependencies as $entityType => $singleTypeEntityDependency) {
      foreach ($singleTypeEntityDependency as $singleEntityDependency) {
        $attachedEntityDetail = explode('.', $singleEntityDependency);
        $attachedEntityUUID = end($attachedEntityDetail);
        if (!empty($attachedEntityUUID)) {
          if (in_array($entityType . '.' . $attachedEntityUUID, $exportedFiles)) {
            continue;
          }
          $attachedEntity = \Drupal::service('entity.repository')->loadEntityByUuid($entityType, $attachedEntityUUID);
          if ($attachedEntity->hasField('uid') && empty($attachedEntity->get('uid')->value)) {
            $attachedEntity->set('uid', $defaultOwnerUid);
          }
          if (!empty($attachedEntity)) {

            if ($entityType == 'node' && $nodeTargetStatus !== NULL && $nodeTargetStatus === 0) {
              $attachedEntity->setUnpublished();
            }
            elseif ($entityType == 'node' && $nodeTargetStatus === 1) {
              $attachedEntity->setPublished();
            }

            $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
            if (!empty($language) && $attachedEntity->hasTranslation($language)) {
              $attachedEntity = $attachedEntity->getTranslation($language);
            }
            $attachedEntityBundle = $attachedEntity->bundle();
            $attachedEntityFileName = $entityType . "." . $attachedEntityBundle . "." . $attachedEntityUUID;
            $attachedExportedEntity = $contentExporter->exportEntity($attachedEntity, []);
            $attachedDecodedEntity = Yaml::decode($attachedExportedEntity);
            if ($entityType == 'file') {
              $uri = $attachedEntity->getFileUri();
              if (file_exists($uri)) {
                // $scheme = $file_system->uriScheme($uri);
                $scheme = \Drupal::service('stream_wrapper_manager')->getScheme($uri);
                $archiver->addModify([$uri], "$exportDirName/attached_files/$scheme", "$scheme://");
              }
            }
            $archiver->addString("$exportDirName/entities/$entityType/$attachedEntityBundle/$attachedEntityFileName.yml", $attachedExportedEntity);
            $exportedFiles[] = $entityType . '.' . $attachedEntityUUID;
            if (isset($attachedDecodedEntity['_content_deploy']['entity_dependencies']) && !empty($attachedDecodedEntity['_content_deploy']['entity_dependencies'])) {
              /* Export entity_dependencies recursively. */
              self::export_entity_dependencies($attachedDecodedEntity['_content_deploy']['entity_dependencies'], $archiver, $defaultOwnerUid, $exportedFiles, $nodeTargetStatus);
            }
          }
        }
      }
    }
    return [
      'exportedFiles' => $exportedFiles,
    ];
  }

  /**
   * Imports the nodes.
   *
   * @param array $entityDependencies
   *   Dependencies of node being imported.
   * @param array $files
   *   Files of extracted archiver.
   * @param $directory
   *   Directory where archiver got extracted.
   * @param array $importedFiles
   *   array of imported files.
   * @param array $processedEntities
   *   array of processed files.
   *
   * @return
   */
  public static function import_entity_dependencies($entityDependencies, $files, $directory, $importedFiles = [], $processedEntities = []) {

    if (empty($entityDependencies) || empty($files) || empty($directory)) {
      \Drupal::logger('content_deploy')->error(t('Entity dependencies or content files or directory name is empty'));
      return;
    }

    $contentImporter = \Drupal::service('content_deploy.importer');

    foreach ($entityDependencies as $entityType => $singleTypeEntityDependency) {
      foreach ($singleTypeEntityDependency as $singleEntityDependency) {
        $singleEntityDependencyFile = $singleEntityDependency . '.yml';
        $matches = array_filter($files, function ($var) use ($singleEntityDependencyFile) {
          return preg_match("/\b$singleEntityDependencyFile\b/i", $var);
        });

        if (!empty($matches)) {
          $file = reset($matches);
          if (!file_exists($directory . '/' . $file) || in_array(basename($file), $importedFiles)) {
            continue;
          }
          $data = file_get_contents($directory . '/' . $file);
          $ymlData = Yaml::decode($data);
          if (!in_array(basename($file), $processedEntities)) {
            $processedEntities[] = basename($file);
            if (isset($ymlData['_content_deploy']['entity_dependencies']) && !empty($ymlData['_content_deploy']['entity_dependencies'])) {
              $entityDependencies = $ymlData['_content_deploy']['entity_dependencies'];
              self::import_entity_dependencies($entityDependencies, $files, $directory, $importedFiles, $processedEntities);
            }
          }
          $entity = $contentImporter->importEntity($ymlData);
          if ($entity) {
            $importedFiles[] = basename($file);
            \Drupal::logger('content_deploy')->info(t('Entity @label (@entity_type: @id) imported successfully.', [
              '@label' => $entity->label(),
              '@entity_type' => $entity->getEntityTypeId(),
              '@id' => $entity->id(),
            ]));
          }
        }
      }
    }

    return [
      'importedFiles' => $importedFiles,
      'processedEntities' => $processedEntities,
    ];
  }

}

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

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