Open Journal Systems  3.3.0
RecommendByAuthorPlugin.inc.php
1 <?php
2 
17 import('lib.pkp.classes.plugins.GenericPlugin');
18 
19 define('RECOMMEND_BY_AUTHOR_PLUGIN_COUNT', 10);
20 
22 
23  //
24  // Implement template methods from Plugin.
25  //
29  function register($category, $path, $mainContextId = null) {
30  $success = parent::register($category, $path, $mainContextId);
31  if (!Config::getVar('general', 'installed') || defined('RUNNING_UPGRADE')) return $success;
32 
33  if ($success && $this->getEnabled($mainContextId)) {
34  HookRegistry::register('Templates::Article::Footer::PageFooter', array($this, 'callbackTemplateArticlePageFooter'));
35  }
36  return $success;
37  }
38 
42  function getDisplayName() {
43  return __('plugins.generic.recommendByAuthor.displayName');
44  }
45 
49  function getDescription() {
50  return __('plugins.generic.recommendByAuthor.description');
51  }
52 
53 
54  //
55  // View level hook implementations.
56  //
60  function callbackTemplateArticlePageFooter($hookName, $params) {
61  $smarty =& $params[1];
62  $output =& $params[2];
63 
64  // Find articles of the same author(s).
65  $displayedArticle = $smarty->getTemplateVars('article');
66  $authors = $displayedArticle->getAuthors();
67  $foundArticles = array();
68  foreach($authors as $author) { /* @var $author Author */
69  // The following article search is by name only as authors are
70  // not normalized in OJS. This is rather crude and may produce
71  // false positives or miss some entries. But there's no other way
72  // until OJS allows users to consistently normalize authors (via name,
73  // email, ORCID, whatever).
74  $authorsIterator = Services::get('author')->getMany([
75  'contextIds' => $displayedArticle->getData('contextId'),
76  'givenName' => $author->getLocalizedGivenName(),
77  'familyName' => $author->getLocalizedFamilyName(),
78  ]);
79  $publicationIds = [];
80  foreach ($authorsIterator as $thisAuthor) {
81  $publicationIds[] = $thisAuthor->getData('publicationId');
82  }
83  $submissionIds = array_map(function($publicationId) {
84  $publication = Services::get('publication')->get($publicationId);
85  return $publication->getData('status') == STATUS_PUBLISHED ? $publication->getData('submissionId') : null;
86  }, array_unique($publicationIds));
87  $foundArticles = array_unique(array_merge($foundArticles, $submissionIds));
88  }
89 
90  $results = array_filter($foundArticles, function($value) use ($displayedArticle) {
91  if ($value !== $displayedArticle->getId()) return $value;
92  return null;
93  });
94 
95  // Order results by metric.
97  $metricType = $application->getDefaultMetricType();
98  if (empty($metricType)) $smarty->assign('noMetricSelected', true);
99  $column = STATISTICS_DIMENSION_SUBMISSION_ID;
100  $filter = array(
101  STATISTICS_DIMENSION_ASSOC_TYPE => array(ASSOC_TYPE_GALLEY, ASSOC_TYPE_SUBMISSION),
102  STATISTICS_DIMENSION_SUBMISSION_ID => array($results)
103  );
104  $orderBy = array(STATISTICS_METRIC => STATISTICS_ORDER_DESC);
105  $statsReport = $application->getMetrics($metricType, $column, $filter, $orderBy);
106  $orderedResults = array();
107  foreach ((array) $statsReport as $reportRow) {
108  $orderedResults[] = $reportRow['submission_id'];
109  }
110  // Make sure we even get results that have no statistics (yet) and that
111  // we get them in some consistent order for paging.
112  $remainingResults = array_diff($results, $orderedResults);
113  sort($remainingResults);
114  $orderedResults = array_merge($orderedResults, $remainingResults);
115 
116  // Pagination.
117  $request = Application::get()->getRequest();
118  $rangeInfo = Handler::getRangeInfo($request, 'articlesBySameAuthor');
119  if ($rangeInfo && $rangeInfo->isValid()) {
120  $page = $rangeInfo->getPage();
121  } else {
122  $page = 1;
123  }
124  $totalResults = count($orderedResults);
125  $itemsPerPage = RECOMMEND_BY_AUTHOR_PLUGIN_COUNT;
126  $offset = $itemsPerPage * ($page-1);
127  $length = max($totalResults - $offset, 0);
128  $length = min($itemsPerPage, $length);
129  if ($length == 0) {
130  $pagedResults = array();
131  } else {
132  $pagedResults = array_slice(
133  $orderedResults,
134  $offset,
135  $length
136  );
137  }
138 
139  // Visualization.
140  import('classes.search.ArticleSearch');
141  $articleSearch = new ArticleSearch();
142  $pagedResults = $articleSearch->formatResults($pagedResults);
143  import('lib.pkp.classes.core.VirtualArrayIterator');
144  $returner = new VirtualArrayIterator($pagedResults, $totalResults, $page, $itemsPerPage);
145  $smarty->assign('articlesBySameAuthor', $returner);
146  $output .= $smarty->fetch($this->getTemplateResource('articleFooter.tpl'));
147  return false;
148  }
149 }
150 
RecommendByAuthorPlugin\getDisplayName
getDisplayName()
Definition: RecommendByAuthorPlugin.inc.php:42
RecommendByAuthorPlugin\callbackTemplateArticlePageFooter
callbackTemplateArticlePageFooter($hookName, $params)
Definition: RecommendByAuthorPlugin.inc.php:60
$application
$application
Definition: index.php:65
VirtualArrayIterator
Provides paging and iteration for "virtual" arrays – arrays for which only the current "page" is avai...
Definition: VirtualArrayIterator.inc.php:20
RecommendByAuthorPlugin
Plugin to recommend articles from the same author.
Definition: RecommendByAuthorPlugin.inc.php:21
PKPHandler\getRangeInfo
static getRangeInfo($request, $rangeName, $contextData=null)
Definition: PKPHandler.inc.php:417
Plugin\getEnabled
getEnabled()
Definition: Plugin.inc.php:868
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
RecommendByAuthorPlugin\getDescription
getDescription()
Definition: RecommendByAuthorPlugin.inc.php:49
Plugin\getTemplateResource
getTemplateResource($template=null, $inCore=false)
Definition: Plugin.inc.php:349
Plugin\$request
$request
Definition: Plugin.inc.php:68
HookRegistry\register
static register($hookName, $callback, $hookSequence=HOOK_SEQUENCE_NORMAL)
Definition: HookRegistry.inc.php:70
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
ArticleSearch
Class for retrieving article search results.
Definition: ArticleSearch.inc.php:20
GenericPlugin
Abstract class for generic plugins.
Definition: GenericPlugin.inc.php:18
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49