/** * @param $path * @param bool $ignoreHardlinks * @param array $types * @return Document|Document\PageSnippet|null|string */ protected function getNearestDocumentByPath($path, $ignoreHardlinks = false, $types = array()) { if ($this->nearestDocumentByPath instanceof Document) { $document = $this->nearestDocumentByPath; } else { $pathes = array(); $pathes[] = "/"; $pathParts = explode("/", $path); $tmpPathes = array(); foreach ($pathParts as $pathPart) { $tmpPathes[] = $pathPart; $t = implode("/", $tmpPathes); if (!empty($t)) { $pathes[] = $t; } } $pathes = array_reverse($pathes); foreach ($pathes as $p) { if ($document = Document::getByPath($p)) { if (empty($types) || in_array($document->getType(), $types)) { $this->nearestDocumentByPath = $document; break; } } else { if (Site::isSiteRequest()) { // also check for a pretty url in a site $site = Site::getCurrentSite(); $documentService = new Document\Service(); // undo the changed made by the site detection in self::match() $originalPath = preg_replace("@^" . $site->getRootPath() . "@", "", $p); $sitePrettyDocId = $documentService->getDocumentIdByPrettyUrlInSite($site, $originalPath); if ($sitePrettyDocId) { if ($sitePrettyDoc = Document::getById($sitePrettyDocId)) { $this->nearestDocumentByPath = $sitePrettyDoc; break; } } } } } } if ($document) { if (!$ignoreHardlinks) { if ($document instanceof Document\Hardlink) { if ($hardLinkedDocument = Document\Hardlink\Service::getNearestChildByPath($document, $path)) { $document = $hardLinkedDocument; } else { $document = Document\Hardlink\Service::wrap($document); } } } return $document; } return null; }