Project

General

Profile

1
<?php
2

    
3
/*
4
 * This file is part of Twig.
5
 *
6
 * (c) 2011 Fabien Potencier
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11

    
12
/**
13
 * Checks if a variable is defined in the current context.
14
 *
15
 * <pre>
16
 * {# defined works with variable names and variable attributes #}
17
 * {% if foo is defined %}
18
 *     {# ... #}
19
 * {% endif %}
20
 * </pre>
21
 *
22
 * @author Fabien Potencier <fabien@symfony.com>
23
 */
24
class Twig_Node_Expression_Test_Defined extends Twig_Node_Expression_Test
25
{
26
    public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno)
27
    {
28
        parent::__construct($node, $name, $arguments, $lineno);
29

    
30
        if ($node instanceof Twig_Node_Expression_Name) {
31
            $node->setAttribute('is_defined_test', true);
32
        } elseif ($node instanceof Twig_Node_Expression_GetAttr) {
33
            $node->setAttribute('is_defined_test', true);
34

    
35
            $this->changeIgnoreStrictCheck($node);
36
        } else {
37
            throw new Twig_Error_Syntax('The "defined" test only works with simple variables', $this->getLine());
38
        }
39
    }
40

    
41
    protected function changeIgnoreStrictCheck(Twig_Node_Expression_GetAttr $node)
42
    {
43
        $node->setAttribute('ignore_strict_check', true);
44

    
45
        if ($node->getNode('node') instanceof Twig_Node_Expression_GetAttr) {
46
            $this->changeIgnoreStrictCheck($node->getNode('node'));
47
        }
48
    }
49

    
50
    public function compile(Twig_Compiler $compiler)
51
    {
52
        $compiler->subcompile($this->getNode('node'));
53
    }
54
}
(2-2/7)