digital_signage_framework-2.3.x-dev/src/Entity/ContentSetting.php

src/Entity/ContentSetting.php
<?php

namespace Drupal\digital_signage_framework\Entity;

use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\digital_signage_framework\ContentSettingInterface;

/**
 * Defines the digital signage content setting entity class.
 *
 * @ContentEntityType(
 *   id = "digital_signage_content_setting",
 *   label = @Translation("Digital signage content setting"),
 *   label_collection = @Translation("Digital signage content settings"),
 *   handlers = {
 *     "views_data" = "Drupal\views\EntityViewsData"
 *   },
 *   base_table = "digital_signage_content_setting",
 *   admin_permission = "administer digital signage content setting",
 *   entity_keys = {
 *     "id" = "id",
 *     "label" = "label",
 *     "uuid" = "uuid"
 *   },
 *   field_ui_base_route = "entity.digital_signage_content_setting.settings"
 * )
 */
class ContentSetting extends ContentEntityBase implements ContentSettingInterface {

  /**
   * Get a hash of all relevant properties.
   *
   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
   *   The entity.
   *
   * @return string
   *   The hash.
   */
  private function getHash(ContentEntityInterface $entity): string {
    $fields = [
      'status',
      'auto_label',
      'label',
      'predecessor',
      'emergencymode',
      'dynamic',
      'critical',
      'priority',
      'type',
      'count',
      'devices',
      'segments',
    ];
    $value = '';
    foreach ($fields as $field) {
      $value .= serialize($entity->get($field)->getValue());
    }
    return hash('md5', $value);
  }

  /**
   * {@inheritdoc}
   */
  public function hasChanged(): bool {
    return \Drupal::state()->get('DigSigContentSetting-prev-' . $this->id()) !== $this->getHash($this);
  }

  /**
   * {@inheritdoc}
   */
  public function postSave(EntityStorageInterface $storage, $update = TRUE): void {
    \Drupal::state()->set('DigSigContentSetting-prev-' . $this->id(), isset($this->original) ? $this->getHash($this->original) : '');
    parent::postSave($storage, $update);
  }

  /**
   * {@inheritdoc}
   */
  public function getReverseEntity(): ?array {
    $item = $this->get('parent_entity');
    if (isset($item[0])) {
      $reverse_entity = $item[0]->getValue();
      if (!empty($reverse_entity['target_id'])) {
        return $reverse_entity;
      }
    }
    return NULL;
  }

