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
 * @package twig
23
 * @author  Fabien Potencier <fabien@symfony.com>
24
 */
25
class Twig_Node_Expression_Test_Defined extends Twig_Node_Expression_Test
26
{
27
    public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno)
28
    {
29
        parent::__construct($node, $name, $arguments, $lineno);
30

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

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

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

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

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