diff --git a/Classes/ViewHelpers/Component/ExampleViewHelper.php b/Classes/ViewHelpers/Component/ExampleViewHelper.php index 3c272ea..7108144 100644 --- a/Classes/ViewHelpers/Component/ExampleViewHelper.php +++ b/Classes/ViewHelpers/Component/ExampleViewHelper.php @@ -6,6 +6,7 @@ use Sitegeist\FluidStyleguide\Domain\Model\Component; use Sitegeist\FluidStyleguide\Domain\Model\ComponentName; use Sitegeist\FluidStyleguide\Exception\RequiredComponentArgumentException; +use Sitegeist\FluidStyleguide\ViewHelpers\Component\RenderExampleViewHelper; use SMS\FluidComponents\Fluid\ViewHelper\ComponentRenderer; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface; @@ -60,16 +61,17 @@ public static function renderStatic( ), 1566377563); } - $fixtureData = $arguments['fixtureData'] ?? []; + $component = $arguments['component']; $componentContext = $arguments['context']; + $fixtureData = $arguments['fixtureData'] ?? []; if (isset($arguments['fixtureName'])) { - $componentFixture = $arguments['component']->getFixture($arguments['fixtureName']); + $componentFixture = $component->getFixture($arguments['fixtureName']); if (!$componentFixture) { throw new \InvalidArgumentException(sprintf( 'Invalid fixture name "%s" specified for component %s.', $arguments['fixtureName'], - $arguments['component']->getName()->getIdentifier() + $component->getName()->getIdentifier() ), 1566377564); } @@ -84,25 +86,36 @@ public static function renderStatic( } if ($arguments['execute']) { - try { + $closure = function (RenderingContextInterface $renderingContext) use ($fixtureData, $component) { // Parse fluid code in fixtures $fixtureData = self::renderFluidInExampleData($fixtureData, $renderingContext); - $componentMarkup = self::renderComponent( - $arguments['component'], + // Render component + return self::renderComponent( + $component, $fixtureData, $renderingContext ); + }; + + $contextData = array_replace( + $component->getDefaultValues(), + $fixtureData + ); + + try { + $viewHelperVariableContainer = $renderingContext->getViewHelperVariableContainer(); + $previousClosure = $viewHelperVariableContainer->get(RenderExampleViewHelper::class, 'closure'); + $viewHelperVariableContainer->add(RenderExampleViewHelper::class, 'closure', $closure); $componentWithContext = self::applyComponentContext( - $componentMarkup, + '', $componentContext, $renderingContext, - array_replace( - $arguments['component']->getDefaultValues(), - $fixtureData - ) + $contextData ); + + $viewHelperVariableContainer->add(RenderExampleViewHelper::class, 'closure', $previousClosure); } catch (\Exception $e) { if ($arguments['handleExceptions']) { return sprintf( @@ -117,7 +130,7 @@ public static function renderStatic( } } else { $componentMarkup = static::renderComponentTag( - $arguments['component']->getName(), + $component->getName(), $fixtureData ); @@ -226,9 +239,12 @@ public static function applyComponentContext( $context = self::checkObtainComponentContextFromFile($context); if (isset($renderingContext)) { - // Use unique value as component markup marker - $marker = '###COMPONENT_MARKUP_' . mt_rand() . '###'; - $context = str_replace('|', $marker, $context); + $renderingContext->getViewHelperResolver()->addNamespace( + 'fsv', + 'Sitegeist\\FluidStyleguide\\ViewHelpers' + ); + + $context = str_replace('|', $componentMarkup, $context); // Parse fluid tags in context string $originalVariableContainer = $renderingContext->getVariableProvider(); @@ -236,8 +252,7 @@ public static function applyComponentContext( $context = $renderingContext->getTemplateParser()->parse($context)->render($renderingContext); $renderingContext->setVariableProvider($originalVariableContainer); - // Wrap component markup - return str_replace($marker, $componentMarkup, $context); + return $context; } else { return str_replace('|', $componentMarkup, $context); } diff --git a/Classes/ViewHelpers/Component/RenderExampleViewHelper.php b/Classes/ViewHelpers/Component/RenderExampleViewHelper.php new file mode 100644 index 0000000..4c16ded --- /dev/null +++ b/Classes/ViewHelpers/Component/RenderExampleViewHelper.php @@ -0,0 +1,30 @@ +getViewHelperVariableContainer(); + $closure = $viewHelperVariableContainer->get(self::class, 'closure'); + + if (isset($closure)) { + return $closure($renderingContext); + } + } +}