Drupal modules for browsing and managing Fedora-based digital repositories.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

69 lines
1.9 KiB

<?php
namespace Drupal\islandora\EventSubscriber;
use Drupal\node\NodeInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Class NodeLinkHeaderSubscriber.
*
* @package Drupal\islandora\EventSubscriber
*/
class NodeLinkHeaderSubscriber extends LinkHeaderSubscriber implements EventSubscriberInterface {
/**
* Adds node-specific link headers to appropriate responses.
*
* @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
* Event containing the response.
*/
public function onResponse(FilterResponseEvent $event) {
$response = $event->getResponse();
$node = $this->getObject($response, 'node');
if ($node === FALSE) {
return;
}
$links = array_merge(
$this->generateEntityReferenceLinks($node),
$this->generateRelatedMediaLinks($node),
$this->generateRestLinks($node)
);
// Add the link headers to the response.
if (empty($links)) {
return;
}
$response->headers->set('Link', $links, FALSE);
}
/**
* Generates link headers for media associated with a node.
*/
protected function generateRelatedMediaLinks(NodeInterface $node) {
$links = [];
foreach ($this->utils->getMedia($node) as $media) {
$url = $this->utils->getEntityUrl($media);
foreach ($media->referencedEntities() as $term) {
if ($term->getEntityTypeId() == 'taxonomy_term' && $term->hasField('field_external_uri')) {
$field = $term->get('field_external_uri');
if (!$field->isEmpty()) {
$link = $field->first()->getValue();
$uri = $link['uri'];
if (strpos($uri, 'http://pcdm.org/use#') === 0) {
$title = $term->label();
$links[] = "<$url>; rel=\"related\"; title=\"$title\"";
}
}
}
}
}
return $links;
}
}