external_entity-1.0.x-dev/external_entity.module
external_entity.module
<?php
/**
* @file
* Define the hook implementations for the external entity.
*/
declare(strict_types=1);
use Drupal\Core\Render\Element;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Field\EntityReferenceFieldItemListInterface;
use Drupal\external_entity\Contracts\ExternalEntityInterface;
/**
* Implements hook_form_FORM_ID_alter().
*/
function external_entity_form_entity_view_display_edit_form_alter(
&$form,
FormStateInterface $form_state,
): void {
if (!isset($form['#entity_type'], $form['#bundle'])) {
return;
}
$fields = &$form['fields'];
$bundle = $form['#bundle'];
$entity_type = $form['#entity_type'];
$field_exclude_formatters = [
'entity_reference_entity_view',
];
$field_definitions = external_entity_field_manager()
->getFieldDefinitions($entity_type, $bundle);
foreach (Element::children($fields) as $field_name) {
if (
!isset($field_definitions[$field_name])
|| empty($field_definitions[$field_name])) {
continue;
}
$field_definition = $field_definitions[$field_name];
$field_class = $field_definition->getClass();
if (
!is_subclass_of($field_class, EntityReferenceFieldItemListInterface::class)
|| $field_definition->getSetting('target_type') !== 'external_entity'
) {
continue;
}
$options = &$fields[$field_name]['plugin']['type']['#options'];
foreach ($field_exclude_formatters as $formatter_type) {
unset($options[$formatter_type]);
}
}
}
/**
* Implements hook_preprocess_node().
*/
function external_entity_preprocess_node(array &$variables) {
if (
($node = $variables['node'])
&& isset($node->external_entity)
&& $node->external_entity instanceof ExternalEntityInterface
) {
$external_entity = $node->external_entity;
$variables['url'] = $external_entity->getPath();
}
}
/**
* Get external entity field manager.
*
* @return \Drupal\Core\Entity\EntityFieldManagerInterface
*/
function external_entity_field_manager(): EntityFieldManagerInterface {
return \Drupal::service('entity_field.manager');
}
