media_library_form_element-2.0.0/src/Plugin/WebformElement/MediaLibrary.php

src/Plugin/WebformElement/MediaLibrary.php
<?php

namespace Drupal\media_library_form_element\Plugin\WebformElement;

use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Element\WebformMultiple;
use Drupal\webform\Plugin\WebformElement\WebformEntityReferenceTrait;
use Drupal\webform\Plugin\WebformElementBase;
use Drupal\webform\WebformInterface;
use Drupal\webform\WebformSubmissionInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides a 'media_library' element.
 *
 * @WebformElement(
 *   id = "media_library",
 *   api = "https://www.drupal.org/project/media_library_form_element",
 *   label = @Translation("Media library"),
 *   description = @Translation("Provides a form element for media library."),
 *   category = "Entity reference elements",
 *   dependencies = {
 *     "media_library_form_element",
 *   },
 *   states_wrapper = TRUE,
 * )
 */
class MediaLibrary extends WebformElementBase {

  use WebformEntityReferenceTrait;

  /**
   * The entity type bundle info.
   *
   * @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface
   */
  protected $entityTypeBundleInfo;

  /**
   * {@inheritdoc}
   */
  protected function defineDefaultProperties() {
    $properties = [
      'multiple' => FALSE,
      'bundles' => [],
    ] + parent::defineDefaultProperties() + $this->defineDefaultMultipleProperties();

    unset($properties['prepopulate']);
    return $properties;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $instance->entityRepository = $container->get('entity.repository');
    $instance->entityTypeRepository = $container->get('entity_type.repository');
    $instance->selectionManager = $container->get('plugin.manager.entity_reference_selection');
    $instance->entityTypeBundleInfo = $container->get('entity_type.bundle.info');
    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public function form(array $form, FormStateInterface $form_state) {
    $form = parent::form($form, $form_state);

    $form['media_library'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Media library settings'),
    ];

    $form['media_library']['bundles'] = [
      '#type' => 'checkboxes',
      '#title' => $this->t('Media types'),
      '#description' => $this->t('Select which media types are selectable.'),
      '#required' => TRUE,
      '#options' => array_map(function($bundle) {
        return $bundle['label'];
      }, $this->entityTypeBundleInfo->getBundleInfo('media')),
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function prepare(array &$element, ?WebformSubmissionInterface $webform_submission = NULL) {
    parent::prepare($element, $webform_submission);

    $element['#allowed_bundles'] = $this->getMediaTypes($element);

    if (!$this->getElementProperty($element, 'multiple')) {
      $element['#cardinality'] = 1;
    }
    elseif ($this->getElementProperty($element, 'multiple') === TRUE) {
      $element['#cardinality'] = WebformMultiple::CARDINALITY_UNLIMITED;
    }
    else {
      $element['#cardinality'] = $this->getElementProperty($element, 'multiple');
    }
  }

  /**
   * {@inheritdoc}
   */
  public function setDefaultValue(array &$element) {
    if (!empty($element['#default_value']) && is_array($element['#default_value'])) {
      $element['#default_value'] = implode(',', $element['#default_value']);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function supportsMultipleValues() {
    return TRUE;
  }

  /**
   * {@inheritdoc}
   */
  public function hasMultipleWrapper() {
    return FALSE;
  }

  /**
   * {@inheritdoc}
   */
  protected function prepareElementValidateCallbacks(array &$element, ?WebformSubmissionInterface $webform_submission = NULL) {
    parent::prepareElementValidateCallbacks($element, $webform_submission);

    $element['#element_validate'][] = [get_class($this), 'validateMediaLibrary'];
  }

  /**
   * Set the value as array.
   */
  public static function validateMediaLibrary(array &$element, FormStateInterface $form_state, array &$completed_form) {
    $value = $element['#value'];

    if (!empty($element['#multiple'])) {
      $value = explode(',', $element['#value']);
      $value = array_filter($value);
    }

    $form_state->setValueForElement($element, $value ?: NULL);
  }

  /**
   * {@inheritdoc}
   */
  public function getTestValues(array $element, WebformInterface $webform, array $options = []) {
    if ($this->isDisabled()) {
      return NULL;
    }

    /** @var \Drupal\media\MediaStorage $media_storage */
    $media_storage = $this->entityTypeManager->getStorage('media');
    $query = $media_storage
      ->getQuery()
      ->condition('bundle', array_filter($element['#bundles']), 'IN')
      ->range(0, 50);

    $result = $query->accessCheck(TRUE)->execute();

    if (!empty($result)) {
      return array_rand($result);
    }

    return NULL;
  }

  /**
   * Get applicable bundles.
   *
   * @param array $element
   *   An element.
   *
   * @return array
   *   The enabled media bundles.
   */
  protected function getMediaTypes(array $element) {
    return !empty($element['#bundles']) ? array_filter($element['#bundles']) : ['image'];
  }

  /**
   * {@inheritdoc}
   */
  public function getTargetType(array $element) {
    return 'media';
  }

}

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

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