bridtv-8.x-1.x-dev/src/Field/BridtvReferenceFieldItemList.php

src/Field/BridtvReferenceFieldItemList.php
<?php

namespace Drupal\bridtv\Field;

use Drupal\Core\Entity\Plugin\Validation\Constraint\ValidReferenceConstraint;
use Drupal\Core\Field\EntityReferenceFieldItemList;
use Drupal\Core\Form\FormStateInterface;

/**
 * Class Bridtv Reference Field Item List.
 */
class BridtvReferenceFieldItemList extends EntityReferenceFieldItemList {

  /**
   * {@inheritdoc}
   */
  public function getConstraints() {
    $constraints = parent::getConstraints();
    /** @var \Symfony\Component\Validator\Constraint $constraint */
    foreach ($constraints as $index => $constraint) {
      if ($constraint instanceof ValidReferenceConstraint) {
        unset($constraints[$index]);
      }
    }
    $constraint_manager = $this->getTypedDataManager()->getValidationConstraintManager();
    $constraint_manager->create('BridtvValidReference', []);
    return $constraints;
  }

  /**
   * {@inheritdoc}
   */
  public function defaultValuesFormSubmit(array $element, array &$form, FormStateInterface $form_state) {
    // This is basically a copy-paste from EntityReferenceFieldItemList.
    // It needed changes regards defensive checks for the target id.
    // Otherwise, it would fail hard when trying to save field storage settings.
    // Also, creating new entities is not needed here,
    // as media items are being handled via synchronization.
    $grandparent = get_parent_class(get_parent_class($this));
    $default_value = $grandparent::defaultValuesFormSubmit($element, $form, $form_state);

    $ids = [];
    foreach ($default_value as $delta => $properties) {
      if (isset($default_value[$delta]['target_id'])) {
        $ids[] = $default_value[$delta]['target_id'];
      }
    }
    $entities = [];
    if (!empty($ids)) {
      $entities = \Drupal::entityTypeManager()
        ->getStorage($this->getSetting('target_type'))
        ->loadMultiple($ids);
    }

    // Convert numeric IDs to UUIDs to ensure config deployability.
    foreach ($default_value as $delta => $properties) {
      unset($default_value[$delta]['target_id']);
      if (isset($properties['target_id']) && isset($entities[$properties['target_id']])) {
        $default_value[$delta]['target_uuid'] = $entities[$properties['target_id']]->uuid();
      }
    }
    return $default_value;
  }

}

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

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