Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Template/Compiler/Tag/DataRow.php
<?php

namespace XF\Template\Compiler\Tag;

use
XF\Template\Compiler\Syntax\Tag;
use
XF\Template\Compiler;

class
DataRow extends AbstractTag
{
    public function
compile(Tag $tag, Compiler $compiler, array $context, $inlineExpected)
    {
       
$options = $this->compileAttributesAsArray($tag->attributes, $compiler, $context,
            [
'label', 'hint', 'explain']
        );
       
$cells = new Compiler\CellBuilder($compiler);

        foreach (
$tag->children AS $child)
        {
            if (
$this->isNamedTag($child, ['label', 'hint', 'explain']))
            {
               
/** @var $child Tag */
               
$options[$child->name] = $compiler->compileToArraySyntax($child->children, $child->name, $context);
            }
            else if (
$this->compileExpectedCell($cells, $tag, $child, $compiler, $context))
            {
               
// ok
           
}
            else
            {
                throw
$child->exception(\XF::phrase('tag_x_contains_unexpected_child_element', ['name' => $tag->name]));
            }
        }

       
// popup, beforelabel, toggle, toggletitle, link
        // id, selectable/selectname/selectvalue/selectdisabled/selecttooltip, tooltip,
        // linkclass, labelclass, target, linkstyle, deletehint, class

       
$indent = $compiler->indent();
       
$optionCode = "array(" . implode('', $options) . "\n$indent)";
       
$cellsCode = $cells->toInline();

        return
"{$compiler->templaterVariable}->dataRow($optionCode, $cellsCode)";
    }

    protected function
compileExpectedCell(
       
Compiler\CellBuilder $cells,
       
Tag $tag,
       
Compiler\Syntax\AbstractSyntax $child,
       
Compiler $compiler,
        array
$context
   
)
    {
        if (
$this->isNamedTag($child, ['cell', 'action', 'delete', 'toggle', 'popup']))
        {
           
/** @var $child Tag */
           
$cells->handleCell(
               
$child->name,
               
$compiler->compileInlineList($child->children, $context),
               
$this->compileAttributesAsArray(
                   
$child->attributes, $compiler, $context, [], ['selected', 'disabled']
                )
            );

            return
true;
        }

        if (
$this->isNamedTag($child, 'main'))
        {
           
/** @var $child Tag */
           
$options = $this->compileAttributesAsArray(
               
$child->attributes, $compiler, $context, ['label', 'hint', 'explain']
            );
            foreach (
$child->children AS $grandchild)
            {
                if (
$this->isNamedTag($grandchild, ['label', 'hint', 'explain']))
                {
                   
/** @var $grandchild Tag */
                   
$options[$grandchild->name] = $compiler->compileToArraySyntax($grandchild->children, $grandchild->name, $context);
                }
                else if (!
$this->isEmptyString($grandchild))
                {
                    throw
$grandchild->exception(\XF::phrase('tag_x_contains_unexpected_child_element', ['name' => $child->name]));
                }
            }

           
$cells->handleCell($child->name, "''", $options);

            return
true;
        }

        if (
$this->isNamedTag($child, 'if'))
        {
           
/** @var $child Tag */

           
$cells->forceTempVariable();

           
$callback = function($type, array $elements) use ($child, $cells, $tag, $compiler, $context)
            {
                if (
$type == 'contentcheck')
                {
                    throw
$child->exception(\XF::phrase('contentcheck_based_if_tags_not_supported_with_cell_tags'));
                }

                foreach (
$elements AS $element)
                {
                   
$success = $this->compileExpectedCell($cells, $tag, $element, $compiler, $context);
                    if (!
$success)
                    {
                        throw
$child->exception(\XF::phrase('tag_x_contains_unexpected_child_element', ['name' => $child->name]));
                    }
                }
            };

           
/** @var IfTag $handler */
           
$handler = $child->getTag($compiler);
           
$handler->compileToCallback($child, $compiler, $context, $callback);

            return
true;
        }

        if (
$this->isNamedTag($child, 'foreach'))
        {
           
/** @var $child Tag */

           
$cells->forceTempVariable();

           
$callback = function($type, array $elements) use ($child, $cells, $tag, $compiler, $context)
            {
                foreach (
$elements AS $element)
                {
                   
$success = $this->compileExpectedCell($cells, $tag, $element, $compiler, $context);
                    if (!
$success)
                    {
                        throw
$child->exception(\XF::phrase('tag_x_contains_unexpected_child_element', ['name' => $child->name]));
                    }
                }
            };

           
/** @var IfTag $handler */
           
$handler = $child->getTag($compiler);
           
$handler->compileToCallback($child, $compiler, $context, $callback);

            return
true;
        }

        if (
$this->isEmptyString($child))
        {
            return
true;
        }

        return
false;
    }
}