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; } }