You are here

protected function LingotekManagementRelatedEntitiesForm::getNestedEntities in Lingotek Translation 3.0.x

Same name and namespace in other branches
  1. 8.2 src/Form/LingotekManagementRelatedEntitiesForm.php \Drupal\lingotek\Form\LingotekManagementRelatedEntitiesForm::getNestedEntities()
  2. 3.1.x src/Form/LingotekManagementRelatedEntitiesForm.php \Drupal\lingotek\Form\LingotekManagementRelatedEntitiesForm::getNestedEntities()
  3. 3.2.x src/Form/LingotekManagementRelatedEntitiesForm.php \Drupal\lingotek\Form\LingotekManagementRelatedEntitiesForm::getNestedEntities()
  4. 3.3.x src/Form/LingotekManagementRelatedEntitiesForm.php \Drupal\lingotek\Form\LingotekManagementRelatedEntitiesForm::getNestedEntities()
1 call to LingotekManagementRelatedEntitiesForm::getNestedEntities()
LingotekManagementRelatedEntitiesForm::getFilteredEntities in src/Form/LingotekManagementRelatedEntitiesForm.php
Gets the entities that needs to be displayed based on the current filters.

File

src/Form/LingotekManagementRelatedEntitiesForm.php, line 175

Class

LingotekManagementRelatedEntitiesForm
Form for bulk management of related content.

Namespace

Drupal\lingotek\Form

Code

protected function getNestedEntities(ContentEntityInterface &$entity, &$visited = [], &$entities = [], $depth = 1) {
  $visited[$entity
    ->bundle()][] = $entity
    ->id();
  $entities[$entity
    ->getEntityTypeId()][$entity
    ->id()] = $entity
    ->getUntranslated();
  if ($depth > 0) {
    --$depth;
    $field_definitions = $this->entityFieldManager
      ->getFieldDefinitions($entity
      ->getEntityTypeId(), $entity
      ->bundle());
    foreach ($field_definitions as $k => $definition) {
      $field_type = $field_definitions[$k]
        ->getType();
      if (in_array($field_type, [
        'entity_reference',
        'entity_reference_revisions',
        'er_viewmode',
      ])) {
        $target_entity_type_id = $field_definitions[$k]
          ->getFieldStorageDefinition()
          ->getSetting('target_type');
        $target_entity_type = $this->entityTypeManager
          ->getDefinition($target_entity_type_id);
        if ($target_entity_type instanceof ContentEntityType) {
          $child_entities = $entity->{$k}
            ->referencedEntities();
          foreach ($child_entities as $embedded_entity) {
            if ($embedded_entity !== NULL) {
              if ($embedded_entity instanceof ContentEntityInterface && $embedded_entity
                ->isTranslatable() && $this->lingotekConfiguration
                ->isEnabled($embedded_entity
                ->getEntityTypeId(), $embedded_entity
                ->bundle())) {

                // We need to avoid cycles if we have several entity references
                // referencing each other.
                if (!isset($visited[$embedded_entity
                  ->bundle()]) || !in_array($embedded_entity
                  ->id(), $visited[$embedded_entity
                  ->bundle()])) {
                  $entities = $this
                    ->getNestedEntities($embedded_entity, $visited, $entities, $depth);
                }
              }
            }
          }
        }
      }
    }
  }
  return $entities;
}