Open Journal Systems  3.3.0
PKPApplication.inc.php
1 <?php
2 
17 define('PHP_REQUIRED_VERSION', '7.2.0');
18 
19 define('ROUTE_COMPONENT', 'component');
20 define('ROUTE_PAGE', 'page');
21 define('ROUTE_API', 'api');
22 
23 define('API_VERSION', 'v1');
24 
25 define('CONTEXT_SITE', 0);
26 define('CONTEXT_ID_NONE', 0);
27 define('CONTEXT_ID_ALL', '*');
28 define('REVIEW_ROUND_NONE', 0);
29 
30 define('ASSOC_TYPE_PRODUCTION_ASSIGNMENT', 0x0000202);
31 define('ASSOC_TYPE_SUBMISSION_FILE', 0x0000203);
32 define('ASSOC_TYPE_REVIEW_RESPONSE', 0x0000204);
33 define('ASSOC_TYPE_REVIEW_ASSIGNMENT', 0x0000205);
34 define('ASSOC_TYPE_SUBMISSION_EMAIL_LOG_ENTRY', 0x0000206);
35 define('ASSOC_TYPE_WORKFLOW_STAGE', 0x0000207);
36 define('ASSOC_TYPE_NOTE', 0x0000208);
37 define('ASSOC_TYPE_REPRESENTATION', 0x0000209);
38 define('ASSOC_TYPE_ANNOUNCEMENT', 0x000020A);
39 define('ASSOC_TYPE_REVIEW_ROUND', 0x000020B);
40 define('ASSOC_TYPE_SUBMISSION_FILES', 0x000020F);
41 define('ASSOC_TYPE_PLUGIN', 0x0000211);
42 define('ASSOC_TYPE_SECTION', 0x0000212);
43 define('ASSOC_TYPE_CATEGORY', 0x000020D);
44 define('ASSOC_TYPE_USER', 0x0001000); // This value used because of bug #6068
45 define('ASSOC_TYPE_USER_GROUP', 0x0100002);
46 define('ASSOC_TYPE_CITATION', 0x0100003);
47 define('ASSOC_TYPE_AUTHOR', 0x0100004);
48 define('ASSOC_TYPE_EDITOR', 0x0100005);
49 define('ASSOC_TYPE_USER_ROLES', 0x0100007);
50 define('ASSOC_TYPE_ACCESSIBLE_WORKFLOW_STAGES', 0x0100008);
51 define('ASSOC_TYPE_SUBMISSION', 0x0100009);
52 define('ASSOC_TYPE_QUERY', 0x010000a);
53 define('ASSOC_TYPE_QUEUED_PAYMENT', 0x010000b);
54 define('ASSOC_TYPE_PUBLICATION', 0x010000c);
55 
56 // Constant used in UsageStats for submission files that are not full texts
57 define('ASSOC_TYPE_SUBMISSION_FILE_COUNTER_OTHER', 0x0000213);
58 
59 // FIXME: these were defined in userGroup. they need to be moved somewhere with classes that do mapping.
60 define('WORKFLOW_STAGE_PATH_SUBMISSION', 'submission');
61 define('WORKFLOW_STAGE_PATH_INTERNAL_REVIEW', 'internalReview');
62 define('WORKFLOW_STAGE_PATH_EXTERNAL_REVIEW', 'externalReview');
63 define('WORKFLOW_STAGE_PATH_EDITING', 'editorial');
64 define('WORKFLOW_STAGE_PATH_PRODUCTION', 'production');
65 
66 // Constant used to distinguish between editorial and author workflows
67 define('WORKFLOW_TYPE_EDITORIAL', 'editorial');
68 define('WORKFLOW_TYPE_AUTHOR', 'author');
69 
70 use Illuminate\Database\Capsule\Manager as Capsule;
71 
76  public static function getContextDAO();
77 
82  public static function getSectionDAO();
83 
87  public static function getRepresentationDAO();
88 
92  public static function getSubmissionSearchIndex();
93 
97  public static function getSubmissionSearchDAO();
98 
102  public static function getApplicationStages();
103 
108  public static function getFileDirectories();
109 
113  public static function getContextAssocType();
114 }
115 
116 abstract class PKPApplication implements iPKPApplicationInfoProvider {
117  var $enabledProducts = array();
119 
123  public function __construct() {
124  // Seed random number generator
125  mt_srand(((double) microtime()) * 1000000);
126 
127  import('lib.pkp.classes.core.Core');
128  import('lib.pkp.classes.core.PKPString');
129  import('lib.pkp.classes.core.Registry');
130 
131  import('lib.pkp.classes.config.Config');
132 
133  // Load Composer autoloader
134  require_once('lib/pkp/lib/vendor/autoload.php');
135 
136  ini_set('display_errors', Config::getVar('debug', 'display_errors', ini_get('display_errors')));
137  if (!defined('SESSION_DISABLE_INIT') && !Config::getVar('general', 'installed')) {
138  define('SESSION_DISABLE_INIT', true);
139  }
140 
141  Registry::set('application', $this);
142 
143  import('lib.pkp.classes.db.DAORegistry');
144  import('lib.pkp.classes.db.XMLDAO');
145 
146  import('lib.pkp.classes.cache.CacheManager');
147 
148  import('lib.pkp.classes.security.RoleDAO');
149  import('lib.pkp.classes.security.Validation');
150  import('lib.pkp.classes.session.SessionManager');
151  import('classes.template.TemplateManager');
152  import('classes.notification.NotificationManager');
153  import('lib.pkp.classes.statistics.PKPStatisticsHelper');
154 
155  import('lib.pkp.classes.plugins.PluginRegistry');
156  import('lib.pkp.classes.plugins.HookRegistry');
157 
158  import('classes.i18n.AppLocale');
159 
160  PKPString::init();
161 
162  $microTime = Core::microtime();
163  Registry::set('system.debug.startTime', $microTime);
164 
165  $notes = array();
166  Registry::set('system.debug.notes', $notes);
167 
168  if (Config::getVar('general', 'installed')) {
169  // Initialize database connection
170  $conn = DBConnection::getInstance();
171 
172  if (!$conn->isConnected()) {
173  if (Config::getVar('database', 'debug')) {
174  $dbconn =& $conn->getDBConn();
175  fatalError('Database connection failed: ' . $dbconn->errorMsg());
176  } else {
177  fatalError('Database connection failed!');
178  }
179  }
180 
181  // Map valid config options to Illuminate database drivers
182  $driver = strtolower(Config::getVar('database', 'driver'));
183  if (substr($driver, 0, 8) === 'postgres') {
184  $driver = 'pgsql';
185  } else {
186  $driver = 'mysql';
187  }
188 
189  // Always use `utf8` unless `latin1` is specified
190  $charset = Config::getVar('i18n', 'connection_charset');
191  if ($charset !== 'latin1') {
192  $charset = 'utf8';
193  }
194 
195  $capsule = new Capsule;
196  $capsule->addConnection([
197  'driver' => $driver,
198  'host' => Config::getVar('database', 'host'),
199  'database' => Config::getVar('database', 'name'),
200  'username' => Config::getVar('database', 'username'),
201  'port' => Config::getVar('database', 'port'),
202  'unix_socket'=> Config::getVar('database', 'unix_socket'),
203  'password' => Config::getVar('database', 'password'),
204  'charset' => $charset,
205  'collation' => 'utf8_general_ci',
206  ]);
207  $capsule->setAsGlobal();
208  }
209 
210  // Register custom autoloader functions for namespaces
211  spl_autoload_register(function($class) {
212  $prefix = 'PKP\\';
213  $rootPath = BASE_SYS_DIR . "/lib/pkp/classes";
214  customAutoload($rootPath, $prefix, $class);
215  });
216  spl_autoload_register(function($class) {
217  $prefix = 'APP\\';
218  $rootPath = BASE_SYS_DIR . "/classes";
219  customAutoload($rootPath, $prefix, $class);
220  });
221  }
222 
227  public static function getApplication() {
228  return self::get();
229  }
230 
235  public static function get() {
236  return Registry::get('application');
237  }
238 
243  public function getHttpClient() {
245  $userAgent = $application->getName() . '/';
246  if (Config::getVar('general', 'installed') && !defined('RUNNING_UPGRADE')) {
247  $currentVersion = $application->getCurrentVersion();
248  $userAgent .= $currentVersion->getVersionString();
249  } else {
250  $userAgent .= '?';
251  }
252 
253  return new \GuzzleHttp\Client([
254  'proxy' => [
255  'http' => Config::getVar('proxy', 'http_proxy', null),
256  'https' => Config::getVar('proxy', 'https_proxy', null),
257  ],
258  'defaults' => [
259  'headers' => [
260  'User-Agent' => $userAgent,
261  ],
262  ],
263  ]);
264  }
265 
270  public function getRequest() {
271  $request =& Registry::get('request', true, null); // Ref req'd
272 
273  if (is_null($request)) {
274  import('classes.core.Request');
275 
276  // Implicitly set request by ref in the registry
277  $request = new Request();
278  }
279 
280  return $request;
281  }
282 
287  public function getDispatcher() {
288  $dispatcher =& Registry::get('dispatcher', true, null); // Ref req'd
289  if (is_null($dispatcher)) {
290  import('lib.pkp.classes.core.Dispatcher');
291 
292  // Implicitly set dispatcher by ref in the registry
293  $dispatcher = new Dispatcher();
294 
295  // Inject dependency
296  $dispatcher->setApplication(PKPApplication::get());
297 
298  // Inject router configuration
299  $dispatcher->addRouterName('lib.pkp.classes.core.APIRouter', ROUTE_API);
300  $dispatcher->addRouterName('lib.pkp.classes.core.PKPComponentRouter', ROUTE_COMPONENT);
301  $dispatcher->addRouterName('classes.core.PageRouter', ROUTE_PAGE);
302  }
303 
304  return $dispatcher;
305  }
306 
311  public function execute() {
312  // Dispatch the request to the correct handler
313  $dispatcher = $this->getDispatcher();
314  $dispatcher->dispatch($this->getRequest());
315  }
316 
321  public static function getName() {
322  return 'pkp-lib';
323  }
324 
329  abstract public function getNameKey();
330 
338  abstract public function getContextDepth();
339 
346  abstract public function getContextList();
347 
353  abstract public function getVersionDescriptorUrl();
354 
365  public function &getEnabledProducts($category = null, $mainContextId = null) {
366  $contextDepth = $this->getContextDepth();
367  if (is_null($mainContextId)) {
368  $request = $this->getRequest();
369  $router = $request->getRouter();
370 
371  // Try to identify the main context (e.g. journal, conference, press),
372  // will be null if none found.
373  $mainContext = $router->getContext($request, 1);
374  if ($mainContext) $mainContextId = $mainContext->getId();
375  else $mainContextId = CONTEXT_SITE;
376  }
377  if (!isset($this->enabledProducts[$mainContextId])) {
378  $settingContext = array();
379  if ($contextDepth > 0) {
380  // Create the context for the setting if found
381  $settingContext[] = $mainContextId;
382  $settingContext = array_pad($settingContext, $contextDepth, 0);
383  $settingContext = array_combine($this->getContextList(), $settingContext);
384  }
385 
386  $versionDao = DAORegistry::getDAO('VersionDAO'); /* @var $versionDao VersionDAO */
387  $this->enabledProducts[$mainContextId] = $versionDao->getCurrentProducts($settingContext);
388  }
389 
390  if (is_null($category)) {
391  return $this->enabledProducts[$mainContextId];
392  } elseif (isset($this->enabledProducts[$mainContextId][$category])) {
393  return $this->enabledProducts[$mainContextId][$category];
394  } else {
395  $returner = array();
396  return $returner;
397  }
398  }
399 
404  abstract public function getPluginCategories();
405 
410  public function &getCurrentVersion() {
411  $currentVersion =& $this->getEnabledProducts('core');
412  assert(count($currentVersion)) == 1;
413  return $currentVersion[$this->getName()];
414  }
415 
420  public function getDAOMap() {
421  return array(
422  'AccessKeyDAO' => 'lib.pkp.classes.security.AccessKeyDAO',
423  'AnnouncementDAO' => 'lib.pkp.classes.announcement.AnnouncementDAO',
424  'AnnouncementTypeDAO' => 'lib.pkp.classes.announcement.AnnouncementTypeDAO',
425  'AuthSourceDAO' => 'lib.pkp.classes.security.AuthSourceDAO',
426  'CategoryDAO' => 'lib.pkp.classes.context.CategoryDAO',
427  'CitationDAO' => 'lib.pkp.classes.citation.CitationDAO',
428  'ControlledVocabDAO' => 'lib.pkp.classes.controlledVocab.ControlledVocabDAO',
429  'ControlledVocabEntryDAO' => 'lib.pkp.classes.controlledVocab.ControlledVocabEntryDAO',
430  'ControlledVocabEntrySettingsDAO' => 'lib.pkp.classes.controlledVocab.ControlledVocabEntrySettingsDAO',
431  'CountryDAO' => 'lib.pkp.classes.i18n.CountryDAO', // DEPRECATED
432  'CurrencyDAO' => 'lib.pkp.classes.currency.CurrencyDAO', // DEPRECATED
433  'DataObjectTombstoneDAO' => 'lib.pkp.classes.tombstone.DataObjectTombstoneDAO',
434  'DataObjectTombstoneSettingsDAO' => 'lib.pkp.classes.tombstone.DataObjectTombstoneSettingsDAO',
435  'EditDecisionDAO' => 'lib.pkp.classes.submission.EditDecisionDAO',
436  'EmailTemplateDAO' => 'lib.pkp.classes.mail.EmailTemplateDAO',
437  'FilterDAO' => 'lib.pkp.classes.filter.FilterDAO',
438  'FilterGroupDAO' => 'lib.pkp.classes.filter.FilterGroupDAO',
439  'GenreDAO' => 'lib.pkp.classes.submission.GenreDAO',
440  'InterestDAO' => 'lib.pkp.classes.user.InterestDAO',
441  'InterestEntryDAO' => 'lib.pkp.classes.user.InterestEntryDAO',
442  'LanguageDAO' => 'lib.pkp.classes.language.LanguageDAO', // DEPRECATED
443  'LibraryFileDAO' => 'lib.pkp.classes.context.LibraryFileDAO',
444  'NavigationMenuDAO' => 'lib.pkp.classes.navigationMenu.NavigationMenuDAO',
445  'NavigationMenuItemDAO' => 'lib.pkp.classes.navigationMenu.NavigationMenuItemDAO',
446  'NavigationMenuItemAssignmentDAO' => 'lib.pkp.classes.navigationMenu.NavigationMenuItemAssignmentDAO',
447  'NoteDAO' => 'lib.pkp.classes.note.NoteDAO',
448  'NotificationDAO' => 'lib.pkp.classes.notification.NotificationDAO',
449  'NotificationSettingsDAO' => 'lib.pkp.classes.notification.NotificationSettingsDAO',
450  'NotificationSubscriptionSettingsDAO' => 'lib.pkp.classes.notification.NotificationSubscriptionSettingsDAO',
451  'PluginGalleryDAO' => 'lib.pkp.classes.plugins.PluginGalleryDAO',
452  'PluginSettingsDAO' => 'lib.pkp.classes.plugins.PluginSettingsDAO',
453  'PublicationDAO' => 'classes.publication.PublicationDAO',
454  'QueuedPaymentDAO' => 'lib.pkp.classes.payment.QueuedPaymentDAO',
455  'ReviewAssignmentDAO' => 'lib.pkp.classes.submission.reviewAssignment.ReviewAssignmentDAO',
456  'ReviewFilesDAO' => 'lib.pkp.classes.submission.ReviewFilesDAO',
457  'ReviewFormDAO' => 'lib.pkp.classes.reviewForm.ReviewFormDAO',
458  'ReviewFormElementDAO' => 'lib.pkp.classes.reviewForm.ReviewFormElementDAO',
459  'ReviewFormResponseDAO' => 'lib.pkp.classes.reviewForm.ReviewFormResponseDAO',
460  'ReviewRoundDAO' => 'lib.pkp.classes.submission.reviewRound.ReviewRoundDAO',
461  'RoleDAO' => 'lib.pkp.classes.security.RoleDAO',
462  'ScheduledTaskDAO' => 'lib.pkp.classes.scheduledTask.ScheduledTaskDAO',
463  'SessionDAO' => 'lib.pkp.classes.session.SessionDAO',
464  'SiteDAO' => 'lib.pkp.classes.site.SiteDAO',
465  'StageAssignmentDAO' => 'lib.pkp.classes.stageAssignment.StageAssignmentDAO',
466  'SubEditorsDAO' => 'lib.pkp.classes.context.SubEditorsDAO',
467  'SubmissionAgencyDAO' => 'lib.pkp.classes.submission.SubmissionAgencyDAO',
468  'SubmissionAgencyEntryDAO' => 'lib.pkp.classes.submission.SubmissionAgencyEntryDAO',
469  'SubmissionCommentDAO' => 'lib.pkp.classes.submission.SubmissionCommentDAO',
470  'SubmissionDisciplineDAO' => 'lib.pkp.classes.submission.SubmissionDisciplineDAO',
471  'SubmissionDisciplineEntryDAO' => 'lib.pkp.classes.submission.SubmissionDisciplineEntryDAO',
472  'SubmissionEmailLogDAO' => 'lib.pkp.classes.log.SubmissionEmailLogDAO',
473  'SubmissionEventLogDAO' => 'lib.pkp.classes.log.SubmissionEventLogDAO',
474  'SubmissionFileDAO' => 'lib.pkp.classes.submission.SubmissionFileDAO',
475  'SubmissionFileEventLogDAO' => 'lib.pkp.classes.log.SubmissionFileEventLogDAO',
476  'QueryDAO' => 'lib.pkp.classes.query.QueryDAO',
477  'SubmissionLanguageDAO' => 'lib.pkp.classes.submission.SubmissionLanguageDAO',
478  'SubmissionLanguageEntryDAO' => 'lib.pkp.classes.submission.SubmissionLanguageEntryDAO',
479  'SubmissionKeywordDAO' => 'lib.pkp.classes.submission.SubmissionKeywordDAO',
480  'SubmissionKeywordEntryDAO' => 'lib.pkp.classes.submission.SubmissionKeywordEntryDAO',
481  'SubmissionSubjectDAO' => 'lib.pkp.classes.submission.SubmissionSubjectDAO',
482  'SubmissionSubjectEntryDAO' => 'lib.pkp.classes.submission.SubmissionSubjectEntryDAO',
483  'TimeZoneDAO' => 'lib.pkp.classes.i18n.TimeZoneDAO',
484  'TemporaryFileDAO' => 'lib.pkp.classes.file.TemporaryFileDAO',
485  'UserGroupAssignmentDAO' => 'lib.pkp.classes.security.UserGroupAssignmentDAO',
486  'UserDAO' => 'lib.pkp.classes.user.UserDAO',
487  'UserGroupDAO' => 'lib.pkp.classes.security.UserGroupDAO',
488  'UserSettingsDAO' => 'lib.pkp.classes.user.UserSettingsDAO',
489  'UserStageAssignmentDAO' => 'lib.pkp.classes.user.UserStageAssignmentDAO',
490  'VersionDAO' => 'lib.pkp.classes.site.VersionDAO',
491  'ViewsDAO' => 'lib.pkp.classes.views.ViewsDAO',
492  'WorkflowStageDAO' => 'lib.pkp.classes.workflow.WorkflowStageDAO',
493  'XMLDAO' => 'lib.pkp.classes.db.XMLDAO',
494  );
495  }
496 
503  public function getQualifiedDAOName($name) {
504  $map =& Registry::get('daoMap', true, $this->getDAOMap()); // Ref req'd
505  if (isset($map[$name])) return $map[$name];
506  return null;
507  }
508 
509 
510  //
511  // Statistics API
512  //
518  public function getMetricTypes($withDisplayNames = false) {
519  // Retrieve site-level report plugins.
520  $reportPlugins = PluginRegistry::loadCategory('reports', true, CONTEXT_SITE);
521  if (empty($reportPlugins)) return array();
522 
523  // Run through all report plugins and retrieve all supported metrics.
524  $metricTypes = array();
525  foreach ($reportPlugins as $reportPlugin) {
526  /* @var $reportPlugin ReportPlugin */
527  $pluginMetricTypes = $reportPlugin->getMetricTypes();
528  if ($withDisplayNames) {
529  foreach ($pluginMetricTypes as $metricType) {
530  $metricTypes[$metricType] = $reportPlugin->getMetricDisplayType($metricType);
531  }
532  } else {
533  $metricTypes = array_merge($metricTypes, $pluginMetricTypes);
534  }
535  }
536 
537  return $metricTypes;
538  }
539 
548  public function getDefaultMetricType() {
549  $request = $this->getRequest();
550  $site = $request->getSite();
551  if (!is_a($site, 'Site')) return null;
552  $defaultMetricType = $site->getData('defaultMetricType');
553 
554  // Check whether the selected metric type is valid.
555  $availableMetrics = $this->getMetricTypes();
556  if (empty($defaultMetricType)) {
557  // If there is only a single available metric then use it.
558  if (count($availableMetrics) === 1) {
559  $defaultMetricType = $availableMetrics[0];
560  } else {
561  return null;
562  }
563  } else {
564  if (!in_array($defaultMetricType, $availableMetrics)) return null;
565  }
566  return $defaultMetricType;
567  }
568 
587  public function getMetrics($metricType = null, $columns = array(), $filter = array(), $orderBy = array(), $range = null) {
588  import('classes.statistics.StatisticsHelper');
589  $statsHelper = new StatisticsHelper();
590 
591  // Check the parameter format.
592  if (!(is_array($filter) && is_array($orderBy))) return null;
593 
594  // Check whether which context we are.
595  $context = $statsHelper->getContext($filter);
596 
597  // Identify and canonicalize filtered metric types.
598  $defaultSiteMetricType = $this->getDefaultMetricType();
599  $siteMetricTypes = $this->getMetricTypes();
600  $metricType = $statsHelper->canonicalizeMetricTypes($metricType, $context, $defaultSiteMetricType, $siteMetricTypes);
601  if (!is_array($metricType)) return null;
602  $metricTypeCount = count($metricType);
603 
604  // Canonicalize columns.
605  if (is_scalar($columns)) $columns = array($columns);
606 
607  // The metric type dimension is not additive. This imposes two important
608  // restrictions on valid report descriptions:
609  // 1) We need at least one metric Type to be specified.
610  if ($metricTypeCount === 0) return null;
611  // 2) If we have multiple metrics then we have to force inclusion of
612  // the metric type column to avoid aggregation over several metric types.
613  if ($metricTypeCount > 1) {
614  if (!in_array(STATISTICS_DIMENSION_METRIC_TYPE, $columns)) {
615  array_push($columns, STATISTICS_DIMENSION_METRIC_TYPE);
616  }
617  }
618 
619  // Retrieve report plugins.
620  if (is_a($context, 'Context')) {
621  $contextId = $context->getId();
622  } else {
623  $contextId = CONTEXT_SITE;
624  }
625  $reportPlugins = PluginRegistry::loadCategory('reports', true, $contextId);
626  if (empty($reportPlugins)) return null;
627 
628  // Run through all report plugins and try to retrieve the requested metrics.
629  $report = array();
630  foreach ($reportPlugins as $reportPlugin) {
631  // Check whether one (or more) of the selected metrics can be
632  // provided by this plugin.
633  $availableMetrics = $reportPlugin->getMetricTypes();
634  $availableMetrics = array_intersect($availableMetrics, $metricType);
635  if (count($availableMetrics) == 0) continue;
636 
637  // Retrieve a (partial) report.
638  $partialReport = $reportPlugin->getMetrics($availableMetrics, $columns, $filter, $orderBy, $range);
639 
640  // Merge the partial report with the main report.
641  $report = array_merge($report, (array) $partialReport);
642 
643  // Remove the found metric types from the metric type array.
644  $metricType = array_diff($metricType, $availableMetrics);
645  }
646 
647  // Check whether we found all requested metric types.
648  if (count($metricType) > 0) return null;
649 
650  // Return the report.
651  return $report;
652  }
653 
661  public function getPrimaryMetricByAssoc($assocType, $assocId) {
662  $filter = array(
663  STATISTICS_DIMENSION_ASSOC_ID => $assocId,
664  STATISTICS_DIMENSION_ASSOC_TYPE => $assocType);
665 
666  $request = $this->getRequest();
667  $router = $request->getRouter();
668  $context = $router->getContext($request);
669  if ($context) {
670  $filter[STATISTICS_DIMENSION_CONTEXT_ID] = $context->getId();
671  }
672 
673  $metric = $this->getMetrics(null, array(), $filter);
674  if (is_array($metric)) {
675  if (!is_null($metric[0][STATISTICS_METRIC])) return $metric[0][STATISTICS_METRIC];
676  }
677 
678  return 0;
679  }
680 
686  public static function getCCLicenseOptions() {
687  return array(
688  'https://creativecommons.org/licenses/by-nc-nd/4.0' => 'submission.license.cc.by-nc-nd4',
689  'https://creativecommons.org/licenses/by-nc/4.0' => 'submission.license.cc.by-nc4',
690  'https://creativecommons.org/licenses/by-nc-sa/4.0' => 'submission.license.cc.by-nc-sa4',
691  'https://creativecommons.org/licenses/by-nd/4.0' => 'submission.license.cc.by-nd4',
692  'https://creativecommons.org/licenses/by/4.0' => 'submission.license.cc.by4',
693  'https://creativecommons.org/licenses/by-sa/4.0' => 'submission.license.cc.by-sa4'
694  );
695  }
696 
704  public function getCCLicenseBadge($ccLicenseURL, $locale = null) {
705  $licenseKeyMap = array(
706  '|http[s]?://(www\.)?creativecommons.org/licenses/by-nc-nd/4.0[/]?|' => 'submission.license.cc.by-nc-nd4.footer',
707  '|http[s]?://(www\.)?creativecommons.org/licenses/by-nc/4.0[/]?|' => 'submission.license.cc.by-nc4.footer',
708  '|http[s]?://(www\.)?creativecommons.org/licenses/by-nc-sa/4.0[/]?|' => 'submission.license.cc.by-nc-sa4.footer',
709  '|http[s]?://(www\.)?creativecommons.org/licenses/by-nd/4.0[/]?|' => 'submission.license.cc.by-nd4.footer',
710  '|http[s]?://(www\.)?creativecommons.org/licenses/by/4.0[/]?|' => 'submission.license.cc.by4.footer',
711  '|http[s]?://(www\.)?creativecommons.org/licenses/by-sa/4.0[/]?|' => 'submission.license.cc.by-sa4.footer',
712  '|http[s]?://(www\.)?creativecommons.org/licenses/by-nc-nd/3.0[/]?|' => 'submission.license.cc.by-nc-nd3.footer',
713  '|http[s]?://(www\.)?creativecommons.org/licenses/by-nc/3.0[/]?|' => 'submission.license.cc.by-nc3.footer',
714  '|http[s]?://(www\.)?creativecommons.org/licenses/by-nc-sa/3.0[/]?|' => 'submission.license.cc.by-nc-sa3.footer',
715  '|http[s]?://(www\.)?creativecommons.org/licenses/by-nd/3.0[/]?|' => 'submission.license.cc.by-nd3.footer',
716  '|http[s]?://(www\.)?creativecommons.org/licenses/by/3.0[/]?|' => 'submission.license.cc.by3.footer',
717  '|http[s]?://(www\.)?creativecommons.org/licenses/by-sa/3.0[/]?|' => 'submission.license.cc.by-sa3.footer'
718  );
719  if ($locale === null) $locale = AppLocale::getLocale();
720 
721  foreach($licenseKeyMap as $pattern => $key) {
722  if (preg_match($pattern, $ccLicenseURL)) {
723  PKPLocale::requireComponents(LOCALE_COMPONENT_PKP_SUBMISSION, $locale);
724  return __($key, array(), $locale);
725  }
726  }
727  return null;
728  }
729 
736  public static function getRoleNames($contextOnly = false, $roleIds = null) {
737  $siteRoleNames = array(ROLE_ID_SITE_ADMIN => 'user.role.siteAdmin');
738  $appRoleNames = array(
739  ROLE_ID_MANAGER => 'user.role.manager',
740  ROLE_ID_SUB_EDITOR => 'user.role.subEditor',
741  ROLE_ID_ASSISTANT => 'user.role.assistant',
742  ROLE_ID_AUTHOR => 'user.role.author',
743  ROLE_ID_REVIEWER => 'user.role.reviewer',
744  ROLE_ID_READER => 'user.role.reader',
745  );
746  $roleNames = $contextOnly ? $appRoleNames : $siteRoleNames + $appRoleNames;
747  if (!empty($roleIds)) $roleNames = array_intersect_key($roleNames, array_flip($roleIds));
748 
749  return $roleNames;
750  }
751 
756  public static function getWorkflowTypeRoles() {
757  return array(
758  WORKFLOW_TYPE_EDITORIAL => array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT),
759  WORKFLOW_TYPE_AUTHOR => array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_AUTHOR),
760  );
761  }
762 
769  public static function getWorkflowStageName($stageId) {
770  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_SUBMISSION, LOCALE_COMPONENT_APP_SUBMISSION);
771  switch ($stageId) {
772  case WORKFLOW_STAGE_ID_SUBMISSION: return 'submission.submission';
773  case WORKFLOW_STAGE_ID_INTERNAL_REVIEW: return 'workflow.review.internalReview';
774  case WORKFLOW_STAGE_ID_EXTERNAL_REVIEW: return 'workflow.review.externalReview';
775  case WORKFLOW_STAGE_ID_EDITING: return 'submission.editorial';
776  case WORKFLOW_STAGE_ID_PRODUCTION: return 'submission.production';
777  }
778  throw new Exception('Name requested for an unrecognized stage id.');
779  }
780 
787  public static function getWorkflowStageColor($stageId) {
788  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_SUBMISSION, LOCALE_COMPONENT_APP_SUBMISSION);
789  switch ($stageId) {
790  case WORKFLOW_STAGE_ID_SUBMISSION: return '#d00a0a';
791  case WORKFLOW_STAGE_ID_INTERNAL_REVIEW: return '#e05c14';
792  case WORKFLOW_STAGE_ID_EXTERNAL_REVIEW: return '#e08914';
793  case WORKFLOW_STAGE_ID_EDITING: return '#007ab2';
794  case WORKFLOW_STAGE_ID_PRODUCTION: return '#00b28d';
795  }
796  throw new Exception('Color requested for an unrecognized stage id.');
797  }
798 
804  public static function getReadableMaxFileSize() {
805  return strtolower(UPLOAD_MAX_FILESIZE) . 'b';
806  }
807 
813  public static function getIntMaxFileMBs() {
814  $num = substr(UPLOAD_MAX_FILESIZE, 0, (strlen(UPLOAD_MAX_FILESIZE) - 1));
815  $scale = strtolower(substr(UPLOAD_MAX_FILESIZE, -1));
816  switch ($scale) {
817  case 'g':
818  $num = $num / 1024;
819  case 'k':
820  $num = $num * 1024;
821  }
822  return floor($num);
823  }
824 
830  public static function getMetadataFields() {
831  return [
832  'coverage',
833  'languages',
834  'rights',
835  'source',
836  'subjects',
837  'type',
838  'disciplines',
839  'keywords',
840  'agencies',
841  'citations',
842  ];
843  }
844 }
845 
846 define('REALLY_BIG_NUMBER', 10000);
847 define('UPLOAD_MAX_FILESIZE', ini_get('upload_max_filesize'));
848 
849 define('WORKFLOW_STAGE_ID_PUBLISHED', 0); // FIXME? See bug #6463.
850 define('WORKFLOW_STAGE_ID_SUBMISSION', 1);
851 define('WORKFLOW_STAGE_ID_INTERNAL_REVIEW', 2);
852 define('WORKFLOW_STAGE_ID_EXTERNAL_REVIEW', 3);
853 define('WORKFLOW_STAGE_ID_EDITING', 4);
854 define('WORKFLOW_STAGE_ID_PRODUCTION', 5);
855 
856 /* TextArea insert tag variable types used to change their display when selected */
857 define('INSERT_TAG_VARIABLE_TYPE_PLAIN_TEXT', 'PLAIN_TEXT');
858 
859 // To expose LISTBUILDER_SOURCE_TYPE_... constants via JS
860 import('lib.pkp.classes.controllers.listbuilder.ListbuilderHandler');
861 
862 // To expose ORDER_CATEGORY_GRID_... constants via JS
863 import('lib.pkp.classes.controllers.grid.feature.OrderCategoryGridItemsFeature');
PKPString\init
static init()
Definition: PKPString.inc.php:51
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
PKPApplication\getQualifiedDAOName
getQualifiedDAOName($name)
Definition: PKPApplication.inc.php:503
PKPApplication\getContextList
getContextList()
$application
$application
Definition: index.php:65
PKPApplication\getMetricTypes
getMetricTypes($withDisplayNames=false)
Definition: PKPApplication.inc.php:518
PKPApplication\__construct
__construct()
Definition: PKPApplication.inc.php:123
PKPApplication\$enabledProducts
$enabledProducts
Definition: PKPApplication.inc.php:117
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PKPApplication\getPrimaryMetricByAssoc
getPrimaryMetricByAssoc($assocType, $assocId)
Definition: PKPApplication.inc.php:661
PKPApplication\getCurrentVersion
& getCurrentVersion()
Definition: PKPApplication.inc.php:410
BASE_SYS_DIR
const BASE_SYS_DIR(!defined('DIRECTORY_SEPARATOR'))
Definition: lib/pkp/includes/bootstrap.inc.php:32
PKPApplication\getCCLicenseBadge
getCCLicenseBadge($ccLicenseURL, $locale=null)
Definition: PKPApplication.inc.php:704
StatisticsHelper
Statistics helper class.
Definition: StatisticsHelper.inc.php:21
iPKPApplicationInfoProvider\getSubmissionSearchDAO
static getSubmissionSearchDAO()
Core\microtime
static microtime()
Definition: Core.inc.php:71
PKPApplication\getCCLicenseOptions
static getCCLicenseOptions()
Definition: PKPApplication.inc.php:686
Registry\set
static set($key, &$value)
Definition: Registry.inc.php:53
PKPApplication\getDefaultMetricType
getDefaultMetricType()
Definition: PKPApplication.inc.php:548
PKPApplication\getVersionDescriptorUrl
getVersionDescriptorUrl()
iPKPApplicationInfoProvider
Definition: PKPApplication.inc.php:72
PKPApplication
Class describing this application.
Definition: PKPApplication.inc.php:116
PluginRegistry\loadCategory
static loadCategory($category, $enabledOnly=false, $mainContextId=null)
Definition: PluginRegistry.inc.php:103
PKPApplication\getWorkflowStageColor
static getWorkflowStageColor($stageId)
Definition: PKPApplication.inc.php:787
PKPApplication\execute
execute()
Definition: PKPApplication.inc.php:311
PKPApplication\getIntMaxFileMBs
static getIntMaxFileMBs()
Definition: PKPApplication.inc.php:813
PKPApplication\getNameKey
getNameKey()
Registry\get
static & get($key, $createIfEmpty=false, $createWithDefault=null)
Definition: Registry.inc.php:35
PKPApplication\getPluginCategories
getPluginCategories()
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
iPKPApplicationInfoProvider\getSectionDAO
static getSectionDAO()
iPKPApplicationInfoProvider\getContextDAO
static getContextDAO()
PKPApplication\getWorkflowStageName
static getWorkflowStageName($stageId)
Definition: PKPApplication.inc.php:769
PKPApplication\getApplication
static getApplication()
Definition: PKPApplication.inc.php:227
PKPApplication\getDispatcher
getDispatcher()
Definition: PKPApplication.inc.php:287
PKPApplication\getMetadataFields
static getMetadataFields()
Definition: PKPApplication.inc.php:830
iPKPApplicationInfoProvider\getSubmissionSearchIndex
static getSubmissionSearchIndex()
Request
Mock implementation of the Request class.
Definition: Request.inc.php:21
iPKPApplicationInfoProvider\getFileDirectories
static getFileDirectories()
PKPApplication\getWorkflowTypeRoles
static getWorkflowTypeRoles()
Definition: PKPApplication.inc.php:756
PKPApplication\getReadableMaxFileSize
static getReadableMaxFileSize()
Definition: PKPApplication.inc.php:804
customAutoload
customAutoload($rootPath, $prefix, $class)
Definition: functions.inc.php:322
PKPApplication\$allProducts
$allProducts
Definition: PKPApplication.inc.php:118
PKPApplication\getHttpClient
getHttpClient()
Definition: PKPApplication.inc.php:243
iPKPApplicationInfoProvider\getContextAssocType
static getContextAssocType()
PKPApplication\getContextDepth
getContextDepth()
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
fatalError
if(!function_exists('import')) fatalError($reason)
Definition: functions.inc.php:32
PKPApplication\getEnabledProducts
& getEnabledProducts($category=null, $mainContextId=null)
Definition: PKPApplication.inc.php:365
PKPApplication\getMetrics
getMetrics($metricType=null, $columns=array(), $filter=array(), $orderBy=array(), $range=null)
Definition: PKPApplication.inc.php:587
Dispatcher
Class dispatching HTTP requests to handlers.
Definition: Dispatcher.inc.php:17
PKPApplication\getRoleNames
static getRoleNames($contextOnly=false, $roleIds=null)
Definition: PKPApplication.inc.php:736
PKPApplication\getRequest
getRequest()
Definition: PKPApplication.inc.php:270
AppLocale\getLocale
static getLocale()
Definition: env1/MockAppLocale.inc.php:40
DBConnection\getInstance
static getInstance($setInstance=null)
Definition: DBConnection.inc.php:241
PKPApplication\getName
static getName()
Definition: PKPApplication.inc.php:321
PKPLocale\requireComponents
static requireComponents()
Definition: PKPLocale.inc.php:374
PKPApplication\getDAOMap
getDAOMap()
Definition: PKPApplication.inc.php:420
iPKPApplicationInfoProvider\getApplicationStages
static getApplicationStages()
iPKPApplicationInfoProvider\getRepresentationDAO
static getRepresentationDAO()