1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
<?php
class LoopVarTemplateSyntaxElement extends AbstractTemplateSyntaxElement
{
public static function is_element(StringInputStream $input)
{
return $input->assert_next('(?:\w+\.)+\w+');
}
public function parse(TemplateSyntaxParserContext $context, StringInputStream $input, StringOutputStream $output)
{
$this->register($context, $input, $output);
$matches = array();
if ($input->consume_next('(?P<loop>\w+(?:\.\w+)*)\.(?P<var>\w+)', '', $matches))
{
$loop_name = $matches['loop'];
$varname = $matches['var'];
$this->check_loop($loop_name, $varname);
$loop_var = '$_tmp_' . str_replace('.', '_', $loop_name);
$output->write(TemplateSyntaxElement::DATA . '->get_from_list(\'' . $varname . '\', ' . $loop_var . ')');
}
else
{
throw new TemplateRenderingException('invalid loop variable name', $input);
}
}
private function check_loop($loop, $var)
{
if (!$this->context->is_in_loop($loop))
{
throw new TemplateRenderingException('Variable {' . $loop . '.' . $var .
'} is outsite of loop "' . $loop . '" scope.' . "\n" . 'loops scopes: ' .
'[' . implode(', ', $this->context->loops_scopes()) . ']', $this->input);
}
}
}
?>