Pimcore\Model\Document\Hardlink\Service::getNearestChildByPath PHP Method

getNearestChildByPath() public static method

public static getNearestChildByPath ( Hardlink $hardlink, $path ) : Document
$hardlink Pimcore\Model\Document\Hardlink
$path
return Pimcore\Model\Document
    public static function getNearestChildByPath(Document\Hardlink $hardlink, $path)
    {
        if ($hardlink->getChildrenFromSource() && $hardlink->getSourceDocument()) {
            $hardlinkRealPath = preg_replace("@^" . preg_quote($hardlink->getRealFullPath()) . "@", $hardlink->getSourceDocument()->getRealFullPath(), $path);
            $pathes = [];
            $pathes[] = "/";
            $pathParts = explode("/", $hardlinkRealPath);
            $tmpPathes = [];
            foreach ($pathParts as $pathPart) {
                $tmpPathes[] = $pathPart;
                $t = implode("/", $tmpPathes);
                if (!empty($t)) {
                    $pathes[] = $t;
                }
            }
            $pathes = array_reverse($pathes);
            foreach ($pathes as $p) {
                $hardLinkedDocument = Document::getByPath($p);
                if ($hardLinkedDocument instanceof Document) {
                    $hardLinkedDocument = self::wrap($hardLinkedDocument);
                    $hardLinkedDocument->setHardLinkSource($hardlink);
                    $_path = $path != "/" ? $_path = dirname($p) : $p;
                    $_path = str_replace("\\", "/", $_path);
                    // windows patch
                    $_path .= $_path != "/" ? "/" : "";
                    $_path = preg_replace("@^" . preg_quote($hardlink->getSourceDocument()->getRealPath()) . "@", $hardlink->getRealPath(), $_path);
                    $hardLinkedDocument->setPath($_path);
                    return $hardLinkedDocument;
                }
            }
        }
    }

Usage Example

Beispiel #1
0
 /**
  * @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;
 }