preview_site-1.1.2/src/Plugin/PreviewSite/Deploy/PublicFiles.php

src/Plugin/PreviewSite/Deploy/PublicFiles.php
<?php

declare(strict_types=1);

namespace Drupal\preview_site\Plugin\PreviewSite\Deploy;

use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\file\FileInterface;
use Drupal\preview_site\Deploy\DeployPluginBase;
use Drupal\preview_site\Entity\PreviewSiteBuildInterface;
use Drupal\preview_site\Generate\FileHelper;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Defines a deploy plugin that uses public files.
 *
 * @PreviewSiteDeploy(
 *   id = "preview_site_public",
 *   title = @Translation("Public files"),
 *   description = @Translation("Deploy to the public files folder."),
 * )
 */
class PublicFiles extends DeployPluginBase {

  /**
   * Token service.
   *
   * @var \Drupal\Core\Utility\Token
   */
  protected $token;

  /**
   * File system.
   *
   * @var \Drupal\Core\File\FileSystem
   */
  protected $fileSystem;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $instance->fileSystem = $container->get('file_system');
    $instance->token = $container->get('token');
    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return ['naming' => ''];
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    return [
      'naming' => [
        '#type' => 'textfield',
        '#title' => $this->t('Naming'),
        '#default_value' => $this->configuration['naming'],
        '#description' => $this->t('Enter a naming convention for preview site builds. You may use <code>[preview_site_build:*]</code> tokens. The pattern entered here will be used for creating a folder in the public file system.'),
        '#required' => TRUE,
      ],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    $this->configuration['naming'] = $form_state->getValue('naming');
  }

  /**
   * {@inheritdoc}
   */
  public function deployArtifact(PreviewSiteBuildInterface $build, FileInterface $file): void {
    $destination = sprintf('public://%s/%s', trim($this->token->replace($this->configuration['naming'], [
      'preview_site_build' => $build,
    ], ['clean' => TRUE]), '/'), FileHelper::getFilePathWithoutSchema($file, $build));
    $directory = dirname($destination);
    $this->fileSystem->prepareDirectory($directory, FileSystemInterface::CREATE_DIRECTORY | FileSystemInterface::MODIFY_PERMISSIONS);
    $this->fileSystem->copy($file->getFileUri(), $destination, FileSystemInterface::EXISTS_REPLACE);
  }

  /**
   * {@inheritdoc}
   */
  public function getDeploymentBaseUri(PreviewSiteBuildInterface $build): ?string {
    $destination = sprintf('public://%s', trim($this->token->replace($this->configuration['naming'], [
      'preview_site_build' => $build,
    ], ['clean' => TRUE]), '/'));
    return \Drupal::service('file_url_generator')->generateAbsoluteString($destination);
  }

  /**
   * Do cleanup of files from public storage.
   *
   * @param \Drupal\preview_site\Entity\PreviewSiteBuildInterface $build
   *   Build.
   */
  private function doCleanUp(PreviewSiteBuildInterface $build): void {
    foreach ($build->getArtifacts() as $file) {
      $destination = sprintf('public://%s/%s', trim($this->token->replace($this->configuration['naming'], [
        'preview_site_build' => $build,
      ], ['clean' => TRUE]), '/'), FileHelper::getFilePathWithoutSchema($file, $build));
      $this->fileSystem->unlink($destination);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function decommissionPreviewSiteBuild(PreviewSiteBuildInterface $build): void {
    parent::decommissionPreviewSiteBuild($build);
    $this->doCleanUp($build);
  }

  /**
   * {@inheritdoc}
   */
  public function deletePreviewSiteBuild(PreviewSiteBuildInterface $build): void {
    parent::deletePreviewSiteBuild($build);
    $this->doCleanUp($build);
  }

  /**
   * {@inheritdoc}
   */
  public function deployFilePath(PreviewSiteBuildInterface $build, string $path): void {
    $destination = sprintf('public://%s/%s', trim($this->token->replace($this->configuration['naming'], [
      'preview_site_build' => $build,
    ], ['clean' => TRUE]), '/'), $path);
    $directory = dirname($destination);
    $this->fileSystem->prepareDirectory($directory, FileSystemInterface::CREATE_DIRECTORY | FileSystemInterface::MODIFY_PERMISSIONS);
    $this->fileSystem->copy($path, $destination, FileSystemInterface::EXISTS_REPLACE);
  }

}

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

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