civicrm_entity-8.x-3.0-beta1/src/Plugin/Field/BundleFieldItemList.php

src/Plugin/Field/BundleFieldItemList.php
<?php

namespace Drupal\civicrm_entity\Plugin\Field;

use Drupal\civicrm_entity\Entity\CivicrmEntity;
use Drupal\civicrm_entity\SupportedEntities;
use Drupal\Core\Field\FieldItemList;
use Drupal\Core\TypedData\ComputedItemListTrait;

/**
 * Computed field item list for the bundle property.
 */
class BundleFieldItemList extends FieldItemList {
  use ComputedItemListTrait;

  /**
   * {@inheritdoc}
   */
  protected function computeValue() {
    $entity = $this->getEntity();
    assert($entity instanceof CivicrmEntity);
    $civicrm_bundle_property = $entity->getEntityType()->get('civicrm_bundle_property');
    $civicrm_entity_name = $entity->getEntityType()->get('civicrm_entity');

    $raw_bundle_value = $entity->get($civicrm_bundle_property)->value;

    /** @var \Drupal\civicrm_entity\CiviCrmApiInterface $civicrm_api */
    $civicrm_api = \Drupal::service('civicrm_entity.api');
    $options = $civicrm_api->getOptions($civicrm_entity_name, $civicrm_bundle_property);
    $bundle_value = $options[$raw_bundle_value];

    $transliteration = \Drupal::transliteration();
    $machine_name = SupportedEntities::optionToMachineName($bundle_value, $transliteration);
    $this->list[0] = $this->createItem(0, $machine_name);
  }

  /**
   * {@inheritdoc}
   *
   * This sets the bundle property if Drupal sets a value to `bundle`, which
   * means we have to transliterate the options and convert a machine name to
   * the option key.
   */
  public function setValue($values, $notify = TRUE) {
    $entity = $this->getEntity();
    assert($entity instanceof CivicrmEntity);
    $civicrm_bundle_property = $entity->getEntityType()->get('civicrm_bundle_property');
    $civicrm_entity_name = $entity->getEntityType()->get('civicrm_entity');

    /** @var \Drupal\civicrm_entity\CiviCrmApiInterface $civicrm_api */
    $civicrm_api = \Drupal::service('civicrm_entity.api');
    $options = $civicrm_api->getOptions($civicrm_entity_name, $civicrm_bundle_property);

    $transliteration = \Drupal::transliteration();
    $options = array_map(static function ($value) use ($transliteration) {
      return SupportedEntities::optionToMachineName($value, $transliteration);
    }, $options);
    $options = array_flip($options);

    if (!is_array($values)) {
      $entity->get($civicrm_bundle_property)->setValue($options[$values]);
    }

    parent::setValue($values, $notify);
    $this->valueComputed = TRUE;
  }

}

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

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