181 lines
6.9 KiB
PHP
181 lines
6.9 KiB
PHP
<?php
|
|
namespace Kitodo\Dlf\Common;
|
|
|
|
/**
|
|
* (c) Kitodo. Key to digital objects e.V. <contact@kitodo.org>
|
|
*
|
|
* This file is part of the Kitodo and TYPO3 projects.
|
|
*
|
|
* @license GNU General Public License version 3 or later.
|
|
* For the full copyright and license information, please read the
|
|
* LICENSE.txt file that was distributed with this source code.
|
|
*/
|
|
|
|
/**
|
|
* Document Type Checker for usage as Typoscript Condition
|
|
* @see dlf/ext_localconf.php->user_dlf_docTypeCheck()
|
|
*
|
|
* @author Alexander Bigga <alexander.bigga@slub-dresden.de>
|
|
* @package TYPO3
|
|
* @subpackage dlf
|
|
* @access public
|
|
*/
|
|
class DocumentTypeCheck {
|
|
/**
|
|
* This holds the current document
|
|
*
|
|
* @var \Kitodo\Dlf\Common\Document
|
|
* @access protected
|
|
*/
|
|
protected $doc;
|
|
|
|
/**
|
|
* This holds the extension key
|
|
*
|
|
* @var string
|
|
* @access protected
|
|
*/
|
|
protected $extKey = 'dlf';
|
|
|
|
/**
|
|
* This holds the current DLF plugin parameters
|
|
* @see __contruct()
|
|
*
|
|
* @var array
|
|
* @access protected
|
|
*/
|
|
protected $piVars = [];
|
|
|
|
/**
|
|
* This holds the DLF parameter prefix
|
|
*
|
|
* @var string
|
|
* @access protected
|
|
*/
|
|
protected $prefixId = 'tx_dlf';
|
|
|
|
/**
|
|
* Check the current document's type.
|
|
*
|
|
* @access public
|
|
*
|
|
* @return string The type of the current document
|
|
*/
|
|
public function getDocType() {
|
|
// Load current document.
|
|
$this->loadDocument();
|
|
if ($this->doc === NULL) {
|
|
// Quit without doing anything if document not available.
|
|
return '';
|
|
}
|
|
$toc = $this->doc->tableOfContents;
|
|
/*
|
|
* Get the document type
|
|
*
|
|
* 1. newspaper
|
|
* case 1) - type=newspaper
|
|
* - children array ([0], [1], [2], ...) -> type = year --> Newspaper Anchor File
|
|
* case 2) - type=newspaper
|
|
* - children array ([0]) --> type = year
|
|
* - children array ([0], [1], [2], ...) --> type = month --> Year Anchor File
|
|
* case 3) - type=newspaper
|
|
* - children array ([0]) --> type = year
|
|
* - children array ([0]) --> type = month
|
|
* - children array ([0], [1], [2], ...) --> type = day --> Issue
|
|
*/
|
|
switch ($toc[0]['type']) {
|
|
case 'newspaper':
|
|
$nodes_year = $this->doc->mets->xpath('./mets:structMap[@TYPE="LOGICAL"]/mets:div[@TYPE="newspaper"]/mets:div[@TYPE="year"]');
|
|
if (count($nodes_year) > 1) {
|
|
// Multiple years means this is a newspaper's anchor file.
|
|
return 'newspaper';
|
|
} else {
|
|
$nodes_month = $this->doc->mets->xpath('./mets:structMap[@TYPE="LOGICAL"]/mets:div[@TYPE="newspaper"]/mets:div[@TYPE="year"]/mets:div[@TYPE="month"]');
|
|
$nodes_day = $this->doc->mets->xpath('./mets:structMap[@TYPE="LOGICAL"]/mets:div[@TYPE="newspaper"]/mets:div[@TYPE="year"]/mets:div[@TYPE="month"]/mets:div[@TYPE="day"]');
|
|
$nodes_issue = $this->doc->mets->xpath('./mets:structMap[@TYPE="LOGICAL"]/mets:div[@TYPE="newspaper"]/mets:div[@TYPE="year"]//mets:div[@TYPE="issue"]');
|
|
$nodes_issue_current = $this->doc->mets->xpath('./mets:structMap[@TYPE="LOGICAL"]/mets:div[@TYPE="newspaper"]/mets:div[@TYPE="year"]//mets:div[@TYPE="issue"]/@DMDID');
|
|
if (count($nodes_year) == 1
|
|
&& count($nodes_issue) == 0) {
|
|
// It's possible to have only one year in the newspaper's anchor file.
|
|
return 'newspaper';
|
|
} elseif (count($nodes_year) == 1
|
|
&& count($nodes_month) > 1) {
|
|
// One year, multiple months means this is a year's anchor file.
|
|
return 'year';
|
|
} elseif (count($nodes_year) == 1
|
|
&& count($nodes_month) == 1
|
|
&& count($nodes_day) > 1) {
|
|
// One year, one month, one or more days means this is a year's anchor file.
|
|
return 'year';
|
|
} elseif (count($nodes_year) == 1
|
|
&& count($nodes_month) == 1
|
|
&& count($nodes_day) == 1
|
|
&& count($nodes_issue_current) == 0) {
|
|
// One year, one month, a single day, one or more issues (but not the current one) means this is a year's anchor file.
|
|
return 'year';
|
|
} else {
|
|
// In all other cases we assume it's a newspaper's issue.
|
|
return 'issue';
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
return $toc[0]['type'];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Loads the current document into $this->doc
|
|
*
|
|
* @access protected
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function loadDocument() {
|
|
// Check for required variable.
|
|
if (!empty($this->piVars['id'])) {
|
|
// Get instance of \Kitodo\Dlf\Common\Document.
|
|
$this->doc = Document::getInstance($this->piVars['id']);
|
|
if (!$this->doc->ready) {
|
|
// Destroy the incomplete object.
|
|
$this->doc = NULL;
|
|
Helper::devLog('Failed to load document with UID '.$this->piVars['id'], DEVLOG_SEVERITY_WARNING);
|
|
}
|
|
} elseif (!empty($this->piVars['recordId'])) {
|
|
// Get UID of document with given record identifier.
|
|
$result = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
|
|
'tx_dlf_documents.uid',
|
|
'tx_dlf_documents',
|
|
'tx_dlf_documents.record_id='.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->piVars['recordId'], 'tx_dlf_documents')
|
|
.Helper::whereClause('tx_dlf_documents'),
|
|
'',
|
|
'',
|
|
'1'
|
|
);
|
|
if ($GLOBALS['TYPO3_DB']->sql_num_rows($result) == 1) {
|
|
list ($this->piVars['id']) = $GLOBALS['TYPO3_DB']->sql_fetch_row($result);
|
|
// Set superglobal $_GET array.
|
|
$_GET[$this->prefixId]['id'] = $this->piVars['id'];
|
|
// Unset variable to avoid infinite looping.
|
|
unset ($this->piVars['recordId'], $_GET[$this->prefixId]['recordId']);
|
|
// Try to load document.
|
|
$this->loadDocument();
|
|
} else {
|
|
Helper::devLog('Failed to load document with record ID "'.$this->piVars['recordId'].'"', DEVLOG_SEVERITY_WARNING);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initializes the hook by setting initial variables.
|
|
*
|
|
* @access public
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct() {
|
|
// Load current plugin parameters.
|
|
$this->piVars = \TYPO3\CMS\Core\Utility\GeneralUtility::_GPmerged($this->prefixId);
|
|
}
|
|
}
|