Exemplo n.º 1
0
 protected function compileConstructor(Apishka_Templater_Compiler $compiler)
 {
     $compiler->write("public function __construct(Apishka_Templater_Environment \$env)\n", "{\n")->indent()->subcompile($this->getNode('constructor_start'))->write("parent::__construct(\$env);\n\n");
     // parent
     if (null === ($parent = $this->getNode('parent'))) {
         $compiler->write("\$this->parent = false;\n\n");
     } elseif ($parent instanceof Apishka_Templater_Node_Expression_Constant) {
         $compiler->addDebugInfo($parent)->write('$this->parent = $this->loadTemplate(')->subcompile($parent)->raw(', ')->repr($compiler->getFilename())->raw(', ')->repr($this->getNode('parent')->getLine())->raw(");\n");
     }
     $countTraits = count($this->getNode('traits'));
     if ($countTraits) {
         // traits
         foreach ($this->getNode('traits') as $i => $trait) {
             $node = $trait->getNode('template');
             $compiler->write(sprintf('$_trait_%s = $this->loadTemplate(', $i))->subcompile($node)->raw(', ')->repr($compiler->getFilename())->raw(', ')->repr($node->getLine())->raw(");\n");
             $compiler->addDebugInfo($trait->getNode('template'))->write(sprintf("if (!\$_trait_%s->isTraitable()) {\n", $i))->indent()->write("throw new Apishka_Templater_Error_Runtime('Template \"'.")->subcompile($trait->getNode('template'))->raw(".'\" cannot be used as a trait.');\n")->outdent()->write("}\n")->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->getBlocks();\n\n", $i, $i));
             foreach ($trait->getNode('targets') as $key => $value) {
                 $compiler->write(sprintf('if (!isset($_trait_%s_blocks[', $i))->string($key)->raw("])) {\n")->indent()->write("throw new Apishka_Templater_Error_Runtime(sprintf('Block ")->string($key)->raw(' is not defined in trait ')->subcompile($trait->getNode('template'))->raw(".'));\n")->outdent()->write("}\n\n")->write(sprintf('$_trait_%s_blocks[', $i))->subcompile($value)->raw(sprintf('] = $_trait_%s_blocks[', $i))->string($key)->raw(sprintf(']; unset($_trait_%s_blocks[', $i))->string($key)->raw("]);\n\n");
             }
         }
         if ($countTraits > 1) {
             $compiler->write("\$this->traits = array_merge(\n")->indent();
             for ($i = 0; $i < $countTraits; ++$i) {
                 $compiler->write(sprintf('$_trait_%s_blocks' . ($i == $countTraits - 1 ? '' : ',') . "\n", $i));
             }
             $compiler->outdent()->write(");\n\n");
         } else {
             $compiler->write("\$this->traits = \$_trait_0_blocks;\n\n");
         }
         $compiler->write("\$this->blocks = array_merge(\n")->indent()->write("\$this->traits,\n")->write("array(\n");
     } else {
         $compiler->write("\$this->blocks = array(\n");
     }
     // blocks
     $compiler->indent();
     foreach ($this->getNode('blocks') as $name => $node) {
         $compiler->write(sprintf("'%s' => array(\$this, 'block_%s'),\n", $name, $name));
     }
     if ($countTraits) {
         $compiler->outdent()->write(")\n");
     }
     $compiler->outdent()->write(");\n")->outdent()->subcompile($this->getNode('constructor_end'))->write("}\n\n");
 }