Neos\ContentRepository\Eel\FlowQueryOperations\FindOperation::evaluate PHP Метод

evaluate() публичный Метод

public evaluate ( FlowQuery $flowQuery, array $arguments ) : void
$flowQuery Neos\Eel\FlowQuery\FlowQuery the FlowQuery object
$arguments array the arguments for this operation
Результат void
    public function evaluate(FlowQuery $flowQuery, array $arguments)
    {
        $context = $flowQuery->getContext();
        if (!isset($context[0]) || empty($arguments[0])) {
            return;
        }
        $result = array();
        $selectorAndFilter = $arguments[0];
        $parsedFilter = null;
        $parsedFilter = FizzleParser::parseFilterGroup($selectorAndFilter);
        if (isset($parsedFilter['Filters']) && $this->hasOnlyInstanceOfFilters($parsedFilter['Filters'])) {
            $nodeTypes = array();
            foreach ($parsedFilter['Filters'] as $filter) {
                $nodeTypes[] = $filter['AttributeFilters'][0]['Operand'];
            }
            /** @var NodeInterface $contextNode */
            foreach ($context as $contextNode) {
                $result = array_merge($result, $this->nodeDataRepository->findByParentAndNodeTypeInContext($contextNode->getPath(), implode(',', $nodeTypes), $contextNode->getContext(), true));
            }
        } else {
            foreach ($parsedFilter['Filters'] as $filter) {
                $filterResults = array();
                $generatedNodes = false;
                if (isset($filter['IdentifierFilter'])) {
                    if (!preg_match(UuidValidator::PATTERN_MATCH_UUID, $filter['IdentifierFilter'])) {
                        throw new FlowQueryException('find() requires a valid identifier', 1332492263);
                    }
                    /** @var NodeInterface $contextNode */
                    foreach ($context as $contextNode) {
                        $filterResults = array($contextNode->getContext()->getNodeByIdentifier($filter['IdentifierFilter']));
                    }
                    $generatedNodes = true;
                } elseif (isset($filter['PropertyNameFilter']) || isset($filter['PathFilter'])) {
                    $nodePath = isset($filter['PropertyNameFilter']) ? $filter['PropertyNameFilter'] : $filter['PathFilter'];
                    foreach ($context as $contextNode) {
                        $node = $contextNode->getNode($nodePath);
                        if ($node !== null) {
                            array_push($filterResults, $node);
                        }
                    }
                    $generatedNodes = true;
                }
                if (isset($filter['AttributeFilters']) && $filter['AttributeFilters'][0]['Operator'] === 'instanceof') {
                    foreach ($context as $contextNode) {
                        $filterResults = array_merge($filterResults, $this->nodeDataRepository->findByParentAndNodeTypeInContext($contextNode->getPath(), $filter['AttributeFilters'][0]['Operand'], $contextNode->getContext(), true));
                    }
                    unset($filter['AttributeFilters'][0]);
                    $generatedNodes = true;
                }
                if (isset($filter['AttributeFilters']) && count($filter['AttributeFilters']) > 0) {
                    if (!$generatedNodes) {
                        throw new FlowQueryException('find() needs an identifier, path or instanceof filter for the first filter part', 1436884196);
                    }
                    $filterQuery = new FlowQuery($filterResults);
                    foreach ($filter['AttributeFilters'] as $attributeFilter) {
                        $filterQuery->pushOperation('filter', array($attributeFilter['text']));
                    }
                    $filterResults = $filterQuery->get();
                }
                $result = array_merge($result, $filterResults);
            }
        }
        $flowQuery->setContext(array_unique($result));
    }