Skip to content

Commit

Permalink
Option to get alt text from Original File. (#1024)
Browse files Browse the repository at this point in the history
* Option to get alt text from Original File.
* Add schema.
* Logic re-work and fixing a undefined method.
---------
Co-authored-by: Jordan Dukart <[email protected]>
  • Loading branch information
rosiel authored Jul 4, 2024
1 parent 0105343 commit 14c4e42
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 14 deletions.
4 changes: 4 additions & 0 deletions config/schema/islandora.schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,10 @@ condition.plugin.node_had_namespace:
field.formatter.settings.islandora_image:
type: field.formatter.settings.image
label: 'Islandora image field display format settings'
mapping:
image_alt_text:
type: string
label: "Alt text source"

condition.plugin.islandora_entity_bundle:
type: condition.plugin
Expand Down
111 changes: 97 additions & 14 deletions src/Plugin/Field/FieldFormatter/IslandoraImageFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\File\FileUrlGeneratorInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\image\Plugin\Field\FieldFormatter\ImageFormatter;
use Drupal\islandora\IslandoraUtils;
use Drupal\islandora\MediaSource\MediaSourceService;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
Expand All @@ -34,6 +36,13 @@ class IslandoraImageFormatter extends ImageFormatter {
*/
protected $utils;

/**
* Islandora media source service.
*
* @var \Drupal\islandora\MediaSource\MediaSourceService
*/
protected $mediaSourceService;

/**
* Constructs an IslandoraImageFormatter object.
*
Expand All @@ -59,6 +68,8 @@ class IslandoraImageFormatter extends ImageFormatter {
* Islandora utils.
* @param \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator
* The File URL Generator.
* @param \Drupal\islandora\MediaSource\MediaSourceService $media_source_service
* Utils to get the source file from media.
*/
public function __construct(
$plugin_id,
Expand All @@ -71,7 +82,8 @@ public function __construct(
AccountInterface $current_user,
EntityStorageInterface $image_style_storage,
IslandoraUtils $utils,
FileUrlGeneratorInterface $file_url_generator
FileUrlGeneratorInterface $file_url_generator,
MediaSourceService $media_source_service
) {
parent::__construct(
$plugin_id,
Expand All @@ -86,6 +98,7 @@ public function __construct(
$file_url_generator
);
$this->utils = $utils;
$this->mediaSourceService = $media_source_service;
}

/**
Expand All @@ -103,39 +116,109 @@ public static function create(ContainerInterface $container, array $configuratio
$container->get('current_user'),
$container->get('entity_type.manager')->getStorage('image_style'),
$container->get('islandora.utils'),
$container->get('file_url_generator')
$container->get('file_url_generator'),
$container->get('islandora.media_source_service')
);
}

/**
* {@inheritdoc}
*/
public static function defaultSettings() {
return [
'image_alt_text' => 'local',
] + parent::defaultSettings();
}

/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$element = parent::settingsForm($form, $form_state);
$alt_text_options = [
'local' => $this->t('Local'),
'original_file_fallback' => $this->t('Local, with fallback to Original File'),
'original_file' => $this->t('Original File'),
];
$element['image_alt_text'] = [
'#title' => $this->t('Alt text source'),
'#type' => 'select',
'#default_value' => $this->getSetting('image_alt_text'),
'#empty_option' => $this->t('None'),
'#options' => $alt_text_options,
];
return $element;
}

/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements = parent::viewElements($items, $langcode);

$image_link_setting = $this->getSetting('image_link');
// Check if the formatter involves a link.
if ($image_link_setting != 'content') {
$alt_text_setting = $this->getsetting('image_alt_text');

// Check if we can leave the image as-is:
if ($image_link_setting !== 'content' && $alt_text_setting === 'local') {
return $elements;
}

$entity = $items->getEntity();
if ($entity->isNew() || $entity->getEntityTypeId() != 'media') {
if ($entity->isNew() || $entity->getEntityTypeId() !== 'media') {
return $elements;
}

$node = $this->utils->getParentNode($entity);

if ($node === NULL) {
return $elements;
if ($alt_text_setting === 'none') {
foreach ($elements as $element) {
$element['#item']->set('alt', '');
}
}

$url = $node->toUrl();
if ($image_link_setting === 'content' || $alt_text_setting === 'original_file' || $alt_text_setting === 'original_file_fallback') {
$node = $this->utils->getParentNode($entity);
if ($node === NULL) {
return $elements;
}

foreach ($elements as &$element) {
$element['#url'] = $url;
}
if ($image_link_setting === 'content') {
// Set image link.
$url = $node->toUrl();
foreach ($elements as &$element) {
$element['#url'] = $url;
}
unset($element);
}

if ($alt_text_setting === 'original_file' || $alt_text_setting === 'original_file_fallback') {
$original_file_term = $this->utils->getTermForUri("http://pcdm.org/use#OriginalFile");

if ($original_file_term !== NULL) {
$original_file_media = $this->utils->getMediaWithTerm($node, $original_file_term);

if ($original_file_media !== NULL) {
$source_field_name = $this->mediaSourceService->getSourceFieldName($original_file_media->bundle());
if ($original_file_media->hasField($source_field_name)) {
$original_file_files = $original_file_media->get($source_field_name);
// XXX: Support the multifile media use case where there could
// be multiple files in the source field.
$i = 0;
foreach ($original_file_files as $file) {
if (isset($file->alt)) {
$alt_text = $file->get('alt')->getValue();
if (isset($elements[$i])) {
$element = $elements[$i];
if ($alt_text_setting === 'original_file' || $element['#item']->get('alt')->getValue() === '') {
$elements[$i]['#item']->set('alt', $alt_text);
}
$i++;
}
}
}
}
}
}
}
}
return $elements;
}

Expand Down

0 comments on commit 14c4e42

Please sign in to comment.