bridtv-8.x-1.x-dev/src/Plugin/Field/FieldType/BridtvReferenceItem.php

src/Plugin/Field/FieldType/BridtvReferenceItem.php
<?php

namespace Drupal\bridtv\Plugin\Field\FieldType;

use Drupal\bridtv\BridEmbeddingInstance;
use Drupal\bridtv\BridEmbeddingInstancePlaylist;
use Drupal\bridtv\Field\BridtvVideoItemInterface;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\TypedData\DataDefinition;

/**
 * Defines the reference to Brid.TV instances with custom player settingss.
 *
 * @FieldType(
 *   id = "bridtv_reference",
 *   label = @Translation("Brid.TV Video reference"),
 *   description = @Translation("Stores the reference to a Brid.TV video and exposes custom player settings."),
 *   category = @Translation("Brid.TV Reference"),
 *   default_widget = "bridtv_reference_autocomplete",
 *   default_formatter = "bridtv_js",
 *   list_class = "\Drupal\bridtv\Field\BridtvReferenceFieldItemList",
 * )
 */
class BridtvReferenceItem extends EntityReferenceItem implements BridtvVideoItemInterface {

  /**
   * The Brid.TV video instance.
   *
   * @var \Drupal\bridtv\BridEmbeddingInstance
   */
  protected $embeddingInstance = NULL;

  /**
   * {@inheritdoc}
   */
  public function getBridEmbeddingInstance() {
    if (!isset($this->embeddingInstance) && !$this->isEmpty()) {
      try {
        $entity = $this->get('entity')->getValue();
      }
      catch (\Exception $e) {
        $this->embeddingInstance = FALSE;
      }
      if (isset($entity)) {
        if (!($player_id = $this->get('player')->getValue())) {
          $resolver = $this->getBridEntityResolver();
          $items = $resolver->getFieldItemList($entity);
          if (NULL === $items || $items->isEmpty() || !($player_id = $items->first()
            ->get('player')
            ->getValue())) {
            $negotiator = $this->getBridtvNegotiator();
            $player_id = $negotiator->getDefaultPlayerId();
          }
        };
        $mediaBundle = $entity->bundle();
        if ('brid_tv_playlist' === $mediaBundle) {
          $this->embeddingInstance = new BridEmbeddingInstancePlaylist($entity, $player_id);
        }
        else {
          $this->embeddingInstance = new BridEmbeddingInstance($entity, $player_id);
        }
      }
    }
    return $this->embeddingInstance ? $this->embeddingInstance : NULL;
  }

  /**
   * {@inheritdoc}
   */
  public static function defaultStorageSettings() {
    return [
      'target_type' => 'media',
    ] + parent::defaultStorageSettings();
  }

  /**
   * {@inheritdoc}
   */
  public static function defaultFieldSettings() {
    return [
      'handler' => 'default:media',
      'handler_settings' => [
        'target_bundles' => ['bridtv'],
        'sort' => ['field' => 'name'],
        'auto_create' => FALSE,
      ],
    ] + parent::defaultFieldSettings();
  }

  /**
   * {@inheritdoc}
   */
  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
    $properties = parent::propertyDefinitions($field_definition);
    $properties['player'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Brid.TV Player id'));
    $properties['settings'] = DataDefinition::create('any')
      ->setLabel(new TranslatableMarkup('Custom settings'));
    return $properties;
  }

  /**
   * {@inheritdoc}
   */
  public static function schema(FieldStorageDefinitionInterface $field_definition) {
    $schema = parent::schema($field_definition);
    $schema['columns']['player'] = [
      'type' => 'int',
      'size' => 'normal',
      'unsigned' => TRUE,
    ];
    $schema['columns']['settings'] = [
      'type' => 'blob',
      'size' => 'normal',
      'serialize' => TRUE,
    ];
    return $schema;
  }

  /**
   * {@inheritdoc}
   */
  public function setValue($values, $notify = TRUE) {
    if (isset($values['settings']) && is_string($values['settings'])) {
      // Unserialize the values.
      $values['settings'] = unserialize($values['settings']);
    }
    parent::setValue($values, $notify);
  }

  /**
   * Gets the brid tv negotiator.
   *
   * @return \Drupal\bridtv\BridInfoNegotiator
   *   The Brid.TV negotiator.
   */
  protected function getBridtvNegotiator() {
    return \Drupal::service('bridtv.negotiator');
  }

  /**
   * Get the entity resolver.
   *
   * @return \Drupal\bridtv\BridEntityResolver
   *   The entity resolver.
   */
  protected function getBridEntityResolver() {
    return \Drupal::service('bridtv.entities');
  }

  /**
   * {@inheritdoc}
   */
  public function isEmpty() {
    return parent::isEmpty() && empty($this->get('player')
      ->getValue()) && empty($this->get('settings')->getValue());
  }

  /**
   * {@inheritdoc}
   */
  public function hasNewEntity() {
    return !$this->isEmpty() && $this->target_id === NULL && isset($this->entity) && $this->entity->isNew();
  }

}

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

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