/** * Handles the appearance of an object accessor (like {posts.author.email}). * Creates a new instance of \TYPO3Fluid\Fluid\ObjectAccessorNode. * * Handles ViewHelpers as well which are in the shorthand syntax. * * @param ParsingState $state The current parsing state * @param string $objectAccessorString String which identifies which objects to fetch * @param string $delimiter * @param string $viewHelperString * @param string $additionalViewHelpersString * @return void */ protected function objectAccessorHandler(ParsingState $state, $objectAccessorString, $delimiter, $viewHelperString, $additionalViewHelpersString) { $viewHelperString .= $additionalViewHelpersString; $numberOfViewHelpers = 0; // The following post-processing handles a case when there is only a ViewHelper, and no Object Accessor. // Resolves bug #5107. if (strlen($delimiter) === 0 && strlen($viewHelperString) > 0) { $viewHelperString = $objectAccessorString . $viewHelperString; $objectAccessorString = ''; } // ViewHelpers $matches = array(); if (strlen($viewHelperString) > 0 && preg_match_all(Patterns::$SPLIT_PATTERN_SHORTHANDSYNTAX_VIEWHELPER, $viewHelperString, $matches, PREG_SET_ORDER) > 0) { // The last ViewHelper has to be added first for correct chaining. foreach (array_reverse($matches) as $singleMatch) { if (strlen($singleMatch['ViewHelperArguments']) > 0) { $arguments = $this->recursiveArrayHandler($singleMatch['ViewHelperArguments']); } else { $arguments = array(); } $viewHelperNode = $this->initializeViewHelperAndAddItToStack($state, $singleMatch['NamespaceIdentifier'], $singleMatch['MethodIdentifier'], $arguments); if ($viewHelperNode) { $numberOfViewHelpers++; } } } // Object Accessor if (strlen($objectAccessorString) > 0) { if ($state->isCompilable() && !$state->isCompiled()) { $accessors = VariableExtractor::extractAccessors($state->getVariableContainer(), $objectAccessorString); } else { $accessors = array(); } $node = new ObjectAccessorNode($objectAccessorString, $accessors); $this->callInterceptor($node, InterceptorInterface::INTERCEPT_OBJECTACCESSOR, $state); $state->getNodeFromStack()->addChildNode($node); } // Close ViewHelper Tags if needed. for ($i = 0; $i < $numberOfViewHelpers; $i++) { $node = $state->popNodeFromStack(); $this->callInterceptor($node, InterceptorInterface::INTERCEPT_CLOSING_VIEWHELPER, $state); $state->getNodeFromStack()->addChildNode($node); } }
/** * @param mixed $subject * @param string $path * @param mixed $expected * @test * @dataProvider getAccessorsForPathTestValues */ public function testGetAccessorsForPath($subject, $path, $expected) { $result = VariableExtractor::extractAccessors($subject, $path); $this->assertEquals($expected, $result); }