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
        if ($node instanceof Twig_Node_Expression_Name) {
29
            $node->setAttribute('is_defined_test', true);
30
        } elseif ($node instanceof Twig_Node_Expression_GetAttr) {
31
            $node->setAttribute('is_defined_test', true);
32

    
33
            $this->changeIgnoreStrictCheck($node);
34
        } elseif ($node instanceof Twig_Node_Expression_Constant || $node instanceof Twig_Node_Expression_Array) {
35
            $node = new Twig_Node_Expression_Constant(true, $node->getLine());
36
        } else {
37
            throw new Twig_Error_Syntax('The "defined" test only works with simple variables.', $this->getLine());
38
        }
39

    
40
        parent::__construct($node, $name, $arguments, $lineno);
41
    }
42

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

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

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