entity_hierarchy-8.x-2.24/src/Information/ParentCandidate.php

src/Information/ParentCandidate.php
<?php

namespace Drupal\entity_hierarchy\Information;

use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;

/**
 * Defines a class for determining if an entity is a parent candidate.
 */
class ParentCandidate implements ParentCandidateInterface {

  /**
   * Entity field manager.
   *
   * @var \Drupal\Core\Entity\EntityFieldManagerInterface
   */
  protected $entityFieldManager;

  /**
   * Bundle info.
   *
   * @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface
   */
  protected $bundleInfo;

  /**
   * Constructs a new ReorderChildrenAccess object.
   *
   * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entityFieldManager
   *   Entity field manager.
   * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $bundleInfo
   *   Bundle Info.
   */
  public function __construct(EntityFieldManagerInterface $entityFieldManager, EntityTypeBundleInfoInterface $bundleInfo) {
    $this->entityFieldManager = $entityFieldManager;
    $this->bundleInfo = $bundleInfo;
  }

  /**
   * {@inheritdoc}
   */
  public function getCandidateFields(EntityInterface $entity) {
    $fields = $this->entityFieldManager->getFieldMapByFieldType('entity_reference_hierarchy');
    $valid_fields = [];
    $entity_type = $entity->getEntityTypeId();
    if (isset($fields[$entity_type])) {
      // See if any bundles point to this entity.
      // We only consider this entity type, there is no point in a hierarchy
      // that spans entity-types as you cannot have more than a single level.
      foreach ($fields[$entity_type] as $field_name => $detail) {
        foreach ($detail['bundles'] as $bundle) {
          /** @var \Drupal\Core\Field\FieldDefinitionInterface $field */
          $field = $this->entityFieldManager->getFieldDefinitions($entity_type, $bundle)[$field_name];
          $settings = $field->getSetting('handler_settings');
          if (!isset($settings['target_bundles']) || in_array($entity->bundle(), $settings['target_bundles'], TRUE)) {
            // No target bundles means any can be referenced, return early.
            $valid_fields[] = $field_name;
            continue 2;
          }
        }
      }
    }
    return $valid_fields;
  }

  /**
   * {@inheritdoc}
   */
  public function getCandidateBundles(EntityInterface $entity) {
    $fields = $this->entityFieldManager->getFieldMap()[$entity->getEntityTypeId()];
    $bundles = [];
    $bundleInfo = $this->bundleInfo->getBundleInfo($entity->getEntityTypeId());
    foreach ($this->getCandidateFields($entity) as $field_name) {
      $valid_bundles = [];
      foreach ($fields[$field_name]['bundles'] as $bundle) {
        /** @var \Drupal\Core\Field\FieldDefinitionInterface $field */
        $field = $this->entityFieldManager->getFieldDefinitions($entity->getEntityTypeId(), $bundle)[$field_name];
        $settings = $field->getSetting('handler_settings');
        if (!isset($settings['target_bundles']) || in_array($entity->bundle(), $settings['target_bundles'], TRUE)) {
          // No target bundles means any can be referenced.
          $valid_bundles[$bundle] = $bundle;
        }
      }
      $bundles[$field_name] = array_intersect_key($bundleInfo, $valid_bundles);
    }
    return $bundles;
  }

}

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

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