Browse Source

initial commit

main
ppound 2 years ago
commit
3df89736bf
  1. 82
      src/Plugin/Block/ReserveBlock.php
  2. 5
      templates/upei-roblib-reserves-block.html.twig
  3. 4
      upei_roblib_reserves.info.yml
  4. 14
      upei_roblib_reserves.module
  5. 56
      xsl/atom2html.xsl

82
src/Plugin/Block/ReserveBlock.php

@ -0,0 +1,82 @@
<?php
namespace Drupal\upei_roblib_reserves\Plugin\Block;
use Drupal\Core\Block\BlockBase;
/**
* Provides a Reserves Block base on Evergreen bookbags.
*
* @Block(
* id = "upei_roblib_reserves_block",
* admin_label = @Translation("Roblib Reserves Block"),
* category = @Translation("UPEI Roblib"),
* )
*/
class ReserveBlock extends BlockBase {
/**
* {@inheritdoc}
*/
public function build() {
$html = $this->getReserves();
if (empty($html)) {
return '';
}
return [
'#theme' => 'upei_roblib_reserves_block',
'#atom_to_html' => [
'#markup' => $html,
],
];
}
/**
* {@inheritdoc}
*/
public function getCacheMaxAge() {
//Reading dynamic content from external source so no caching.
return 0;
}
/**
* Queries Evergreen for an Atom XML feed based on book bag list.
*
* @return string
* HTML created from Atom XML feed.
*/
protected function getReserves() {
$node = \Drupal::routeMatch()->getParameter('node');
$html = '';
if ($node && $node instanceof \Drupal\node\NodeInterface && $node->bundle() == 'course_reserve') {
$book_bag_id = (string) $node->field_bookbag_id->value;
if (empty($book_bag_id)) {
return '';
}
//The evergreen ILS base URL.
$book_bag_base_url = 'http://islandpines.roblib.upei.ca/opac/extras/feed/bookbag/atom-full/';
try {
$response = \Drupal::httpClient()->get($book_bag_base_url . $book_bag_id);
$atom = (string) $response->getBody();
if (empty($atom)) {
return '';
}
}
catch (RequestException $e) {
return '';
}
$path = \Drupal::service('extension.list.module')->getPath('upei_roblib_reserves');
$xslt = new \XSLTProcessor();
$xsl = new \DOMDocument();
$xsl->load($path . '/xsl/atom2html.xsl');
$xslt->importStylesheet($xsl);
$xml = new \DomDocument();
$xml->loadXML($atom);
$html = $xslt->transformToXML($xml);
}
return $html;
}
}

5
templates/upei-roblib-reserves-block.html.twig

@ -0,0 +1,5 @@
{% if atom_to_html %}
<h3>Materials Available from the Service Desk</h3>
<div class="upei-roblib-reserves">{{ atom_to_html }}</div>
{% endif %}

4
upei_roblib_reserves.info.yml

@ -0,0 +1,4 @@
name: UPEI Robertson Library Reserves Module
type: module
core_version_requirement: ^9 || ^10
description: A module to consume a bookbag from evergreen and display the results in Drupal

14
upei_roblib_reserves.module

@ -0,0 +1,14 @@
<?php
/**
* Implements hook_theme().
*/
function upei_roblib_reserves_theme($existing, $type, $theme, $path): array {
return [
'upei_roblib_reserves_block' => [
'variables' => [
'atom_to_html' => NULL,
],
],
];
}

56
xsl/atom2html.xsl

@ -0,0 +1,56 @@
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:v1="http://open-ils.org/spec/holdings/v1"
exclude-result-prefixes="atom v1"
>
<xsl:output encoding="utf-8" indent="yes" method="html"/>
<xsl:variable name="opac_link"
select="/atom:feed/atom:entry/atom:link[@rel='opac']"/>
<xsl:template match="/">
<xsl:apply-templates select="atom:feed/atom:entry"/>
</xsl:template>
<xsl:template match="atom:entry">
<xsl:for-each select=".">
<div class="atom-entry">
<div class="atom-title">
<a>
<xsl:attribute name='href'>
<xsl:value-of
select="atom:link[@rel='opac']/@href"/>
</xsl:attribute>
<xsl:value-of select="atom:title"/>
</a>
</div>
<div class="atom-publication-date">
Publication date:
<xsl:value-of select="atom:published"/>
</div>
<div class="atom-author">Authors:
<ul class="atom-list">
<xsl:for-each select="atom:author/atom:name">
<li class="atom-list-item">
<xsl:value-of select="."/>
</li>
</xsl:for-each>
</ul>
</div>
<div class="atom-holdings">Holdings:
<ul class="atom-list">
<xsl:for-each select="v1:holdings/v1:volumes/v1:volume/v1:copies/v1:copy">
<li class="atom-available">
<xsl:value-of select="v1:location"/><xsl:text> </xsl:text>
(<xsl:value-of select="v1:status"/>)
</li>
</xsl:for-each>
</ul>
</div>
</div>
<br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Loading…
Cancel
Save