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;
}
}
