ispim-1.0.x-dev/src/Entity/IspimPreviewImage.php

src/Entity/IspimPreviewImage.php
<?php

declare(strict_types=1);

namespace Drupal\ispim\Entity;

use Drupal\Core\Entity\EditorialContentEntityBase;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\file\FileInterface;
use Drupal\user\EntityOwnerTrait;

/**
 * @ContentEntityType(
 *   id = "ispim_preview_image",
 *   label            = @Translation("Image Style Preview Image"),
 *   label_collection = @Translation("List of Image Style Preview Images"),
 *   label_singular   = @Translation("Image Style Preview Image"),
 *   label_plural     = @Translation("Image Style Preview Images"),
 *   label_count = @PluralTranslation(
 *     singular = "@count Image Style Preview Image",
 *     plural   = "@count Image Style Preview Images",
 *   ),
 *   handlers = {
 *     "storage"         = "Drupal\ispim\PreviewImage\Storage",
 *     "storage_schema"  = "Drupal\ispim\PreviewImage\StorageSchema",
 *     "access"          = "Drupal\ispim\PreviewImage\AccessControlHandler",
 *     "translation"     = "Drupal\ispim\PreviewImage\TranslationHandler",
 *     "view_builder"    = "Drupal\ispim\PreviewImage\ViewBuilder",
 *     "view_controller" = "Drupal\ispim\PreviewImage\ViewController",
 *     "list_builder"    = "Drupal\ispim\PreviewImage\ListBuilder",
 *     "views_data"      = "Drupal\ispim\PreviewImage\ViewsData",
 *     "form" = {
 *       "default" = "Drupal\ispim\PreviewImage\AddForm",
 *       "add"     = "Drupal\ispim\PreviewImage\AddForm",
 *       "edit"    = "Drupal\ispim\PreviewImage\EditForm",
 *       "delete"  = "Drupal\ispim\PreviewImage\DeleteForm"
 *     },
 *     "route_provider" = {
 *       "html" = "Drupal\ispim\PreviewImage\RouteProvider",
 *     },
 *   },
 *   base_table          = "ispim_preview_image_c_base",
 *   data_table          = "ispim_preview_image_c_data",
 *   revision_table      = "ispim_preview_image_r_base",
 *   revision_data_table = "ispim_preview_image_r_data",
 *   show_revision_ui = TRUE,
 *   fieldable = TRUE,
 *   field_ui_base_route = "entity.ispim_preview_image.collection",
 *   translatable = TRUE,
 *   common_reference_target = FALSE,
 *   admin_permission = "ispim.ispim_preview_image._all",
 *   permission_granularity = "entity_type",
 *   entity_keys = {
 *     "uuid"                          = "uuid",
 *     "id"                            = "id",
 *     "revision"                      = "revision_id",
 *     "bundle"                        = "",
 *     "langcode"                      = "langcode",
 *     "default_langcode"              = "default_langcode",
 *     "revision_translation_affected" = "revision_translation_affected",
 *     "label"                         = "label",
 *     "uid"                           = "uid",
 *     "owner"                         = "uid",
 *     "status"                        = "status",
 *     "published"                     = "status",
 *     "weight"                        = "weight",
 *   },
 *   revision_metadata_keys = {
 *     "revision_created"     = "revision_created",
 *     "revision_user"        = "revision_uid",
 *     "revision_log_message" = "revision_log",
 *     "revision_default"     = "revision_default",
 *   },
 *   links = {
 *     "collection"                       = "/admin/config/media/ispim-preview-image",
 *     "create"                           = "/admin/config/media/ispim-preview-image/add",
 *     "canonical"                        = "/admin/config/media/ispim-preview-image/manage/{ispim_preview_image}",
 *     "edit-form"                        = "/admin/config/media/ispim-preview-image/manage/{ispim_preview_image}/edit",
 *     "delete-form"                      = "/admin/config/media/ispim-preview-image/manage/{ispim_preview_image}/delete",
 *     "revision-history"                 = "/admin/config/media/ispim-preview-image/manage/{ispim_preview_image}/revision",
 *     "revision-view"                    = "/admin/config/media/ispim-preview-image/manage/{ispim_preview_image}/revision/{ispim_preview_image_revision}",
 *     "revision-revert-form"             = "/admin/config/media/ispim-preview-image/manage/{ispim_preview_image}/revision/{ispim_preview_image_revision}/revert",
 *     "revision-revert-translation-form" = "/admin/config/media/ispim-preview-image/manage/{ispim_preview_image}/revision/{ispim_preview_image_revision}/revert/{langcode}",
 *     "revision-delete-form"             = "/admin/config/media/ispim-preview-image/manage/{ispim_preview_image}/revision/{ispim_preview_image_revision}/delete",
 *   }
 * )
 */