  /**
   * {@inheritdoc}
   */
  public function setReverseEntity($entity): ContentSettingInterface {
    $this->set('parent_entity', $entity);
    $this->set('parent_entity_bundle', $entity->bundle());
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getReverseEntityType(): ?string {
    $entity = $this->getReverseEntity();
    return $entity ? $entity['target_type'] : NULL;
  }

  /**
   * {@inheritdoc}
   */
  public function getReverseEntityBundle(): ?string {
    return $this->get('parent_entity_bundle')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function getReverseEntityId(): int {
    $entity = $this->getReverseEntity();
    return $entity ? $entity['target_id'] : 0;
  }

  /**
   * {@inheritdoc}
   */
  public function isReverseEntityEnabled(): bool {
    return (bool) $this->get('parent_entity_status')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function setReverseEntityStatus($status): ContentSettingInterface {
    $this->set('parent_entity_status', $status);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function isEnabled(): bool {
    return (bool) $this->get('status')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function setStatus($status): ContentSettingInterface {
    $this->set('status', $status);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getDeviceIds(): array {
    $ids = [];
    /** @var \Drupal\digital_signage_framework\DeviceInterface $entity */
    foreach ($this->get('devices')->referencedEntities() as $entity) {
      $ids[] = $entity->id();
    }
    return $ids;
  }

  /**
   * {@inheritdoc}
   */
  public function getSegmentIds(): array {
    $ids = [];
    /** @var \Drupal\taxonomy\TermInterface $entity */
    foreach ($this->get('segments')->referencedEntities() as $entity) {
      $ids[] = $entity->id();
    }
    return $ids;
  }

  /**
   * {@inheritdoc}
   */
  public function getPriority(): int {
    return $this->get('priority')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function isCritical(): bool {
    return (bool) $this->get('critical')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function isDynamic(): bool {
    return (bool) $this->get('dynamic')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function setDynamic($flag): ContentSettingInterface {
    $this->set('dynamic', $flag);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getType(): string {
    return $this->get('type')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function isAutoLabel(): bool {
    return (bool) $this->get('auto_label')->value;
  }

  /**
   * {@inheritdoc}
   */
  public function getLabel(): string {
    return $this->get('label')->value ?? '';
  }

  /**
   * {@inheritdoc}
   */
  public function setLabel($label): ContentSettingInterface {
    $this->set('label', $label);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public static function baseFieldDefinitions(EntityTypeInterface $entity_type): array {

    $fields = parent::baseFieldDefinitions($entity_type);

    $fields['status'] = BaseFieldDefinition::create('boolean')
      ->setRevisionable(TRUE)
      ->setLabel(t('Publish'))
      ->setDescription(t('Enable to publish this content to digital signage platforms.'))
      ->setDefaultValue(FALSE)
      ->setSetting('on_label', 'Enabled')
      ->setDisplayOptions('form', [
        'type' => 'boolean_checkbox',
        'weight' => 0,
      ])
      ->setDisplayConfigurable('form', FALSE)
      ->setDisplayConfigurable('view', FALSE);

    $fields['auto_label'] = BaseFieldDefinition::create('boolean')
      ->setRevisionable(TRUE)
      ->setLabel(t('Automatic label'))
      ->setDescription(t('Use the label from the parent when enabled.'))
      ->setDefaultValue(TRUE)
      ->setSetting('on_label', 'Enabled')
      ->setDisplayOptions('form', [
        'type' => 'boolean_checkbox',
        'weight' => 1,
      ])
      ->setDisplayConfigurable('form', FALSE)
      ->setDisplayConfigurable('view', FALSE);
    $fields['label'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Label'))
      ->setRequired(FALSE)
      ->setCardinality(1)
      ->setDisplayOptions('form', [
        'weight' => 2,
      ])
      ->setDisplayConfigurable('form', TRUE);

    $fields['predecessor'] = BaseFieldDefinition::create('entity_reference')
      ->setLabel(t('Predecessor'))
      ->setSetting('target_type', 'digital_signage_content_setting')
      ->setRequired(FALSE)
      ->setCardinality(1)
      ->setSettings([
        'handler' => 'views',
        'handler_settings' => [
          'view' => [
            'view_name' => 'digital_signage_predecessor',
            'display_name' => 'entity_reference_1',
            'arguments' => [],
          ],
        ],
      ])
      ->setDisplayOptions('form', [
        'type' => 'options_select',
        'weight' => 3,
      ])
      ->setDisplayOptions('view', [
        'region' => 'hidden',
      ])
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', FALSE);

    $fields['emergencymode'] = BaseFieldDefinition::create('boolean')
      ->setRevisionable(TRUE)
      ->setLabel(t('Emergency mode'))
      ->setDescription(t('Enable to mark this entity as content for emergency mode.'))
      ->setDefaultValue(FALSE)
      ->setSetting('on_label', 'Enabled')
      ->setDisplayOptions('form', [
        'type' => 'boolean_checkbox',
        'weight' => 0,
      ])
      ->setDisplayConfigurable('form', FALSE)
      ->setDisplayConfigurable('view', FALSE);

    $fields['dynamic'] = BaseFieldDefinition::create('boolean')
      ->setRevisionable(TRUE)
      ->setLabel(t('Dynamic content'))
      ->setDescription(t('If checked, the content will be updated dynamically by the remote displays without creating new schedules every time this content changes.'))
      ->setDefaultValue(FALSE)
      ->setSetting('on_label', 'Dynamic content')
      ->setDisplayOptions('form', [
        'type' => 'boolean_checkbox',
        'weight' => 3,
      ])
      ->setDisplayConfigurable('form', FALSE)
      ->setDisplayConfigurable('view', FALSE);

    $fields['critical'] = BaseFieldDefinition::create('boolean')
      ->setRevisionable(TRUE)
      ->setLabel(t('Critical'))
      ->setDescription(t('Critical information can be treated separately by schedules/playlist.'))
      ->setDefaultValue(FALSE)
      ->setSetting('on_label', 'Critical')
      ->setDisplayOptions('form', [
        'type' => 'boolean_checkbox',
        'weight' => 3,
      ])
      ->setDisplayConfigurable('form', FALSE)
      ->setDisplayConfigurable('view', FALSE);

    /* @noinspection PackedHashtableOptimizationInspection */
    $fields['priority'] = BaseFieldDefinition::create('list_integer')
      ->setRevisionable(TRUE)
      ->setLabel(t('Priority'))
      ->setDescription(t('The influences the usage by schedules/playlists.'))
      ->setDefaultValue('2')
      ->setSetting('allowed_values', [
        '1' => t('high'),
        '2' => t('normal'),
        '3' => t('low'),
      ])
      ->setRequired(TRUE)
      ->setDisplayOptions('form', [
        'type' => 'options_select',
        'weight' => 3,
      ])
      ->setDisplayConfigurable('form', FALSE)
      ->setDisplayConfigurable('view', FALSE);

    $fields['type'] = BaseFieldDefinition::create('list_string')
      ->setRevisionable(TRUE)
      ->setLabel(t('Type'))
      ->setDescription(t('The type may influence the usage of this content in schedules/playlists.'))
      ->setDefaultValue('simple')
      ->setSetting('allowed_values', [
        'simple' => t('Simple'),
        'complex' => t('Complex'),
      ])
      ->setRequired(TRUE)
      ->setDisplayOptions('form', [
        'type' => 'options_select',
        'weight' => 3,
      ])
      ->setDisplayConfigurable('form', FALSE)
      ->setDisplayConfigurable('view', FALSE);

    $fields['count'] = BaseFieldDefinition::create('integer')
      ->setRevisionable(TRUE)
      ->setLabel(t('Count'))
      ->setDescription(t('How often this content should be displayed per device, leave empty for unlimited.'))
      ->setRequired(FALSE)
      ->setDisplayOptions('form', [
        'type' => 'number',
        'weight' => 4,
      ])
      ->setDisplayConfigurable('form', FALSE)
      ->setDisplayConfigurable('view', FALSE);

    $fields['devices'] = BaseFieldDefinition::create('entity_reference')
      ->setLabel(t('Devices'))
      ->setSetting('target_type', 'digital_signage_device')
      ->setRequired(FALSE)
      ->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED)
      ->setDisplayOptions('form', [
        'type' => 'entity_reference_autocomplete',
        'settings' => [
          'match_operator' => 'CONTAINS',
          'size' => '60',
          'placeholder' => '',
        ],
        'weight' => 98,
      ])
      ->setDisplayOptions('view', [
        'region' => 'hidden',
      ])
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

    $fields['segments'] = BaseFieldDefinition::create('entity_reference')
      ->setLabel(t('Device groups'))
      ->setSetting('target_type', 'taxonomy_term')
      ->setSetting('handler_settings', ['target_bundles' => ['digital_signage' => 'digital_signage']])
      ->setRequired(FALSE)
      ->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED)
      ->setDisplayOptions('form', [
        'type' => 'entity_reference_autocomplete',
        'settings' => [
          'match_operator' => 'CONTAINS',
          'size' => '60',
          'placeholder' => '',
        ],
        'weight' => 99,
      ])
      ->setDisplayOptions('view', [
        'region' => 'hidden',
      ])
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

    $fields['parent_entity'] = BaseFieldDefinition::create('dynamic_entity_reference')
      ->setRevisionable(FALSE)
      ->setLabel(t('Parent entity'))
      ->setDescription(t('The entity of the content which contains these settings.'));
    $fields['parent_entity_bundle'] = BaseFieldDefinition::create('string')
      ->setRevisionable(FALSE)
      ->setLabel(t('Parent entity bundle'))
      ->setDescription(t('The entity bundle of the content which contains these settings.'));
    $fields['parent_entity_status'] = BaseFieldDefinition::create('boolean')
      ->setRevisionable(TRUE)
      ->setLabel(t('Parent entity status'))
      ->setDescription(t('The entity status of the content which contains these settings.'));

    return $fields;
  }

}

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

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