Jackalope\ObjectManager::getNodesByPathAsArray PHP Method

getNodesByPathAsArray() public method

public getNodesByPathAsArray ( $paths, $class = 'Node', $typeFilter = null )
    public function getNodesByPathAsArray($paths, $class = 'Node', $typeFilter = null)
    {
        if (is_string($typeFilter)) {
            $typeFilter = array($typeFilter);
        }
        $nodes = $fetchPaths = array();
        foreach ($paths as $absPath) {
            if (!empty($this->objectsByPath[$class][$absPath])) {
                // Return it from memory if we already have it and type is correct
                if ($typeFilter && !$this->matchNodeType($this->objectsByPath[$class][$absPath], $typeFilter)) {
                    // skip this node if it did not match a type filter
                    continue;
                }
                $nodes[$absPath] = $this->objectsByPath[$class][$absPath];
            } else {
                $nodes[$absPath] = '';
                $fetchPaths[$absPath] = $this->getFetchPath($absPath, $class);
            }
        }
        $userlandTypeFilter = false;
        if (!empty($fetchPaths)) {
            if ($typeFilter) {
                if ($this->transport instanceof NodeTypeFilterInterface) {
                    $data = $this->transport->getNodesFiltered($fetchPaths, $typeFilter);
                } else {
                    $data = $this->transport->getNodes($fetchPaths);
                    $userlandTypeFilter = true;
                }
            } else {
                $data = $this->transport->getNodes($fetchPaths);
            }
            $inversePaths = array_flip($fetchPaths);
            foreach ($data as $fetchPath => $item) {
                // only add this node to the list if it was actually requested.
                if (isset($inversePaths[$fetchPath])) {
                    // transform back to session paths from the fetch paths, in case of
                    // a pending move operation
                    $absPath = $inversePaths[$fetchPath];
                    $node = $this->getNodeByPath($absPath, $class, $item);
                    if ($userlandTypeFilter) {
                        if (null !== $typeFilter && !$this->matchNodeType($node, $typeFilter)) {
                            continue;
                        }
                    }
                    $nodes[$absPath] = $node;
                    unset($inversePaths[$fetchPath]);
                } else {
                    // this is either a prefetched node that was not requested
                    // or it falls through the type filter. cache it.
                    // first undo eventual move operation
                    $parent = $fetchPath;
                    $relPath = '';
                    while ($parent) {
                        if (isset($inversePaths[$parent])) {
                            break;
                        }
                        if ('/' === $parent) {
                            $parent = false;
                        } else {
                            $parent = PathHelper::getParentPath($parent);
                            $relPath = '/' . PathHelper::getNodeName($parent) . $relPath;
                        }
                    }
                    if ($parent) {
                        $this->getNodeByPath($parent . $relPath, $class, $item);
                    }
                }
            }
            // clean away the not found paths from the final result
            foreach ($inversePaths as $absPath) {
                unset($nodes[$absPath]);
            }
        }
        return $nodes;
    }