class IspimPreviewImage extends EditorialContentEntityBase implements IspimPreviewImageInterface {

  use EntityOwnerTrait;

  /**
   * {@inheritdoc}
   *
   * @return array<string, \Drupal\Core\Field\FieldDefinitionInterface>
   */
  public static function baseFieldDefinitions(EntityTypeInterface $entity_type): array {
    /** @var array<string, \Drupal\Core\Field\BaseFieldDefinition> $fields */
    $fields = parent::baseFieldDefinitions($entity_type);

    if ($entity_type->hasKey('label')) {
      $fields[$entity_type->getKey('label')] = BaseFieldDefinition::create('string')
        ->setLabel(t('Label'))
        ->setRequired(TRUE)
        ->setTranslatable(TRUE)
        ->setRevisionable(TRUE)
        ->setSetting('max_length', 255)
        ->setDisplayOptions(
          'form',
          [
            'type' => 'string_textfield',
            'weight' => 2,
          ],
        )
        ->setDisplayConfigurable('form', TRUE)
        ->setDisplayOptions(
          'view',
          [
            'label' => 'hidden',
            'type' => 'string',
            'weight' => 2,
          ]
        )
        ->setDisplayConfigurable('view', TRUE);
    }

    /* @noinspection PhpUnhandledExceptionInspection */
    $fields += static::ownerBaseFieldDefinitions($entity_type);
    $key = $entity_type->getKey('owner');
    $fields[$key]
      ->setLabel(t('Authored by'))
      ->setRevisionable(TRUE)
      ->setTranslatable(TRUE)
      ->setDisplayOptions(
        'form',
        [
          'type' => 'entity_reference_autocomplete',
          'weight' => 4,
          'settings' => [
            'match_operator' => 'CONTAINS',
            'size' => '60',
            'placeholder' => '',
          ],
        ],
      )
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayOptions(
        'view',
        [
          'label' => 'hidden',
          'type' => 'author',
          'weight' => 4,
        ],
      )
      ->setDisplayConfigurable('view', TRUE);

    $key = $entity_type->getKey('status');
    $fields[$key] = BaseFieldDefinition::create('boolean')
      ->setLabel(t('Status'))
      ->setRevisionable(TRUE)
      ->setTranslatable(TRUE)
      ->setDefaultValue(TRUE)
      ->setDisplayOptions(
        'form',
        [
          'type' => 'boolean_checkbox',
          'settings' => [
            'display_label' => TRUE,
          ],
          'weight' => 120,
        ],
      )
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

    $fields['created'] = BaseFieldDefinition::create('created')
      ->setLabel(t('Authored on'))
      ->setDescription(t('The time that the ispim_preview_image was created.'))
      ->setRevisionable(TRUE)
      ->setTranslatable(TRUE)
      ->setDisplayOptions(
        'form',
        [
          'type' => 'datetime_timestamp',
          'weight' => 3,
        ],
      )
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayOptions(
        'view',
        [
          'label' => 'hidden',
          'type' => 'timestamp',
          'weight' => 3,
        ],
      )
      ->setDisplayConfigurable('view', TRUE);

    $fields['changed'] = BaseFieldDefinition::create('changed')
      ->setLabel(t('Changed'))
      ->setDescription(t('The time that the ispim_preview_image was last edited.'))
      ->setRevisionable(TRUE)
      ->setTranslatable(TRUE);

    /* @noinspection PhpUnhandledExceptionInspection */
    $fields += static::revisionLogBaseFieldDefinitions($entity_type);
    $fields += static::customImageBaseFieldDefinitions($entity_type);
    $fields += static::customWeightBaseFieldDefinitions($entity_type);

    return $fields;
  }

  /**
   * @return array<string, \Drupal\Core\Field\BaseFieldDefinition>
   */
  protected static function customImageBaseFieldDefinitions(EntityTypeInterface $entityType): array {
    // phpcs:disable Drupal.Arrays.Array.ArrayIndentation
    return [
      'image' => BaseFieldDefinition::create('image')
        ->setLabel(new TranslatableMarkup('Image'))
        ->setRequired(TRUE)
        ->setTranslatable($entityType->isTranslatable())
        ->setSettings([
          'uri_scheme' => static::getImageUriScheme(),
          'file_directory' => $entityType->id(),
          'file_extensions' => 'png gif jpg jpeg webp svg',
          'alt_field' => TRUE,
          'alt_field_required' => FALSE,
          'title_field' => TRUE,
          'title_field_required' => FALSE,
        ])
        ->setDisplayConfigurable('form', TRUE)
        ->setDisplayOptions(
          'form',
          [
            'type' => 'image_image',
            'weight' => 1,
            'settings' => [
              'progress_indicator' => 'throbber',
              'preview_image_style' => 'thumbnail',
            ],
          ],
        )
        ->setDisplayConfigurable('view', TRUE)
        ->setDisplayOptions(
          'view',
          [
            'type' => 'image',
            'weight' => 5,
            'settings' => [
              'image_style' => '',
              'image_link' => 'thumbnail',
              'image_loading' => [
                'attribute' => 'lazy',
              ],
            ],
          ],
        ),
    ];
    // phpcs:enable Drupal.Arrays.Array.ArrayIndentation
  }

