Вход Регистрация
Файл: library/XenForo/Template/Compiler/Tag/If.php
Строк: 212
<?php

/**
* Class to handle compiling template tag calls for if/elseif/else/contentcheck.
*
* @package XenForo_Template
*/
class XenForo_Template_Compiler_Tag_If implements XenForo_Template_Compiler_Tag_Interface
{

    
/**
    * Compile the specified tag and return PHP code to handle it.
    *
    * @param XenForo_Template_Compiler The invoking compiler
    * @param string                 Name of the tag called
    * @param array                  Attributes for the tag (may be empty)
    * @param array                  Nodes (tags/curlies/text) within this tag (may be empty)
    * @param array                  Compilation options
    *
    * @return string
    */
    
public function compile(XenForo_Template_Compiler $compiler$tag, array $attributes, array $children, array $options)
    {
        if (
$tag == 'contentcheck')
        {
            throw 
$compiler->getNewCompilerException(new XenForo_Phrase('contentcheck_tag_found_that_was_not_direct_child_of_an_if_tag_with'));
        }
        else if (
$tag != 'if')
        {
            throw 
$compiler->getNewCompilerException(new XenForo_Phrase('else_or_else_if_tag_not_found_that_was_not_direct_child_of_an_if_tag'));
        }

        if (empty(
$options['allowRawStatements']))
        {
            throw 
$compiler->getNewCompilerException(new XenForo_Phrase('x_tags_only_used_where_full_statements_allowed', array('tag' => 'if')));
        }

        
$parts = array(
            
=> array(
                
'is' => isset($attributes['is']) ? $attributes['is'] : '',
                
'hascontent' => isset($attributes['hascontent']) ? $attributes['hascontent'] : '',
                
'segments' => array(),
                
'line' => $compiler->getLineNumber()
            )
        );
        
$partKey 0;

        
$haveElse false;

        foreach (
$children AS $child)
        {
            if (
$compiler->isSegmentNamedTag($child'elseif'))
            {
                if (
$haveElse)
                {
                    throw 
$compiler->getNewCompilerException(new XenForo_Phrase('else_if_tag_found_after_else_tag'), $child);
                }

                if (!empty(
$child['children']))
                {
                    throw 
$compiler->getNewCompilerException(new XenForo_Phrase('else_if_tags_may_not_have_children'), $child);
                }

                
$partKey++;
                
$parts[$partKey] = array(
                    
'is' => isset($child['attributes']['is']) ? $child['attributes']['is'] : '',
                    
'hascontent' => isset($child['attributes']['hascontent']) ? $child['attributes']['hascontent'] : '',
                    
'segments' => array(),
                    
'line' => $child['line']
                );
            }
            else if (
$compiler->isSegmentNamedTag($child'else'))
            {
                if (!empty(
$child['children']))
                {
                    throw 
$compiler->getNewCompilerException(new XenForo_Phrase('else_tags_may_not_have_children'), $child);
                }

                if (
$haveElse)
                {
                    throw 
$compiler->getNewCompilerException(new XenForo_Phrase('only_one_else_tag_allowed_per_if_tag'), $child);
                }

                
$haveElse true;

                
$partKey++;
                
$parts[$partKey] = array(
                    
'else' => true,
                    
'segments' => array(),
                    
'line' => $child['line']
                );
            }
            else
            {
                
$parts[$partKey]['segments'][] = $child;
            }
        }

        
$ifStatement $compiler->getNewRawStatement();
        
$prependCheckStatements $compiler->getNewRawStatement();
        
$allCheckVars = array();

        foreach (
$parts AS $partKey => $part)
        {
            
$conditionType = ($partKey == 'if' 'else if');

            if (!empty(
$part['is']))
            {
                
$condition $compiler->parseConditionExpression($part['is'], $options);

                
$ifStatement->addStatement($conditionType ' ' $condition "n{n")
                    ->
addStatement($compiler->compileSegments($part['segments'], $options))
                    ->
addStatement("}n");
            }
            else if (!empty(
$part['hascontent']))
            {
                
$childStatement $compiler->getNewStatementCollection();
                
$checkVars = array();

                foreach (
$part['segments'] AS $segment)
                {
                    if (
$compiler->isSegmentNamedTag($segment'contentcheck'))
                    {
                        
$prependCheckStatements->addStatement(
                            
$compiler->compileIntoVariable($segment['children'], $checkVar$options)
                        );

                        
$childStatement->addStatement('$' $checkVar);

                        
$checkVars[] = $checkVar;
                        
$allCheckVars[] = '$' $checkVar;
                    }
                    else
                    {
                        
$childStatement->addStatement($compiler->compileSegment($segment$options));
                    }
                }

                if (!
$checkVars)
                {
                    throw 
$compiler->getNewCompilerException(
                        new 
XenForo_Phrase('cannot_have_content_checking_if_tag_without_contentcheck_part'), $part['line']
                    );
                }

                
$conditionParts = array();
                foreach (
$checkVars AS $checkCondition)
                {
                    
$conditionParts[] = 'trim($' $checkCondition ") !== ''";
                }

                
$checkCond implode(' || '$conditionParts);

                
$ifStatement->addStatement("$conditionType ($checkCond)n{n")
                    ->
addStatement($childStatement)
                    ->
addStatement("}n");
            }
            else if (!empty(
$part['else']))
            {
                
$ifStatement->addStatement("elsen{n")
                    ->
addStatement($compiler->compileSegments($part['segments'], $options))
                    ->
addStatement("}n");
            }
            else
            {
                throw 
$compiler->getNewCompilerException(
                    new 
XenForo_Phrase('invalid_if_or_else_if_tag_missing_is_or_hascontent'), $part['line']
                );
            }
        }

        
$prependCheckStatements->addStatement($ifStatement);

        if (
$allCheckVars)
        {
            
$prependCheckStatements->addStatement("unset(" implode(', '$allCheckVars) . ");n");
        }

        return 
$prependCheckStatements;
    }
}
Онлайн: 0
Реклама