*
*
*
*
*
*
*
*
* @author Claus Due
* @package Vhs
* @subpackage ViewHelpers
*/
class SwitchViewHelper extends AbstractViewHelper implements ChildNodeAccessInterface {
/**
* @var array
*/
private $childNodes = array();
/**
* @var mixed
*/
private $backup;
/**
* Initialize
* @return void
*/
public function initializeArguments() {
$this->registerArgument('value', 'string', 'Variable on which to switch - string, integer or number', TRUE);
$this->registerArgument('as', 'string', 'If specified, inserts the matched case tag content as variable using name from "as"');
}
/**
* @param array $childNodes
* @return void
*/
public function setChildNodes(array $childNodes) {
$this->childNodes = $childNodes;
}
/**
* Renders the case in the switch which matches variable, else default case
* @return string
*/
public function render() {
$content = '';
if (TRUE === method_exists($this, 'getRenderingContext')) {
$context = $this->getRenderingContext();
} else {
$context = $this->renderingContext;
}
if (TRUE === $context->getViewHelperVariableContainer()->exists('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', 'switchCaseValue')) {
$this->storeBackup($context);
}
$context->getViewHelperVariableContainer()->addOrUpdate('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', 'switchCaseValue', $this->arguments['value']);
$context->getViewHelperVariableContainer()->addOrUpdate('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', 'switchBreakRequested', FALSE);
$context->getViewHelperVariableContainer()->addOrUpdate('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', 'switchContinueUntilBreak', FALSE);
foreach ($this->childNodes as $childNode) {
if (TRUE === $childNode instanceof ViewHelperNode
&& $childNode->getViewHelperClassName() === 'FluidTYPO3\Vhs\ViewHelpers\CaseViewHelper') {
$content .= $childNode->evaluate($context);
$shouldBreak = $this->determineBooleanOf($context, 'switchBreakRequested');
if (TRUE === $shouldBreak) {
return $content;
}
}
}
$context->getViewHelperVariableContainer()->remove('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', 'switchCaseValue');
$context->getViewHelperVariableContainer()->remove('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', 'switchBreakRequested');
$context->getViewHelperVariableContainer()->remove('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', 'switchContinueUntilBreak');
if (NULL !== $this->backup) {
$this->restoreBackup($context);
}
if (TRUE === isset($this->arguments['as'])) {
$this->templateVariableContainer->add($this->arguments['as'], $content);
return NULL;
}
return $content;
}
/**
* @param RenderingContextInterface $context
* @return void
*/
protected function storeBackup(RenderingContextInterface $context) {
$this->backup = array(
$context->getViewHelperVariableContainer()->get('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', 'switchCaseValue'),
$this->determineBooleanOf($context, 'switchBreakRequested'),
$this->determineBooleanOf($context, 'switchContinueUntilBreak')
);
}
/**
* @param RenderingContextInterface $context
* @return void
*/
protected function restoreBackup(RenderingContextInterface $context) {
$context->getViewHelperVariableContainer()->add('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', 'switchCaseValue', $this->backup[0]);
$context->getViewHelperVariableContainer()->add('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', 'switchBreakRequested', $this->backup[1]);
$context->getViewHelperVariableContainer()->add('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', 'switchContinueUntilBreak', $this->backup[2]);
}
/**
* @param RenderingContextInterface $context
* @param mixed $var
* @return boolean
*/
protected function determineBooleanOf($context, $var) {
if (TRUE === $context->getViewHelperVariableContainer()->exists('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', $var)) {
return $context->getViewHelperVariableContainer()->get('FluidTYPO3\Vhs\ViewHelpers\SwitchViewHelper', $var);
}
return FALSE;
}
}