  /**
   * @return array<string, \Drupal\Core\Field\BaseFieldDefinition>
   */
  protected static function customWeightBaseFieldDefinitions(EntityTypeInterface $entityType): array {
    // phpcs:disable Drupal.Arrays.Array.ArrayIndentation
    return [
      'weight' => BaseFieldDefinition::create('integer')
        ->setLabel(new TranslatableMarkup('Weight'))
        ->setDescription(t('The weight of this Preview Image in relation to other Preview Images.'))
        ->setRequired(TRUE)
        ->setDefaultValue(0)
        ->setTranslatable($entityType->isTranslatable())
        ->setSettings([
          'unsigned' => FALSE,
          'size' => 'normal',
        ])
        ->setDisplayConfigurable('form', TRUE)
        ->setDisplayOptions(
          'form',
          [
            'type' => 'number',
            'weight' => 3,
            'settings' => [
              'placeholder' => '',
            ],
          ],
        )
        ->setDisplayConfigurable('view', TRUE)
        ->setDisplayOptions(
          'view',
          [
            'type' => 'number_integer',
            'weight' => 3,
            'settings' => [
              'thousand_separator' => '',
              'prefix_suffix' => TRUE,
            ],
          ],
        ),
    ];
    // phpcs:enable Drupal.Arrays.Array.ArrayIndentation
  }

  protected static function getImageUriScheme(): string {
    $container = \Drupal::getContainer();
    $configFactory = $container->get('config.factory');

    $local = $configFactory
      ->get('ispim.ispim_preview_image.settings')
      ->get('image.storage_settings.uri_scheme');

    return $local ?: $configFactory->get('system.file')->get('default_scheme');
  }

  /**
   * {@inheritdoc}
   */
  public function preSave(EntityStorageInterface $storage): void {
    parent::preSave($storage);

    foreach (array_keys($this->getTranslationLanguages()) as $langcode) {
      $translation = $this->getTranslation($langcode);

      // If no owner has been set explicitly, make the anonymous user the owner.
      // @phpstan-ignore-next-line
      if (!$translation->getOwner()) {
        $translation->setOwnerId(0);
      }
    }

    // If no revision author has been set explicitly, make the entity owner the
    // revision author.
    if (!$this->getRevisionUser()) {
      $this->setRevisionUserId($this->getOwnerId());
    }
  }

  /**
   * {@inheritdoc}
   */
  public function preSaveRevision(EntityStorageInterface $storage, \stdClass $record): void {
    parent::preSaveRevision($storage, $record);

    if (!$this->isNewRevision()
      && isset($this->original)
      && (!isset($record->revision_log) || $record->revision_log === '')
    ) {
      // If we are updating an existing instance without adding a new revision,
      // we need to make sure $entity->revision_log is reset whenever it is empty.
      // Therefore, this code allows us to avoid clobbering an existing log
      // entry with an empty one.
      //
      // @todo Find an alternative for ::$revision_log.
      // @phpstan-ignore-next-line
      $record->revision_log = $this->original->revision_log->value;
    }
  }

  public function getCreatedTime(): int {
    return $this->get('created')->value;
  }

  public function setCreatedTime(int $timestamp): static {
    $this->set('created', $timestamp);

    return $this;
  }

  public function getWeight(): int {
    return $this->get('weight')->isEmpty()
      ? 0
      : (int) $this->get('weight')->value;
  }

  public function getImageFile(): ?FileInterface {
    /** @var \Drupal\Core\Field\EntityReferenceFieldItemListInterface<\Drupal\file\FileInterface> $fieldItemList */
    $fieldItemList = $this->get('image');
    /** @var \Drupal\file\FileInterface[] $files */
    $files = $fieldItemList->referencedEntities();
    $file = reset($files);

    $this->image->view();

    return $file instanceof FileInterface
      ? $file
      : NULL;
  }

}

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

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