/** * Main function of the script. * * @access public * * @return void */ public function main() { switch ((string) $this->cli_args['_DEFAULT'][1]) { case 'index': // Add command line arguments. $this->cli_options[] = array('-doc UID/URL', 'UID or URL of the document.'); $this->cli_options[] = array('-pid UID', 'UID of the page the document should be added to.'); $this->cli_options[] = array('-core UID', 'UID of the Solr core the document should be added to.'); // Check the command line arguments. $this->cli_validateArgs(); // Get the document... $doc =& tx_dlf_document::getInstance($this->cli_args['-doc'][0], $this->cli_args['-pid'][0], TRUE); if ($doc->ready) { // ...and save it to the database... if (!$doc->save(intval($this->cli_args['-pid'][0]), intval($this->cli_args['-core'][0]))) { $this->cli_echo('ERROR: Document ' . $this->cli_args['-doc'][0] . ' not saved and indexed.' . LF, TRUE); exit(1); } } else { $this->cli_echo('ERROR: Document ' . $this->cli_args['-doc'][0] . ' could not be loaded.' . LF, TRUE); exit(1); } break; default: $this->cli_help(); break; } exit(0); }
/** * Main function of the script. * * @access public * * @return void */ public function main() { switch ((string) $this->cli_args['_DEFAULT'][1]) { // (Re-)Index a single document. case 'index': // Add command line arguments. $this->cli_options[] = array('-doc UID/URL', 'UID or URL of the document.'); $this->cli_options[] = array('-pid UID', 'UID of the page the document should be added to.'); $this->cli_options[] = array('-core UID', 'UID of the Solr core the document should be added to.'); // Check the command line arguments. $this->cli_validateArgs(); // Get the document... $doc =& tx_dlf_document::getInstance($this->cli_args['-doc'][0], $this->cli_args['-pid'][0], TRUE); if ($doc->ready) { // ...and save it to the database... if (!$doc->save(intval($this->cli_args['-pid'][0]), intval($this->cli_args['-core'][0]))) { $this->cli_echo('ERROR: Document ' . $this->cli_args['-doc'][0] . ' not saved and indexed.' . LF, TRUE); exit(1); } } else { $this->cli_echo('ERROR: Document ' . $this->cli_args['-doc'][0] . ' could not be loaded.' . LF, TRUE); exit(1); } break; // Re-index all documents of a collection. // Re-index all documents of a collection. case 'reindex': // Add command line arguments. $this->cli_options[] = array('-coll UID', 'UID of the collection.'); $this->cli_options[] = array('-pid UID', 'UID of the page the document should be added to.'); $this->cli_options[] = array('-core UID', 'UID of the Solr core the document should be added to.'); // Check the command line arguments. $this->cli_validateArgs(); // Get the collection. $result = $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query('tx_dlf_documents.uid AS uid', 'tx_dlf_documents', 'tx_dlf_relations', 'tx_dlf_collections', 'AND tx_dlf_collections.uid=' . intval($this->cli_args['-coll'][0]) . ' AND tx_dlf_collections.pid=' . intval($this->cli_args['-pid'][0]) . ' AND tx_dlf_relations.ident=' . $GLOBALS['TYPO3_DB']->fullQuoteStr('docs_colls', 'tx_dlf_relations') . tx_dlf_helper::whereClause('tx_dlf_documents') . tx_dlf_helper::whereClause('tx_dlf_collections'), '', '', ''); while ($resArray = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result)) { // Get the document... $doc =& tx_dlf_document::getInstance($resArray['uid'], $this->cli_args['-pid'][0], TRUE); if ($doc->ready) { // ...and save it to the database... if (!$doc->save(intval($this->cli_args['-pid'][0]), intval($this->cli_args['-core'][0]))) { $this->cli_echo('ERROR: Document ' . $resArray['uid'] . ' not saved and indexed.' . LF, TRUE); exit(1); } } else { $this->cli_echo('ERROR: Document ' . $resArray['uid'] . ' could not be loaded.' . LF, TRUE); exit(1); } } break; default: $this->cli_help(); break; } exit(0); }
/** * Loads the current document into $this->doc * * @access protected * * @return void */ protected function loadDocument() { // Check for required variable. if (!empty($this->piVars['id']) && !empty($this->conf['pages'])) { // Should we exclude documents from other pages than $this->conf['pages']? $pid = !empty($this->conf['excludeOther']) ? intval($this->conf['pages']) : 0; // Get instance of tx_dlf_document. $this->doc =& tx_dlf_document::getInstance($this->piVars['id'], $pid); if (!$this->doc->ready) { // Destroy the incomplete object. if (TYPO3_DLOG) { t3lib_div::devLog('[tx_dlf_plugin->loadDocument()] Failed to load document with UID "' . $this->piVars['id'] . '"', $this->extKey, SYSLOG_SEVERITY_ERROR); } $this->doc = NULL; } else { // Set configuration PID. $this->doc->cPid = $this->conf['pages']; } } 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') . tx_dlf_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 { if (TYPO3_DLOG) { t3lib_div::devLog('[tx_dlf_plugin->loadDocument()] Failed to load document with record ID "' . $this->piVars['recordId'] . '"', $this->extKey, SYSLOG_SEVERITY_ERROR); } } } else { if (TYPO3_DLOG) { t3lib_div::devLog('[tx_dlf_plugin->loadDocument()] Invalid UID "' . $this->piVars['id'] . '" or PID "' . $this->conf['pages'] . '" for document loading', $this->extKey, SYSLOG_SEVERITY_ERROR); } } }
/** * Processes a physical unit for the Solr index * * @access protected * * @param tx_dlf_document &$doc: The METS document * @param integer $page: The page number * @param array $physicalUnit: Array of the physical unit to process * * @return integer 0 on success or 1 on failure */ protected static function processPhysical(tx_dlf_document &$doc, $page, array $physicalUnit) { $errors = 0; // Read extension configuration. $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][self::$extKey]); if (!empty($physicalUnit['files'][$extConf['fileGrpFulltext']])) { $file = $doc->getFileLocation($physicalUnit['files'][$extConf['fileGrpFulltext']]); // Load XML file. if (\TYPO3\CMS\Core\Utility\GeneralUtility::isValidUrl($file) || version_compare(phpversion(), '5.3.3', '<')) { // Set user-agent to identify self when fetching XML data. if (!empty($extConf['useragent'])) { @ini_set('user_agent', $extConf['useragent']); } // Turn off libxml's error logging. $libxmlErrors = libxml_use_internal_errors(TRUE); // disable entity loading $previousValueOfEntityLoader = libxml_disable_entity_loader(TRUE); // Load XML from file. $xml = simplexml_load_string(file_get_contents($file)); // reset entity loader setting libxml_disable_entity_loader($previousValueOfEntityLoader); // Reset libxml's error logging. libxml_use_internal_errors($libxmlErrors); if ($xml === FALSE) { return 1; } } else { return 1; } // Load class. if (!class_exists('Apache_Solr_Document')) { require_once \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName('EXT:' . self::$extKey . '/lib/SolrPhpClient/Apache/Solr/Document.php'); } // Create new Solr document. $solrDoc = new Apache_Solr_Document(); // Create unique identifier from document's UID and unit's XML ID. $solrDoc->setField('id', $doc->uid . $physicalUnit['id']); $solrDoc->setField('uid', $doc->uid); $solrDoc->setField('pid', $doc->pid); $solrDoc->setField('page', $page); if (!empty($physicalUnit['files'][$extConf['fileGrpThumbs']])) { $solrDoc->setField('thumbnail', $doc->getFileLocation($physicalUnit['files'][$extConf['fileGrpThumbs']])); } $solrDoc->setField('partof', $doc->parentId); $solrDoc->setField('root', $doc->rootId); $solrDoc->setField('sid', $physicalUnit['id']); $solrDoc->setField('toplevel', FALSE); $solrDoc->setField('type', $physicalUnit['type'], self::$fields['fieldboost']['type']); $solrDoc->setField('fulltext', tx_dlf_alto::getRawText($xml)); try { self::$solr->service->addDocument($solrDoc); } catch (Exception $e) { if (!defined('TYPO3_cliMode')) { $message = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Messaging\\FlashMessage', tx_dlf_helper::getLL('flash.solrException', TRUE) . '<br />' . htmlspecialchars($e->getMessage()), tx_dlf_helper::getLL('flash.error', TRUE), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR, TRUE); tx_dlf_helper::addMessage($message); } return 1; } } return $errors; }
/** * Post-processing hook for the process_cmdmap() method. * * @access public * * @param string $command: 'move', 'copy', 'localize', 'inlineLocalizeSynchronize', 'delete' or 'undelete' * @param string $table: The destination table * @param integer $id: The uid of the record * @param mixed $value: The value for the command * @param \TYPO3\CMS\Core\DataHandling\DataHandler $pObj: The parent object * * @return void */ public function processCmdmap_postProcess($command, $table, $id, $value, $pObj) { if (in_array($command, array('move', 'delete', 'undelete')) && $table == 'tx_dlf_documents') { // Get Solr core. $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('tx_dlf_solrcores.uid', 'tx_dlf_solrcores,tx_dlf_documents', 'tx_dlf_solrcores.uid=tx_dlf_documents.solrcore AND tx_dlf_documents.uid=' . intval($id) . tx_dlf_helper::whereClause('tx_dlf_solrcores'), '', '', '1'); if ($GLOBALS['TYPO3_DB']->sql_num_rows($result)) { list($core) = $GLOBALS['TYPO3_DB']->sql_fetch_row($result); switch ($command) { case 'move': case 'delete': // Establish Solr connection. if ($solr = tx_dlf_solr::getInstance($core)) { // Delete Solr document. $solr->service->deleteByQuery('uid:' . $id); $solr->service->commit(); if ($command == 'delete') { break; } } case 'undelete': // Reindex document. $doc =& tx_dlf_document::getInstance($id); if ($doc->ready) { $doc->save($doc->pid, $core); } else { if (TYPO3_DLOG) { \TYPO3\CMS\Core\Utility\GeneralUtility::devLog('[tx_dlf_tcemain->processCmdmap_postProcess(' . $command . ', ' . $table . ', ' . $id . ', ' . $value . ', [' . get_class($pObj) . '])] Failed to re-index document with UID "' . $id . '"', $this->extKey, SYSLOG_SEVERITY_ERROR); } } break; } } } }
/** * The main method of the PlugIn * * @access public * * @param string $content: The PlugIn content * @param array $conf: The PlugIn configuration * * @return string The content that is displayed on the website */ public function main($content, $conf) { $this->init($conf); // Disable caching for this plugin. $this->setCache(FALSE); // Quit without doing anything if required variables are not set. if (empty($this->conf['solrcore'])) { if (TYPO3_DLOG) { \TYPO3\CMS\Core\Utility\GeneralUtility::devLog('[tx_dlf_search->main(' . $content . ', [data])] Incomplete plugin configuration', $this->extKey, SYSLOG_SEVERITY_WARNING, $conf); } return $content; } if (!isset($this->piVars['query']) && empty($this->piVars['extQuery'])) { // Add javascript for search suggestions if enabled and jQuery autocompletion is available. if (!empty($this->conf['suggest'])) { $this->addAutocompleteJS(); } // Load template file. if (!empty($this->conf['templateFile'])) { $this->template = $this->cObj->getSubpart($this->cObj->fileResource($this->conf['templateFile']), '###TEMPLATE###'); } else { $this->template = $this->cObj->getSubpart($this->cObj->fileResource('EXT:dlf/plugins/search/template.tmpl'), '###TEMPLATE###'); } // Configure @action URL for form. $linkConf = array('parameter' => $GLOBALS['TSFE']->id, 'forceAbsoluteUrl' => 1); // Fill markers. $markerArray = array('###ACTION_URL###' => $this->cObj->typoLink_URL($linkConf), '###LABEL_QUERY###' => $this->pi_getLL('label.query'), '###LABEL_SUBMIT###' => $this->pi_getLL('label.submit'), '###FIELD_QUERY###' => $this->prefixId . '[query]', '###QUERY###' => '', '###FULLTEXTSWITCH###' => $this->addFulltextSwitch(), '###FIELD_DOC###' => $this->conf['searchIn'] == 'document' || $this->conf['searchIn'] == 'all' ? $this->addCurrentDocument() : '', '###FIELD_COLL###' => $this->conf['searchIn'] == 'collection' || $this->conf['searchIn'] == 'all' ? $this->addCurrentCollection() : '', '###ADDITIONAL_INPUTS###' => $this->addEncryptedCoreName(), '###FACETS_MENU###' => $this->addFacetsMenu()); // Get additional fields for extended search. $extendedSearch = $this->addExtendedSearch(); // Display search form. $content .= $this->cObj->substituteSubpart($this->cObj->substituteMarkerArray($this->template, $markerArray), '###EXT_SEARCH_ENTRY###', $extendedSearch); return $this->pi_wrapInBaseClass($content); } else { // Instantiate search object. $solr = tx_dlf_solr::getInstance($this->conf['solrcore']); if (!$solr->ready) { if (TYPO3_DLOG) { \TYPO3\CMS\Core\Utility\GeneralUtility::devLog('[tx_dlf_search->main(' . $content . ', [data])] Apache Solr not available', $this->extKey, SYSLOG_SEVERITY_ERROR, $conf); } return $content; } // Build label for result list. $label = $this->pi_getLL('search', '', TRUE); if (!empty($this->piVars['query'])) { $label .= htmlspecialchars(sprintf($this->pi_getLL('for', ''), $this->piVars['query'])); } // Prepare query parameters. $params = array(); // Set search query. if (!empty($this->conf['fulltext']) && !empty($this->piVars['fulltext'])) { // Search in fulltext field if applicable. $query = 'fulltext:(' . tx_dlf_solr::escapeQuery($this->piVars['query']) . ')'; // Add highlighting for fulltext. $params['hl'] = 'true'; $params['hl.fl'] = 'fulltext'; } else { // Retain given search field if valid. $query = tx_dlf_solr::escapeQueryKeepField($this->piVars['query'], $this->conf['pages']); } // Add extended search query. if (!empty($this->piVars['extQuery']) && is_array($this->piVars['extQuery'])) { $allowedOperators = array('AND', 'OR', 'NOT'); $allowedFields = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $this->conf['extendedFields'], TRUE); for ($i = 0; $i < count($this->piVars['extQuery']); $i++) { if (!empty($this->piVars['extQuery'][$i])) { if (in_array($this->piVars['extOperator'][$i], $allowedOperators) && in_array($this->piVars['extField'][$i], $allowedFields)) { if (!empty($query)) { $query .= ' ' . $this->piVars['extOperator'][$i] . ' '; } $query .= tx_dlf_indexing::getIndexFieldName($this->piVars['extField'][$i], $this->conf['pages']) . ':(' . tx_dlf_solr::escapeQuery($this->piVars['extQuery'][$i]) . ')'; } } } } // Add filter query for faceting. if (!empty($this->piVars['fq'])) { $params['fq'] = $this->piVars['fq']; } // Add filter query for in-document searching. if ($this->conf['searchIn'] == 'document' || $this->conf['searchIn'] == 'all') { if (!empty($this->piVars['id']) && \TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($this->piVars['id'])) { $params['fq'][] = 'uid:(' . $this->piVars['id'] . ') OR partof:(' . $this->piVars['id'] . ')'; $label .= htmlspecialchars(sprintf($this->pi_getLL('in', ''), tx_dlf_document::getTitle($this->piVars['id']))); } } // Add filter query for in-collection searching. if ($this->conf['searchIn'] == 'collection' || $this->conf['searchIn'] == 'all') { if (!empty($this->piVars['collection']) && \TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($this->piVars['collection'])) { $index_name = tx_dlf_helper::getIndexName($this->piVars['collection'], 'tx_dlf_collections', $this->conf['pages']); $params['fq'][] = 'collection_faceting:("' . tx_dlf_solr::escapeQuery($index_name) . '")'; $label .= sprintf($this->pi_getLL('in', '', TRUE), tx_dlf_helper::translate($index_name, 'tx_dlf_collections', $this->conf['pages'])); } } // Add filter query for collection restrictions. if ($this->conf['collections']) { $collIds = explode(',', $this->conf['collections']); $collIndexNames = array(); foreach ($collIds as $collId) { $collIndexNames[] = tx_dlf_solr::escapeQuery(tx_dlf_helper::getIndexName(intval($collId), 'tx_dlf_collections', $this->conf['pages'])); } // Last value is fake and used for distinction in $this->addCurrentCollection() $params['fq'][] = 'collection_faceting:("' . implode('" OR "', $collIndexNames) . '" OR "FakeValueForDistinction")'; } // Set search parameters. $solr->limit = max(intval($this->conf['limit']), 1); $solr->cPid = $this->conf['pages']; $solr->params = $params; // Perform search. $results = $solr->search($query); $results->metadata = array('label' => $label, 'description' => '<p class="tx-dlf-search-numHits">' . htmlspecialchars(sprintf($this->pi_getLL('hits', ''), $solr->numberOfHits, count($results))) . '</p>', 'thumbnail' => '', 'options' => $results->metadata['options']); $results->save(); // Clean output buffer. \TYPO3\CMS\Core\Utility\GeneralUtility::cleanOutputBuffers(); // Keep some plugin variables. $linkConf['parameter'] = $this->conf['targetPid']; if (!empty($this->piVars['order'])) { $linkConf['additionalParams'] = \TYPO3\CMS\Core\Utility\GeneralUtility::implodeArrayForUrl($this->prefixId, array('order' => $this->piVars['order'], 'asc' => !empty($this->piVars['asc']) ? '1' : '0'), '', TRUE, FALSE); } // Send headers. header('Location: ' . \TYPO3\CMS\Core\Utility\GeneralUtility::locationHeaderUrl($this->cObj->typoLink_URL($linkConf))); // Flush output buffer and end script processing. ob_end_flush(); exit; } }
/** * This saves the document to the database and index * * @access public * * @param integer $pid: The PID of the saved record * @param integer $core: The UID of the Solr core for indexing * * @return boolean TRUE on success or FALSE on failure */ public function save($pid = 0, $core = 0) { // Save parameters for logging purposes. $_pid = $pid; $_core = $core; if (TYPO3_MODE !== 'BE') { if (TYPO3_DLOG) { t3lib_div::devLog('[tx_dlf_document->save(' . $_pid . ', ' . $_core . ')] Saving a document is only allowed in the backend', self::$extKey, SYSLOG_SEVERITY_ERROR); } return FALSE; } // Make sure $pid is a non-negative integer. $pid = max(intval($pid), 0); // Make sure $core is a non-negative integer. $core = max(intval($core), 0); // If $pid is not given, try to get it elsewhere. if (!$pid && $this->pid) { // Retain current PID. $pid = $this->pid; } elseif (!$pid) { if (TYPO3_DLOG) { t3lib_div::devLog('[tx_dlf_document->save(' . $_pid . ', ' . $_core . ')] Invalid PID "' . $pid . '" for document saving', self::$extKey, SYSLOG_SEVERITY_ERROR); } return FALSE; } // Set PID for metadata definitions. $this->cPid = $pid; // Set UID placeholder if not updating existing record. if ($pid != $this->pid) { $this->uid = uniqid('NEW'); } // Get metadata array. $metadata = $this->getTitledata($pid); // Check for record identifier. if (empty($metadata['record_id'][0])) { if (TYPO3_DLOG) { t3lib_div::devLog('[tx_dlf_document->save(' . $_pid . ', ' . $_core . ')] No record identifier found to avoid duplication', self::$extKey, SYSLOG_SEVERITY_ERROR); } return FALSE; } // Load plugin configuration. $conf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][self::$extKey]); // Get UID for user "_cli_dlf". $be_user = 0; $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('be_users.uid AS uid', 'be_users', 'username='******'TYPO3_DB']->fullQuoteStr('_cli_dlf', 'be_users') . t3lib_BEfunc::BEenableFields('be_users') . t3lib_BEfunc::deleteClause('be_users'), '', '', '1'); if ($GLOBALS['TYPO3_DB']->sql_num_rows($result)) { list($be_user) = $GLOBALS['TYPO3_DB']->sql_fetch_row($result); } else { if (TYPO3_DLOG) { t3lib_div::devLog('[tx_dlf_document->save(' . $_pid . ', ' . $_core . ')] Backend user "_cli_dlf" not found or disabled', self::$extKey, SYSLOG_SEVERITY_ERROR); } return FALSE; } // Get UID for structure type. $structure = 0; $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('tx_dlf_structures.uid AS uid', 'tx_dlf_structures', 'tx_dlf_structures.pid=' . intval($pid) . ' AND tx_dlf_structures.index_name=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($metadata['type'][0], 'tx_dlf_structures') . tx_dlf_helper::whereClause('tx_dlf_structures'), '', '', '1'); if ($GLOBALS['TYPO3_DB']->sql_num_rows($result)) { list($structure) = $GLOBALS['TYPO3_DB']->sql_fetch_row($result); } else { if (TYPO3_DLOG) { t3lib_div::devLog('[tx_dlf_document->save(' . $_pid . ', ' . $_core . ')] Could not identify document/structure type', self::$extKey, SYSLOG_SEVERITY_ERROR); } return FALSE; } $metadata['type'][0] = $structure; // Get UIDs for collections. $collections = array(); $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('tx_dlf_collections.index_name AS index_name,tx_dlf_collections.uid AS uid', 'tx_dlf_collections', 'tx_dlf_collections.pid=' . intval($pid) . ' AND tx_dlf_collections.cruser_id=' . intval($be_user) . ' AND tx_dlf_collections.fe_cruser_id=0' . tx_dlf_helper::whereClause('tx_dlf_collections'), '', '', ''); for ($i = 0, $j = $GLOBALS['TYPO3_DB']->sql_num_rows($result); $i < $j; $i++) { $resArray = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result); $collUid[$resArray['index_name']] = $resArray['uid']; } foreach ($metadata['collection'] as $collection) { if (!empty($collUid[$collection])) { // Add existing collection's UID. $collections[] = $collUid[$collection]; } else { // Insert new collection. $collNewUid = uniqid('NEW'); $collData['tx_dlf_collections'][$collNewUid] = array('pid' => $pid, 'label' => $collection, 'index_name' => $collection, 'oai_name' => !empty($conf['publishNewCollections']) ? $collection : '', 'description' => '', 'documents' => 0, 'owner' => 0, 'status' => 0); $substUid = tx_dlf_helper::processDB($collData); // Prevent double insertion. unset($collData); // Add new collection's UID. $collections[] = $substUid[$collNewUid]; if (!defined('TYPO3_cliMode')) { $message = t3lib_div::makeInstance('t3lib_FlashMessage', htmlspecialchars(sprintf(tx_dlf_helper::getLL('flash.newCollection'), $collection, $substUid[$collNewUid])), tx_dlf_helper::getLL('flash.attention', TRUE), t3lib_FlashMessage::INFO, TRUE); t3lib_FlashMessageQueue::addMessage($message); } } } // Preserve user-defined collections. $result = $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query('tx_dlf_collections.uid AS uid', 'tx_dlf_documents', 'tx_dlf_relations', 'tx_dlf_collections', 'AND tx_dlf_documents.pid=' . intval($pid) . ' AND tx_dlf_collections.pid=' . intval($pid) . ' AND tx_dlf_documents.uid=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($this->uid, 'tx_dlf_documents') . ' AND NOT (tx_dlf_collections.cruser_id=' . intval($be_user) . ' AND tx_dlf_collections.fe_cruser_id=0) AND tx_dlf_relations.ident=' . $GLOBALS['TYPO3_DB']->fullQuoteStr('docs_colls', 'tx_dlf_relations'), '', '', ''); for ($i = 0, $j = $GLOBALS['TYPO3_DB']->sql_num_rows($result); $i < $j; $i++) { list($collections[]) = $GLOBALS['TYPO3_DB']->sql_fetch_row($result); } $metadata['collection'] = $collections; // Get UID for owner. $owner = 0; $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('tx_dlf_libraries.uid AS uid', 'tx_dlf_libraries', 'tx_dlf_libraries.pid=' . intval($pid) . ' AND tx_dlf_libraries.index_name=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($metadata['owner'][0], 'tx_dlf_libraries') . tx_dlf_helper::whereClause('tx_dlf_libraries'), '', '', '1'); if ($GLOBALS['TYPO3_DB']->sql_num_rows($result)) { list($owner) = $GLOBALS['TYPO3_DB']->sql_fetch_row($result); } else { // Insert new library. $libNewUid = uniqid('NEW'); $libData['tx_dlf_libraries'][$libNewUid] = array('pid' => $pid, 'label' => $metadata['owner'][0], 'index_name' => $metadata['owner'][0], 'website' => '', 'contact' => '', 'image' => '', 'oai_label' => '', 'oai_base' => '', 'opac_label' => '', 'opac_base' => '', 'union_label' => '', 'union_base' => ''); $substUid = tx_dlf_helper::processDB($libData); // Add new library's UID. $owner = $substUid[$libNewUid]; if (!defined('TYPO3_cliMode')) { $message = t3lib_div::makeInstance('t3lib_FlashMessage', htmlspecialchars(sprintf(tx_dlf_helper::getLL('flash.newLibrary'), $metadata['owner'][0], $owner)), tx_dlf_helper::getLL('flash.attention', TRUE), t3lib_FlashMessage::INFO, TRUE); t3lib_FlashMessageQueue::addMessage($message); } } $metadata['owner'][0] = $owner; // Load table of contents. $this->_getTableOfContents(); // Get UID of superior document. $partof = 0; if (!empty($this->tableOfContents[0]['points']) && $this->tableOfContents[0]['points'] != $this->location && !tx_dlf_helper::testInt($this->tableOfContents[0]['points'])) { $superior =& tx_dlf_document::getInstance($this->tableOfContents[0]['points'], $pid); if ($superior->ready) { if ($superior->pid != $pid) { $superior->save($pid, $core); } $partof = $superior->uid; } } // Use the date of publication as alternative sorting metric for parts of multi-part works. if (!empty($partof)) { if (empty($metadata['volume'][0]) && !empty($metadata['year'][0])) { $metadata['volume'] = $metadata['year']; } if (empty($metadata['volume_sorting'][0])) { if (!empty($metadata['year_sorting'][0])) { $metadata['volume_sorting'][0] = $metadata['year_sorting'][0]; } elseif (!empty($metadata['year'][0])) { $metadata['volume_sorting'][0] = $metadata['year'][0]; } } } // Get metadata for lists and sorting. $listed = array(); $sortable = array(); $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('tx_dlf_metadata.index_name AS index_name,tx_dlf_metadata.is_listed AS is_listed,tx_dlf_metadata.is_sortable AS is_sortable', 'tx_dlf_metadata', '(tx_dlf_metadata.is_listed=1 OR tx_dlf_metadata.is_sortable=1) AND tx_dlf_metadata.pid=' . intval($pid) . tx_dlf_helper::whereClause('tx_dlf_metadata'), '', '', ''); while ($resArray = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result)) { if (!empty($metadata[$resArray['index_name']])) { if ($resArray['is_listed']) { $listed[$resArray['index_name']] = $metadata[$resArray['index_name']]; } if ($resArray['is_sortable']) { $sortable[$resArray['index_name']] = $metadata[$resArray['index_name']][0]; } } } // Fill data array. $data['tx_dlf_documents'][$this->uid] = array('pid' => $pid, $GLOBALS['TCA']['tx_dlf_documents']['ctrl']['enablecolumns']['starttime'] => 0, $GLOBALS['TCA']['tx_dlf_documents']['ctrl']['enablecolumns']['endtime'] => 0, 'prod_id' => $metadata['prod_id'][0], 'location' => $this->location, 'record_id' => $metadata['record_id'][0], 'opac_id' => $metadata['opac_id'][0], 'union_id' => $metadata['union_id'][0], 'urn' => $metadata['urn'][0], 'purl' => $metadata['purl'][0], 'title' => $metadata['title'][0], 'title_sorting' => $metadata['title_sorting'][0], 'author' => implode('; ', $metadata['author']), 'year' => implode('; ', $metadata['year']), 'place' => implode('; ', $metadata['place']), 'thumbnail' => $this->_getThumbnail(TRUE), 'metadata' => serialize($listed), 'metadata_sorting' => serialize($sortable), 'structure' => $metadata['type'][0], 'partof' => $partof, 'volume' => $metadata['volume'][0], 'volume_sorting' => $metadata['volume_sorting'][0], 'collections' => $metadata['collection'], 'owner' => $metadata['owner'][0], 'solrcore' => $core, 'status' => 0); // Unhide hidden documents. if (!empty($conf['unhideOnIndex'])) { $data['tx_dlf_documents'][$this->uid][$GLOBALS['TCA']['tx_dlf_documents']['ctrl']['enablecolumns']['disabled']] = 0; } // Process data. $newIds = tx_dlf_helper::processDB($data); // Replace placeholder with actual UID. if (strpos($this->uid, 'NEW') === 0) { $this->uid = $newIds[$this->uid]; $this->pid = $pid; $this->parentId = $partof; } if (!defined('TYPO3_cliMode')) { $message = t3lib_div::makeInstance('t3lib_FlashMessage', htmlspecialchars(sprintf(tx_dlf_helper::getLL('flash.documentSaved'), $metadata['title'][0], $this->uid)), tx_dlf_helper::getLL('flash.done', TRUE), t3lib_FlashMessage::OK, TRUE); t3lib_FlashMessageQueue::addMessage($message); } // Add document to index. if ($core) { tx_dlf_indexing::add($this, $core); } else { if (TYPO3_DLOG) { t3lib_div::devLog('[tx_dlf_document->save(' . $_pid . ', ' . $_core . ')] Invalid UID "' . $core . '" for Solr core', self::$extKey, SYSLOG_SEVERITY_NOTICE); } } return TRUE; }
/** * Main function of the module * * @access public * * @return void */ public function main() { // Is the user allowed to access this page? $access = is_array($this->pageInfo) || $GLOBALS['BE_USER']->isAdmin(); if ($this->id && $access) { // Increase max_execution_time and max_input_time for large documents. if (!ini_get('safe_mode')) { ini_set('max_execution_time', '0'); ini_set('max_input_time', '-1'); } switch ($this->CMD) { case 'indexFile': if (!empty($this->data['id']) && isset($this->data['core'])) { // Save document to database and index. $doc =& tx_dlf_document::getInstance($this->data['id'], $this->id, TRUE); if ($doc->ready) { $doc->save($this->id, $this->data['core']); } else { $_message = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Messaging\\FlashMessage', htmlspecialchars(sprintf(tx_dlf_helper::getLL('flash.fileNotLoaded'), $this->data['id'])), tx_dlf_helper::getLL('flash.error', TRUE), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR, TRUE); tx_dlf_helper::addMessage($_message); } } break; case 'reindexDocs': if (isset($this->data['core'])) { if (!empty($this->data['collection'])) { // Get all documents in this collection. $_result = $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query('tx_dlf_documents.title AS title,tx_dlf_documents.uid AS uid', 'tx_dlf_documents', 'tx_dlf_relations', 'tx_dlf_collections', 'AND tx_dlf_documents.pid=' . intval($this->id) . ' AND tx_dlf_collections.uid=' . intval($this->data['collection']) . ' AND tx_dlf_relations.ident=' . $GLOBALS['TYPO3_DB']->fullQuoteStr('docs_colls', 'tx_dlf_relations') . tx_dlf_helper::whereClause('tx_dlf_documents') . tx_dlf_helper::whereClause('tx_dlf_collections'), 'tx_dlf_documents.uid', '', ''); } else { // Get all documents. $_result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('tx_dlf_documents.title AS title,tx_dlf_documents.uid AS uid', 'tx_dlf_documents', 'tx_dlf_documents.pid=' . intval($this->id) . tx_dlf_helper::whereClause('tx_dlf_documents'), '', '', ''); } // Save them as a list object in user's session. $elements = array(); while ($resArray = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($_result)) { $elements[] = array($resArray['uid'], $resArray['title']); } $this->list = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('tx_dlf_list', $elements); // Start index looping. if (count($this->list) > 0) { $this->indexLoop(); } } break; case 'indexLoop': // Refresh user's session to prevent session timeout. $GLOBALS['BE_USER']->fetchUserSession(); // Get document list from user's session. $this->list = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('tx_dlf_list'); // Continue index looping. if (count($this->list) > 0 && isset($this->data['core'])) { $this->indexLoop(); } else { $_message = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Messaging\\FlashMessage', tx_dlf_helper::getLL('flash.seeLog', TRUE), tx_dlf_helper::getLL('flash.done', TRUE), \TYPO3\CMS\Core\Messaging\FlashMessage::OK, TRUE); tx_dlf_helper::addMessage($_message); } break; } $this->markerArray['CONTENT'] .= tx_dlf_helper::renderFlashMessages(); switch ($this->MOD_SETTINGS['function']) { case 'indexFile': $this->markerArray['CONTENT'] .= $this->getFileForm(); break; case 'reindexDoc': $this->markerArray['CONTENT'] .= $this->getDocList(); break; case 'reindexDocs': $this->markerArray['CONTENT'] .= $this->getCollList(); break; } } else { // TODO: Ändern! $this->markerArray['CONTENT'] .= 'You are not allowed to access this page or have not selected a page, yet.'; } $this->printContent(); }
/** * Renders all sub-entries of one entry * * @access protected * * @param integer $number: The number of the entry * @param string $template: Parsed template subpart * * @return string The rendered entries ready for output */ protected function getSubEntries($number, $template) { $content = ''; foreach ($this->list[$number]['subparts'] as $subpart) { $markerArray['###SUBMETADATA###'] = ''; $markerArray['###SUBTHUMBNAIL###'] = ''; $markerArray['###SUBPREVIEW###'] = ''; $imgAlt = ''; foreach ($this->metadata as $index_name => $metaConf) { $parsedValue = ''; $fieldwrap = $this->parseTS($metaConf['wrap']); do { $value = @array_shift($subpart['metadata'][$index_name]); // Link title to pageview. if ($index_name == 'title') { // Get title of parent document if needed. if (empty($value) && $this->conf['getTitle']) { $superiorTitle = tx_dlf_document::getTitle($subpart['uid'], TRUE); if (!empty($superiorTitle)) { $value = '[' . $superiorTitle . ']'; } } // Set fake title if still not present. if (empty($value)) { $value = $this->pi_getLL('noTitle'); } $imgAlt = htmlspecialchars($value); $additionalParams = array('id' => $subpart['uid'], 'page' => $subpart['page']); $conf = array('useCacheHash' => 1, 'parameter' => $this->conf['targetPid'], 'additionalParams' => \TYPO3\CMS\Core\Utility\GeneralUtility::implodeArrayForUrl($this->prefixId, $additionalParams, '', TRUE, FALSE)); $value = $this->cObj->typoLink(htmlspecialchars($value), $conf); // Translate name of holding library. } elseif ($index_name == 'owner' && !empty($value)) { $value = htmlspecialchars(tx_dlf_helper::translate($value, 'tx_dlf_libraries', $this->conf['pages'])); // Translate document type. } elseif ($index_name == 'type' && !empty($value)) { $_value = $value; $value = htmlspecialchars(tx_dlf_helper::translate($value, 'tx_dlf_structures', $this->conf['pages'])); // Add page number for single pages. if ($_value == 'page') { $value .= ' ' . intval($subpart['page']); } // Translate ISO 639 language code. } elseif ($index_name == 'language' && !empty($value)) { $value = htmlspecialchars(tx_dlf_helper::getLanguageName($value)); } elseif (!empty($value)) { $value = htmlspecialchars($value); } $value = $this->cObj->stdWrap($value, $fieldwrap['value.']); if (!empty($value)) { $parsedValue .= $value; } } while (count($subpart['metadata'][$index_name])); if (!empty($parsedValue)) { $field = $this->cObj->stdWrap(htmlspecialchars($metaConf['label']), $fieldwrap['key.']); $field .= $parsedValue; $markerArray['###SUBMETADATA###'] .= $this->cObj->stdWrap($field, $fieldwrap['all.']); } } // Add thumbnail. if (!empty($subpart['thumbnail'])) { $markerArray['###SUBTHUMBNAIL###'] = '<img alt="' . $imgAlt . '" src="' . $subpart['thumbnail'] . '" />'; } // Add preview. if (!empty($subpart['preview'])) { $markerArray['###SUBPREVIEW###'] = $subpart['preview']; } $content .= $this->cObj->substituteMarkerArray($template['subentry'], $markerArray); } return $this->cObj->substituteSubpart($this->cObj->getSubpart($this->template, '###SUBTEMPLATE###'), '###SUBENTRY###', $content, TRUE); }
/** * The main method of the PlugIn * * @access public * * @param string $content: The PlugIn content * @param array $conf: The PlugIn configuration * * @return void */ public function main($content, $conf) { $this->init($conf); // Don't cache the output. $this->setCache(FALSE); // Create XML document. $rss = new DOMDocument('1.0', 'utf-8'); // Add mandatory root element. $root = $rss->createElement('rss'); $root->setAttribute('version', '2.0'); // Add channel element. $channel = $rss->createElement('channel'); $channel->appendChild($rss->createElement('title', htmlspecialchars($this->conf['title'], ENT_NOQUOTES, 'UTF-8'))); $channel->appendChild($rss->createElement('link', htmlspecialchars(t3lib_div::locationHeaderUrl($this->pi_linkTP_keepPIvars_url()), ENT_NOQUOTES, 'UTF-8'))); if (!empty($this->conf['description'])) { $channel->appendChild($rss->createElement('description', htmlspecialchars($this->conf['description'], ENT_QUOTES, 'UTF-8'))); } $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('tx_dlf_libraries.label AS label', 'tx_dlf_libraries', 'tx_dlf_libraries.pid=' . intval($this->conf['pages']) . ' AND tx_dlf_libraries.uid=' . intval($this->conf['library']) . tx_dlf_helper::whereClause('tx_dlf_libraries'), '', '', '1'); if ($GLOBALS['TYPO3_DB']->sql_num_rows($result)) { $resArray = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result); $channel->appendChild($rss->createElement('copyright', htmlspecialchars($resArray['label'], ENT_NOQUOTES, 'UTF-8'))); } $channel->appendChild($rss->createElement('pubDate', date('r', $GLOBALS['EXEC_TIME']))); $channel->appendChild($rss->createElement('generator', htmlspecialchars($this->conf['useragent'], ENT_NOQUOTES, 'UTF-8'))); // Add item elements. if (!$this->conf['excludeOther'] || empty($this->piVars['collection']) || t3lib_div::inList($this->conf['collections'], $this->piVars['collection'])) { $additionalWhere = ''; // Check for pre-selected collections. if (!empty($this->piVars['collection'])) { $additionalWhere = ' AND tx_dlf_collections.uid=' . intval($this->piVars['collection']); } elseif (!empty($this->conf['collections'])) { $additionalWhere = ' AND tx_dlf_collections.uid IN (' . $GLOBALS['TYPO3_DB']->cleanIntList($this->conf['collections']) . ')'; } $result = $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query('tx_dlf_documents.uid AS uid,tx_dlf_documents.partof AS partof,tx_dlf_documents.title AS title,tx_dlf_documents.volume AS volume,tx_dlf_documents.author AS author,tx_dlf_documents.record_id AS guid,tx_dlf_documents.tstamp AS tstamp,tx_dlf_documents.crdate AS crdate', 'tx_dlf_documents', 'tx_dlf_relations', 'tx_dlf_collections', 'AND tx_dlf_documents.pid=' . intval($this->conf['pages']) . ' AND tx_dlf_relations.ident=' . $GLOBALS['TYPO3_DB']->fullQuoteStr('docs_colls', 'tx_dlf_relations') . ' AND tx_dlf_collections.pid=' . intval($this->conf['pages']) . $additionalWhere . tx_dlf_helper::whereClause('tx_dlf_documents') . tx_dlf_helper::whereClause('tx_dlf_collections'), 'tx_dlf_documents.uid', 'tx_dlf_documents.tstamp DESC', intval($this->conf['limit'])); if ($GLOBALS['TYPO3_DB']->sql_num_rows($result)) { // Add each record as item element. while ($resArray = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result)) { $item = $rss->createElement('item'); $title = ''; // Get title of superior document. if ((empty($resArray['title']) || !empty($this->conf['prependSuperiorTitle'])) && !empty($resArray['partof'])) { $superiorTitle = tx_dlf_document::getTitle($resArray['partof'], TRUE); if (!empty($superiorTitle)) { $title .= '[' . $superiorTitle . ']'; } } // Get title of document. if (!empty($resArray['title'])) { $title .= ' ' . $resArray['title']; } // Set default title if empty. if (empty($title)) { $title = $this->pi_getLL('noTitle'); } // Append volume information. if (!empty($resArray['volume'])) { $title .= ', ' . $this->pi_getLL('volume') . ' ' . $resArray['volume']; } // Is this document new or updated? if ($resArray['crdate'] == $resArray['tstamp']) { $title = $this->pi_getLL('new') . ' ' . trim($title); } else { $title = $this->pi_getLL('update') . ' ' . trim($title); } $item->appendChild($rss->createElement('title', htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8'))); // Add link. $linkConf = array('parameter' => $this->conf['targetPid'], 'forceAbsoluteUrl' => 1, 'additionalParams' => t3lib_div::implodeArrayForUrl($this->prefixId, array('id' => $resArray['uid']), '', TRUE, FALSE)); $item->appendChild($rss->createElement('link', htmlspecialchars($this->cObj->typoLink_URL($linkConf), ENT_NOQUOTES, 'UTF-8'))); // Add author if applicable. if (!empty($resArray['author'])) { $item->appendChild($rss->createElement('author', htmlspecialchars($resArray['author'], ENT_NOQUOTES, 'UTF-8'))); } // Add online publication date. $item->appendChild($rss->createElement('pubDate', date('r', $resArray['crdate']))); // Add internal record identifier. $item->appendChild($rss->createElement('guid', htmlspecialchars($resArray['guid'], ENT_NOQUOTES, 'UTF-8'))); $channel->appendChild($item); } } } $root->appendChild($channel); // Build XML output. $rss->appendChild($root); $content = $rss->saveXML(); // Clean output buffer. t3lib_div::cleanOutputBuffers(); // Send headers. header('HTTP/1.1 200 OK'); header('Cache-Control: no-cache'); header('Content-Length: ' . strlen($content)); header('Content-Type: application/rss+xml; charset=utf-8'); header('Date: ' . date('r', $GLOBALS['EXEC_TIME'])); header('Expires: ' . date('r', $GLOBALS['EXEC_TIME'])); echo $content; // Flush output buffer and end script processing. ob_end_flush(); exit; }
/** * Prepares the metadata array for output * * @access protected * * @param array $metadataArray: The metadata array * * @return string The metadata array ready for output */ protected function printMetadata(array $metadataArray) { // Load template file. if (!empty($this->conf['templateFile'])) { $this->template = $this->cObj->getSubpart($this->cObj->fileResource($this->conf['templateFile']), '###TEMPLATE###'); } else { $this->template = $this->cObj->getSubpart($this->cObj->fileResource('EXT:dlf/plugins/metadata/template.tmpl'), '###TEMPLATE###'); } $output = ''; $subpart['block'] = $this->cObj->getSubpart($this->template, '###BLOCK###'); // Get list of metadata to show. $metaList = array(); $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('tx_dlf_metadata.index_name AS index_name,tx_dlf_metadata.is_listed AS is_listed,tx_dlf_metadata.wrap AS wrap', 'tx_dlf_metadata', 'tx_dlf_metadata.pid=' . intval($this->conf['pages']) . tx_dlf_helper::whereClause('tx_dlf_metadata'), '', 'tx_dlf_metadata.sorting', ''); while ($resArray = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result)) { if ($this->conf['showFull'] || $resArray['is_listed']) { $metaList[$resArray['index_name']] = array('wrap' => $resArray['wrap'], 'label' => tx_dlf_helper::translate($resArray['index_name'], 'tx_dlf_metadata', $this->conf['pages'])); } } // Save original data array. $cObjData = $this->cObj->data; // Parse the metadata arrays. foreach ($metadataArray as $metadata) { $markerArray['###METADATA###'] = ''; // Reset content object's data array. $this->cObj->data = $cObjData; // Load all the metadata values into the content object's data array. foreach ($metadata as $index_name => $value) { if (is_array($value)) { $this->cObj->data[$index_name] = implode($this->conf['separator'], $value); } else { $this->cObj->data[$index_name] = $value; } } // Process each metadate. foreach ($metaList as $index_name => $metaConf) { $parsedValue = ''; $fieldwrap = $this->parseTS($metaConf['wrap']); do { $value = @array_shift($metadata[$index_name]); if ($index_name == 'title') { // Get title of parent document if needed. if (empty($value) && $this->conf['getTitle'] && $this->doc->parentId) { $superiorTitle = tx_dlf_document::getTitle($this->doc->parentId, TRUE); if (!empty($superiorTitle)) { $value = '[' . $superiorTitle . ']'; } } if (!empty($value)) { $value = htmlspecialchars($value); // Link title to pageview. if ($this->conf['linkTitle'] && $metadata['_id']) { $details = $this->doc->getLogicalStructure($metadata['_id']); $value = $this->pi_linkTP($value, array($this->prefixId => array('id' => $this->doc->uid, 'page' => !empty($details['points']) ? intval($details['points']) : 1)), TRUE, $this->conf['targetPid']); } } } elseif ($index_name == 'owner' && !empty($value)) { // Translate name of holding library. $value = htmlspecialchars(tx_dlf_helper::translate($value, 'tx_dlf_libraries', $this->conf['pages'])); } elseif ($index_name == 'type' && !empty($value)) { // Translate document type. $value = htmlspecialchars(tx_dlf_helper::translate($value, 'tx_dlf_structures', $this->conf['pages'])); } elseif ($index_name == 'collection' && !empty($value)) { // Translate collection. $value = htmlspecialchars(tx_dlf_helper::translate($value, 'tx_dlf_collections', $this->conf['pages'])); } elseif ($index_name == 'language' && !empty($value)) { // Translate ISO 639 language code. $value = htmlspecialchars(tx_dlf_helper::getLanguageName($value)); } elseif (!empty($value)) { // Sanitize value for output. $value = htmlspecialchars($value); } // Hook for getting a customized value (requested by SBB). foreach ($this->hookObjects as $hookObj) { if (method_exists($hookObj, 'printMetadata_customizeMetadata')) { $hookObj->printMetadata_customizeMetadata($value); } } $value = $this->cObj->stdWrap($value, $fieldwrap['value.']); if (!empty($value)) { $parsedValue .= $value; } } while (count($metadata[$index_name])); if (!empty($parsedValue)) { $field = $this->cObj->stdWrap(htmlspecialchars($metaConf['label']), $fieldwrap['key.']); $field .= $parsedValue; $markerArray['###METADATA###'] .= $this->cObj->stdWrap($field, $fieldwrap['all.']); } } $output .= $this->cObj->substituteMarkerArray($subpart['block'], $markerArray); } return $this->cObj->substituteSubpart($this->template, '###BLOCK###', $output, TRUE); }
/** * 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 tx_dlf_document. $this->doc =& tx_dlf_document::getInstance($this->piVars['id']); if (!$this->doc->ready) { // Destroy the incomplete object. $this->doc = NULL; if (TYPO3_DLOG) { \TYPO3\CMS\Core\Utility\GeneralUtility::devLog('[tx_dlf_doctype->loadDocument()] Failed to load document with UID "' . $this->piVars['id'] . '"', $this->extKey, SYSLOG_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') . tx_dlf_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 { if (TYPO3_DLOG) { \TYPO3\CMS\Core\Utility\GeneralUtility::devLog('[tx_dlf_doctype->loadDocument()] Failed to load document with record ID "' . $this->piVars['recordId'] . '"', $this->extKey, SYSLOG_SEVERITY_WARNING); } } } }
/** * Processes a logical unit (and its children) for the Solr index * * @access protected * * @param tx_dlf_document &$doc: The METS document * @param array $logicalUnit: Array of the logical unit to process * * @return integer 0 on success or 1 on failure */ protected static function process(tx_dlf_document &$doc, array $logicalUnit) { $errors = 0; // Get metadata for logical unit. $metadata = $doc->metadataArray[$logicalUnit['id']]; if (!empty($metadata)) { // Load class. if (!class_exists('Apache_Solr_Document')) { require_once t3lib_div::getFileAbsFileName('EXT:' . self::$extKey . '/lib/SolrPhpClient/Apache/Solr/Document.php'); } // Create new Solr document. $solrDoc = new Apache_Solr_Document(); // Create unique identifier from document's UID and unit's XML ID. $solrDoc->setField('id', $doc->uid . $logicalUnit['id']); $solrDoc->setField('uid', $doc->uid); $solrDoc->setField('pid', $doc->pid); if (tx_dlf_helper::testInt($logicalUnit['points'])) { $solrDoc->setField('page', $logicalUnit['points']); } if ($logicalUnit['id'] == $doc->toplevelId) { $solrDoc->setField('thumbnail', $doc->thumbnail); } elseif (!empty($logicalUnit['thumbnailId'])) { $solrDoc->setField('thumbnail', $doc->getFileLocation($logicalUnit['thumbnailId'])); } $solrDoc->setField('partof', $doc->parentId); $solrDoc->setField('sid', $logicalUnit['id']); $solrDoc->setField('toplevel', in_array($logicalUnit['type'], self::$toplevel)); $solrDoc->setField('type', $logicalUnit['type'], self::$fields['fieldboost']['type']); $solrDoc->setField('title', $metadata['title'][0], self::$fields['fieldboost']['title']); $solrDoc->setField('volume', $metadata['volume'][0], self::$fields['fieldboost']['volume']); $autocomplete = array(); foreach ($metadata as $index_name => $data) { if (!empty($data) && substr($index_name, -8) !== '_sorting') { $solrDoc->setField(self::getIndexFieldName($index_name, $doc->pid), $data, self::$fields['fieldboost'][$index_name]); if (in_array($index_name, self::$fields['sortables'])) { // Add sortable fields to index. $solrDoc->setField($index_name . '_sorting', $metadata[$index_name . '_sorting'][0]); } if (in_array($index_name, self::$fields['facets'])) { // Add facets to index. $solrDoc->setField($index_name . '_faceting', $data); } if (in_array($index_name, self::$fields['autocompleted'])) { $autocomplete = array_merge($autocomplete, $data); } } } // Add autocomplete values to index. if (!empty($autocomplete)) { $solrDoc->setField('autocomplete', $autocomplete); } try { self::$solr->service->addDocument($solrDoc); } catch (Exception $e) { if (!defined('TYPO3_cliMode')) { $message = t3lib_div::makeInstance('t3lib_FlashMessage', tx_dlf_helper::getLL('flash.solrException', TRUE) . '<br />' . htmlspecialchars($e->getMessage()), tx_dlf_helper::getLL('flash.error', TRUE), t3lib_FlashMessage::ERROR, TRUE); t3lib_FlashMessageQueue::addMessage($message); } return 1; } } // Check for child elements... if (!empty($logicalUnit['children'])) { foreach ($logicalUnit['children'] as $child) { if (!$errors) { // ...and process them, too. $errors = self::process($doc, $child); } else { break; } } } return $errors; }