time = Core::getCurrentDate(); $this->assocType = $assocType; $this->context = $context; $this->submission = $submission; $this->representation = $representation; $this->submissionFile = $submissionFile; $this->version = Registry::get('appVersion'); $this->request = Application::get()->getRequest(); $this->canonicalUrl = $this->getCanonicalUrl(); } /** * Get the canonical URL for the usage object * * @throws Exception */ protected function getCanonicalUrl(): string { $canonicalUrlPage = $canonicalUrlOp = null; $canonicalUrlParams = []; switch ($this->assocType) { case Application::ASSOC_TYPE_SUBMISSION_FILE_COUNTER_OTHER: case Application::ASSOC_TYPE_SUBMISSION_FILE: $canonicalUrlOp = 'download'; $canonicalUrlParams = [$this->submission->getId()]; $router = $this->request->getRouter(); /** @var PageRouter $router */ $op = $router->getRequestedOp($this->request); $args = $router->getRequestedArgs($this->request); if ($op == 'download' && count($args) > 1) { if ($args[1] == 'version' && count($args) == 5) { $publicationId = (int) $args[2]; $canonicalUrlParams[] = 'version'; $canonicalUrlParams[] = $publicationId; } } $canonicalUrlParams[] = $this->representation->getId(); $canonicalUrlParams[] = $this->submissionFile->getId(); break; case Application::ASSOC_TYPE_SUBMISSION: $canonicalUrlOp = 'view'; if (Application::get()->getName() == 'omp') { $canonicalUrlOp = 'book'; } $canonicalUrlParams = [$this->submission->getId()]; $router = $this->request->getRouter(); /** @var PageRouter $router */ $op = $router->getRequestedOp($this->request); $args = $router->getRequestedArgs($this->request); if ($op == $canonicalUrlOp && count($args) > 1) { if ($args[1] == 'version' && count($args) == 3) { $publicationId = (int) $args[2]; $canonicalUrlParams[] = 'version'; $canonicalUrlParams[] = $publicationId; } } break; case Application::getContextAssocType(): $canonicalUrlOp = ''; $canonicalUrlPage = 'index'; break; default: throw new Exception('Not recognized assoc type that we can create the canonical URL for.'); } $canonicalUrl = $this->getRouterCanonicalUrl($this->request, $canonicalUrlPage, $canonicalUrlOp, $canonicalUrlParams); return $canonicalUrl; } /** * Construct the URL from page, op, and params */ protected function getRouterCanonicalUrl(Request $request, string $canonicalUrlPage = null, string $canonicalUrlOp = null, array $canonicalUrlParams = null): string { $router = $request->getRouter(); /** @var PageRouter $router */ $context = $router->getContext($request); if (!isset($canonicalUrlPage)) { $canonicalUrlPage = $router->getRequestedPage($request); } if (!isset($canonicalUrlOp)) { $canonicalUrlOp = $router->getRequestedOp($request); } if (!isset($canonicalUrlParams)) { $canonicalUrlParams = $router->getRequestedArgs($request); } $canonicalUrl = $router->url( $request, null, $canonicalUrlPage, $canonicalUrlOp, $canonicalUrlParams ); // Make sure we log the server name and not aliases. $configBaseUrl = Config::getVar('general', 'base_url'); $requestBaseUrl = $request->getBaseUrl(); if ($requestBaseUrl !== $configBaseUrl) { // Make sure it's not an url override (no alias on that case). if (!in_array($requestBaseUrl, Config::getContextBaseUrls()) && $requestBaseUrl !== Config::getVar('general', 'base_url[index]')) { // Alias found, replace it by base_url from config file. // Make sure we use the correct base url override value for the context, if any. $baseUrlReplacement = Config::getVar('general', 'base_url[' . $context->getPath() . ']'); if (!$baseUrlReplacement) { $baseUrlReplacement = $configBaseUrl; } $canonicalUrl = str_replace($requestBaseUrl, $baseUrlReplacement, $canonicalUrl); } } return $canonicalUrl; } }