View source
<?php
namespace Drupal\lingotek\Form;
use Drupal\content_translation\ContentTranslationManagerInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\ContentEntityType;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\State\StateInterface;
use Drupal\Core\TempStore\PrivateTempStoreFactory;
use Drupal\Core\Utility\LinkGeneratorInterface;
use Drupal\lingotek\LanguageLocaleMapperInterface;
use Drupal\lingotek\LingotekConfigurationServiceInterface;
use Drupal\lingotek\LingotekContentTranslationServiceInterface;
use Drupal\lingotek\LingotekInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class LingotekManagementRelatedEntitiesForm extends LingotekManagementFormBase {
protected $node;
public function __construct(Connection $connection, EntityTypeManagerInterface $entity_type_manager, LanguageManagerInterface $language_manager, LingotekInterface $lingotek, LingotekConfigurationServiceInterface $lingotek_configuration, LanguageLocaleMapperInterface $language_locale_mapper, ContentTranslationManagerInterface $content_translation_manager, LingotekContentTranslationServiceInterface $translation_service, PrivateTempStoreFactory $temp_store_factory, StateInterface $state, ModuleHandlerInterface $module_handler, EntityFieldManagerInterface $entity_field_manager = NULL, EntityTypeBundleInfoInterface $entity_type_bundle_info = NULL, LinkGeneratorInterface $link_generator = NULL) {
parent::__construct($connection, $entity_type_manager, $language_manager, $lingotek, $lingotek_configuration, $language_locale_mapper, $content_translation_manager, $translation_service, $temp_store_factory, $state, $module_handler, NULL, $entity_field_manager, $entity_type_bundle_info, $link_generator);
}
public static function create(ContainerInterface $container) {
return new static($container
->get('database'), $container
->get('entity_type.manager'), $container
->get('language_manager'), $container
->get('lingotek'), $container
->get('lingotek.configuration'), $container
->get('lingotek.language_locale_mapper'), $container
->get('content_translation.manager'), $container
->get('lingotek.content_translation'), $container
->get('tempstore.private'), $container
->get('state'), $container
->get('module_handler'), $container
->get('entity_field.manager'), $container
->get('entity_type.bundle.info'), $container
->get('link_generator'));
}
public function buildForm(array $form, FormStateInterface $form_state, ContentEntityInterface $node = NULL) {
$this->node = $node;
$form = parent::buildForm($form, $form_state);
$related = $this->related;
$depth = $this
->getRecursionDepth();
$form['depth_selection'] = [
'#type' => 'container',
'#attributes' => [
'class' => 'form-item-depth-selection',
],
'#weight' => 60,
];
$form['depth_selection']['depth'] = [
'#type' => 'select',
'#title' => $this
->t('Recursion depth:'),
'#options' => [
1 => 1,
2 => 2,
3 => 3,
4 => 4,
5 => 5,
],
'#default_value' => $depth,
];
$form['depth_selection']['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Apply'),
'#submit' => [
[
$this,
'recursionDepthCallback',
],
],
];
$relatedRows = [];
if (!empty($related)) {
$relatedRows = $this
->getRows($related);
}
$form['related'] = [
'#type' => 'details',
'#title' => $this
->t('Embedded content references'),
'#description' => $this
->t('These entities are included in the parent document, but listed here for reference. It is not recommended to operate on this data, as its contents will be already translated with the embedding document.'),
'#weight' => 100,
];
$form['related']['table'] = [
'#header' => $this
->getHeaders(),
'#rows' => $relatedRows,
'#empty' => $this
->t('No embedded content available'),
'#type' => 'table',
'#weight' => 100,
];
return $form;
}
protected function getSelectedEntities($values) {
$entityTypes = [];
$entities = [];
foreach ($values as $type_entity_id) {
list($type, $entity_id) = explode(":", $type_entity_id);
$entityTypes[$type][] = $entity_id;
}
foreach ($entityTypes as $type => $values) {
$entities = array_merge($entities, $this->entityTypeManager
->getStorage($type)
->loadMultiple($values));
}
return $entities;
}
public function getFormId() {
return 'lingotek_entity_management';
}
protected function getHeaders() {
$headers = [
'title' => $this
->t('Label'),
'entity_type_id' => $this
->t('Content Type'),
'bundle' => $this
->t('Bundle'),
'source' => $this
->t('Source'),
'translations' => $this
->t('Translations'),
'profile' => $this
->t('Profile'),
'job_id' => $this
->t('Job ID'),
];
return $headers;
}
public function calculateNestedEntities(ContentEntityInterface &$entity, &$visited = [], &$entities = []) {
$visited[$entity
->bundle()][] = $entity
->id();
$entities[$entity
->getEntityTypeId()][] = $entity;
$field_definitions = $this->entityFieldManager
->getFieldDefinitions($entity
->getEntityTypeId(), $entity
->bundle());
foreach ($field_definitions as $k => $definition) {
$field_type = $field_definitions[$k]
->getType();
if ($field_type === 'entity_reference' || $field_type === 'er_viewmode' || $field_type === 'entity_reference_revisions' || $field_type === 'cohesion_entity_reference_revisions') {
$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) {
foreach ($entity->{$k} as $field_item) {
if (!isset($entities[$target_entity_type_id])) {
$entities[$target_entity_type_id] = [];
}
$entities[$target_entity_type_id][] = $field_item->target_id;
}
}
}
}
return $entities;
}
protected function getFilteredEntities() {
$entities = [];
$related = [];
$visited = [];
$recursion_depth = $this
->getRecursionDepth();
$type = \Drupal::service('plugin.manager.related_entities_detector');
$plugin_definitions = $type
->getDefinitions();
uasort($plugin_definitions, 'Drupal\\Component\\Utility\\SortArray::sortByWeightElement');
foreach ($plugin_definitions as $plugin_definition_id => $plugin_definition) {
$plugin = $type
->createInstance($plugin_definition_id, []);
$entities = $plugin
->extract($this->node, $entities, $related, $recursion_depth, $visited);
}
$this->related = $related;
return $entities;
}
protected function getRows($entity_list) {
$counter = 1;
$rows = [];
foreach ($entity_list as $entity_type_id => $entities) {
foreach ($entities as $entity_id => $entity) {
$rowId = (string) $entity
->getEntityTypeId() . ':' . (string) $entity
->id();
$rows[$rowId] = $this
->getRow($entity);
$counter += 1;
}
}
return $rows;
}
protected function getRow($entity) {
$parentRow = parent::getRow($entity);
$bundleInfo = $this->entityTypeBundleInfo
->getBundleInfo($entity
->getEntityTypeId());
$row['title'] = $parentRow['title'];
$row['entity_type_id'] = $entity
->getEntityType()
->getLabel();
$row['bundle'] = $bundleInfo[$entity
->bundle()]['label'];
$row['title'] = $parentRow['title'];
$row['source'] = $parentRow['source'];
$row['translations'] = $parentRow['translations'];
$row['profile'] = $parentRow['profile'];
$row['job_id'] = $parentRow['job_id'];
return $row;
}
protected function getTempStorageFilterKey() {
return NULL;
}
protected function getFilterKeys() {
return NULL;
}
protected function getFilters() {
return NULL;
}
protected function getPager() {
return NULL;
}
protected function getRecursionDepth() {
$temp_store = $this->tempStoreFactory
->get('lingotek.management.recursion_depth');
$depth = $temp_store
->get('depth');
if ($depth === NULL) {
$depth = 1;
}
return $depth;
}
protected function setRecursionDepth($depth) {
$temp_store = $this->tempStoreFactory
->get('lingotek.management.recursion_depth');
$temp_store
->set('depth', $depth);
}
public function recursionDepthCallback(array &$form, FormStateInterface $form_state) {
$value = $form_state
->getValue('depth');
$this
->setRecursionDepth($value);
}
protected function canHaveDeleteTranslationBulkOptions() {
return FALSE;
}
protected function canHaveDeleteBulkOptions() {
return FALSE;
}
}