17 define(
'PHP_REQUIRED_VERSION',
'7.2.0');
19 define(
'ROUTE_COMPONENT',
'component');
20 define(
'ROUTE_PAGE',
'page');
21 define(
'ROUTE_API',
'api');
23 define(
'API_VERSION',
'v1');
25 define(
'CONTEXT_SITE', 0);
26 define(
'CONTEXT_ID_NONE', 0);
27 define(
'CONTEXT_ID_ALL',
'*');
28 define(
'REVIEW_ROUND_NONE', 0);
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);
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);
57 define(
'ASSOC_TYPE_SUBMISSION_FILE_COUNTER_OTHER', 0x0000213);
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');
67 define(
'WORKFLOW_TYPE_EDITORIAL',
'editorial');
68 define(
'WORKFLOW_TYPE_AUTHOR',
'author');
70 use Illuminate\Database\Capsule\Manager as Capsule;
125 mt_srand(((
double) microtime()) * 1000000);
127 import(
'lib.pkp.classes.core.Core');
128 import(
'lib.pkp.classes.core.PKPString');
129 import(
'lib.pkp.classes.core.Registry');
131 import(
'lib.pkp.classes.config.Config');
134 require_once(
'lib/pkp/lib/vendor/autoload.php');
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);
143 import(
'lib.pkp.classes.db.DAORegistry');
144 import(
'lib.pkp.classes.db.XMLDAO');
146 import(
'lib.pkp.classes.cache.CacheManager');
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');
155 import(
'lib.pkp.classes.plugins.PluginRegistry');
156 import(
'lib.pkp.classes.plugins.HookRegistry');
158 import(
'classes.i18n.AppLocale');
172 if (!$conn->isConnected()) {
174 $dbconn =& $conn->getDBConn();
175 fatalError(
'Database connection failed: ' . $dbconn->errorMsg());
183 if (substr($driver, 0, 8) ===
'postgres') {
191 if ($charset !==
'latin1') {
195 $capsule =
new Capsule;
196 $capsule->addConnection([
204 'charset' => $charset,
205 'collation' =>
'utf8_general_ci',
207 $capsule->setAsGlobal();
211 spl_autoload_register(
function($class) {
216 spl_autoload_register(
function($class) {
235 public static function get() {
246 if (
Config::getVar(
'general',
'installed') && !defined(
'RUNNING_UPGRADE')) {
248 $userAgent .= $currentVersion->getVersionString();
253 return new \GuzzleHttp\Client([
260 'User-Agent' => $userAgent,
273 if (is_null($request)) {
274 import(
'classes.core.Request');
289 if (is_null($dispatcher)) {
290 import(
'lib.pkp.classes.core.Dispatcher');
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);
367 if (is_null($mainContextId)) {
369 $router = $request->getRouter();
373 $mainContext = $router->getContext($request, 1);
374 if ($mainContext) $mainContextId = $mainContext->getId();
375 else $mainContextId = CONTEXT_SITE;
377 if (!isset($this->enabledProducts[$mainContextId])) {
378 $settingContext = array();
379 if ($contextDepth > 0) {
381 $settingContext[] = $mainContextId;
382 $settingContext = array_pad($settingContext, $contextDepth, 0);
383 $settingContext = array_combine($this->
getContextList(), $settingContext);
387 $this->enabledProducts[$mainContextId] = $versionDao->getCurrentProducts($settingContext);
390 if (is_null($category)) {
391 return $this->enabledProducts[$mainContextId];
392 } elseif (isset($this->enabledProducts[$mainContextId][$category])) {
393 return $this->enabledProducts[$mainContextId][$category];
412 assert(count($currentVersion)) == 1;
413 return $currentVersion[$this->
getName()];
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',
432 'CurrencyDAO' =>
'lib.pkp.classes.currency.CurrencyDAO',
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',
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',
505 if (isset($map[$name]))
return $map[$name];
521 if (empty($reportPlugins))
return array();
524 $metricTypes = array();
525 foreach ($reportPlugins as $reportPlugin) {
527 $pluginMetricTypes = $reportPlugin->getMetricTypes();
528 if ($withDisplayNames) {
529 foreach ($pluginMetricTypes as $metricType) {
530 $metricTypes[$metricType] = $reportPlugin->getMetricDisplayType($metricType);
533 $metricTypes = array_merge($metricTypes, $pluginMetricTypes);
550 $site = $request->getSite();
551 if (!is_a($site,
'Site'))
return null;
552 $defaultMetricType = $site->getData(
'defaultMetricType');
556 if (empty($defaultMetricType)) {
558 if (count($availableMetrics) === 1) {
559 $defaultMetricType = $availableMetrics[0];
564 if (!in_array($defaultMetricType, $availableMetrics))
return null;
566 return $defaultMetricType;
587 public function getMetrics($metricType =
null, $columns = array(), $filter = array(), $orderBy = array(), $range =
null) {
588 import(
'classes.statistics.StatisticsHelper');
592 if (!(is_array($filter) && is_array($orderBy)))
return null;
595 $context = $statsHelper->getContext($filter);
600 $metricType = $statsHelper->canonicalizeMetricTypes($metricType, $context, $defaultSiteMetricType, $siteMetricTypes);
601 if (!is_array($metricType))
return null;
602 $metricTypeCount = count($metricType);
605 if (is_scalar($columns)) $columns = array($columns);
610 if ($metricTypeCount === 0)
return null;
613 if ($metricTypeCount > 1) {
614 if (!in_array(STATISTICS_DIMENSION_METRIC_TYPE, $columns)) {
615 array_push($columns, STATISTICS_DIMENSION_METRIC_TYPE);
620 if (is_a($context,
'Context')) {
621 $contextId = $context->getId();
623 $contextId = CONTEXT_SITE;
626 if (empty($reportPlugins))
return null;
630 foreach ($reportPlugins as $reportPlugin) {
633 $availableMetrics = $reportPlugin->getMetricTypes();
634 $availableMetrics = array_intersect($availableMetrics, $metricType);
635 if (count($availableMetrics) == 0)
continue;
638 $partialReport = $reportPlugin->getMetrics($availableMetrics, $columns, $filter, $orderBy, $range);
641 $report = array_merge($report, (array) $partialReport);
644 $metricType = array_diff($metricType, $availableMetrics);
648 if (count($metricType) > 0)
return null;
663 STATISTICS_DIMENSION_ASSOC_ID => $assocId,
664 STATISTICS_DIMENSION_ASSOC_TYPE => $assocType);
667 $router = $request->getRouter();
668 $context = $router->getContext($request);
670 $filter[STATISTICS_DIMENSION_CONTEXT_ID] = $context->getId();
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];
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'
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'
721 foreach($licenseKeyMap as $pattern => $key) {
722 if (preg_match($pattern, $ccLicenseURL)) {
724 return __($key, array(), $locale);
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',
746 $roleNames = $contextOnly ? $appRoleNames : $siteRoleNames + $appRoleNames;
747 if (!empty($roleIds)) $roleNames = array_intersect_key($roleNames, array_flip($roleIds));
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),
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';
778 throw new Exception(
'Name requested for an unrecognized stage id.');
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';
796 throw new Exception(
'Color requested for an unrecognized stage id.');
805 return strtolower(UPLOAD_MAX_FILESIZE) .
'b';
814 $num = substr(UPLOAD_MAX_FILESIZE, 0, (strlen(UPLOAD_MAX_FILESIZE) - 1));
815 $scale = strtolower(substr(UPLOAD_MAX_FILESIZE, -1));
846 define(
'REALLY_BIG_NUMBER', 10000);
847 define(
'UPLOAD_MAX_FILESIZE', ini_get(
'upload_max_filesize'));
849 define(
'WORKFLOW_STAGE_ID_PUBLISHED', 0);
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);
857 define(
'INSERT_TAG_VARIABLE_TYPE_PLAIN_TEXT',
'PLAIN_TEXT');
860 import(
'lib.pkp.classes.controllers.listbuilder.ListbuilderHandler');
863 import(
'lib.pkp.classes.controllers.grid.feature.OrderCategoryGridItemsFeature');