plugin-8.x-2.8/src/Plugin/Field/FieldType/PluginCollectionItemBase.php

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

namespace Drupal\plugin\Plugin\Field\FieldType;

use Drupal\Component\Plugin\Exception\PluginNotFoundException;
use Drupal\Component\Plugin\PluginInspectionInterface;
use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\Core\TypedData\MapDataDefinition;
use Drupal\plugin\PluginType\ConfigurablePluginTypeInterface;

/**
 * Provides a base for plugin collection field items.
 */
abstract class PluginCollectionItemBase extends FieldItemBase implements PluginCollectionItemInterface {

  /**
   * {@inheritdoc}
   */
  public function __get($name) {
    // @todo Remove this override once https://www.drupal.org/node/2413471 has
    //   been fixed.
    // There is either a property object or a plain value - possibly for a
    // not-defined property. If we have a plain value, directly return it.
    if ($this->definition->getPropertyDefinition($name)) {
      return $this->get($name)->getValue();
    }
    elseif (isset($this->values[$name])) {
      return $this->values[$name];
    }
  }

  /**
   * {@inheritdoc}
   */
  public function validatePluginInstance(PluginInspectionInterface $plugin_instance) {
    $plugin_manager = $this->getPluginType()->getPluginManager();
    if (!$plugin_manager->hasDefinition($plugin_instance->getPluginId())) {
      throw new PluginNotFoundException($plugin_instance->getPluginId(), sprintf('Plugin manager %s does not have a definition for plugin %s.', get_class($plugin_manager), $plugin_instance->getPluginId()));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function createContainedPluginInstance($plugin_id, array $plugin_configuration = []) {
    $plugin_instance = $this->getPluginType()
      ->getPluginManager()
      ->createInstance($plugin_id, $plugin_configuration);
    $this->validatePluginInstance($plugin_instance);

    return $plugin_instance;
  }

  /**
   * {@inheritdoc}
   */
  public function getContainedPluginInstance() {
    return $this->get('plugin_instance')->getValue();
  }

  /**
   * {@inheritdoc}
   */
  public function setContainedPluginInstance(PluginInspectionInterface $plugin_instance) {
    $this->get('plugin_instance')->setValue($plugin_instance);

    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function resetContainedPluginInstance() {
    $this->get('plugin_instance')->applyDefaultValue();

    return $this;
  }


  /**
   * {@inheritdoc}
   */
  public function getContainedPluginId() {
    return $this->get('plugin_id')->getValue();
  }

  /**
   * {@inheritdoc}
   */
  public function setContainedPluginId($plugin_id) {
    $this->get('plugin_id')->setValue($plugin_id);

    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getContainedPluginConfiguration() {
    return $this->get('plugin_configuration')->getValue();
  }

  /**
   * {@inheritdoc}
   */
  public function setContainedPluginConfiguration(array $configuration) {
    $this->get('plugin_configuration')->setValue($configuration);

    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
    $properties['plugin_id'] = DataDefinition::create('plugin_id')
      ->setLabel(t('Plugin ID'));
    $properties['plugin_configuration'] = MapDataDefinition::create('plugin_configuration')
      ->setLabel(t('Plugin configuration'));
    $properties['plugin_instance'] = MapDataDefinition::create('plugin_instance')
      ->setLabel(t('Plugin instance'))
      ->setComputed(TRUE);

    return $properties;
  }

  /**
   * {@inheritdoc}
   */
  public static function mainPropertyName() {
    return 'plugin_instance';
  }

  /**
   * {@inheritdoc}
   */
  public static function schema(FieldStorageDefinitionInterface $field_definition) {
    $columns = [
      'plugin_id' => [
        'description' => 'The plugin ID.',
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
      ],
      'plugin_configuration' => [
        'description' => 'The plugin configuration.',
        'type' => 'blob',
        'not null' => TRUE,
        'serialize' => TRUE,
      ],
    ];

    $schema = [
      'columns' => $columns,
    ];

    return $schema;
  }

  /**
   * {@inheritdoc}
   */
  public function isEmpty() {
    return !$this->getContainedPluginInstance();
  }

  /**
   * {@inheritdoc}
   */
  public function getValue() {
    // The "plugin_instance" property is the canonical value of this field item,
    // but we can only represent this item's value using the plugin instance's
    // ID and configuration. parent::getValue() skips computed properties, so we
    // must return them here.
    $plugin_type = $this->getPluginType();
    return [
      'plugin_id' => $this->get('plugin_id')->getValue(),
      'plugin_configuration' => $this->get('plugin_configuration')->getValue(),
      'plugin_configuration_schema_id' => $plugin_type instanceof ConfigurablePluginTypeInterface ? $plugin_type->getPluginConfigurationSchemaId($this->get('plugin_id')->getValue()) : 'plugin.plugin_configuration.*.*',
    ];
  }


  /**
   * {@inheritdoc}
   */
  public function setValue($values, $notify = TRUE) {
    if ($values instanceof PluginInspectionInterface) {
      $this->setContainedPluginInstance($values);
    }
    elseif (is_array($values)) {
      if (isset($values['plugin_instance'])) {
        $this->setContainedPluginInstance($values['plugin_instance']);
      }
      else {
        if (isset($values['plugin_id'])) {
          $this->setContainedPluginId($values['plugin_id']);
        }
        if (isset($values['plugin_configuration'])) {
          $this->setContainedPluginConfiguration($values['plugin_configuration']);
        }
      }
    }
    // Field API has this weird habit of setting NULL instead of calling
    // applyDefaultValue(), so we can't throw an exception on that.
    elseif (!is_null($values)) {
      $type = is_object($values) ? get_class($values) : gettype($values);
      throw new \InvalidArgumentException(sprintf('The value must implement %s or be an associative array, but %s was given', PluginInspectionInterface::class, $type));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function __isset($name) {
    // All properties depend on the main property.
    return parent::__isset($this->mainPropertyName());
  }

}

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

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