0

カスタム Web サイト システム用のカスタム Twig タグ ( http://twig.sensiolabs.org/doc/advanced.html#tags )を作成しようとしています。

テンプレートで次のタグを使用します。

{% entity '\\Testimonial\\Entity\\Testimonial' with { 'limit' : 2, 'column' : 'created' } %}

カスタム タグは、作成された列の順序でデータベースから最新の 2 件の証言を読み込みます。わかりました、これまでのところとても良いです。

TokenParser には、include タグのコードを使用しました。

class Entity extends Twig_TokenParser
{
    public function parse(Twig_Token $token)
    {

        $object         = $this -> parser -> getCurrentToken() -> getValue();

        if( empty($object))
        {
            return;
        }

        $expr           = $this->parser->getExpressionParser()->parseExpression();

            $variables      = $this->parseArguments();

        return new EntityNode( $object, $expr, $variables, $token->getLine(), $this->getTag() );
    }
    protected function parseArguments()
    {
        $stream = $this->parser->getStream();

        $variables = null;
        if ($stream->test(Twig_Token::NAME_TYPE, 'with')) {
            $stream->next();

            $variables = $this->parser->getExpressionParser()->parseExpression();
        }

        $stream->expect(Twig_Token::BLOCK_END_TYPE);

        return $variables;
    }
    public function getTag()
    {
        return "entity";
    }
}

そして、インクルードから借用したノードと、結果として得られた他のいくつかの例については、次のようになります。

class EntityNode extends Twig_Node implements Twig_NodeOutputInterface
{
    public function __construct( 
                    $object,
                    Twig_Node_Expression $expr,
                    Twig_Node_Expression $variables = null, 
                    $lineno, 
                    $tag = null )
    {
        parent::__construct(array('expr' => $expr, 'variables' => $variables), array("object" => $object), $lineno, $tag);
    }
    public function compile(Twig_Compiler $compiler)
    {
        $compiler->addDebugInfo($this);

        $obj        = $this->getAttribute('object');

        if( !is_callable( $obj ) || !class_exists( $obj ))
        {
            // error not callable
        }

        $entities   = forward_static_call( array( $obj , "TemplateEntity" ) , $this -> getNode( "variables" ));
        $subtemplate    = forward_static_call( array( $obj , "TemplateEntityTemplatePath" ));

        $template   = new Twig_Node_Expression_Constant( $subtemplate , $this -> getLine() );
        #return;
        $compiler
            -> write("\$this->env->loadTemplate(")
            -> subcompile($template)
            -> raw(")")
            ;
    }
}

結果は、basetemplate をロードできないという Twig からのエラーです。

Parse error: syntax error, unexpected 'echo' (T_ECHO) in /domains/<domain>/lib/framework/vendors/twig/lib/Twig/Environment.php(328) : eval()'d code on line 370
0 - Exception occurred

Exception -- Autoloader could not find base class __TwigTemplate_c56f3794ae5aed2d0cc25529303a838625ded364d30febb96cd025a5d7622121

Twig_Node まですべてが正しく機能することはわかっています。問題は、Twig が行を解析する方法にあります。$compiler -> write("\$this->env->loadTemplate(") -> subcompile($template) -> raw(")") ;

皆さんからの助けを得たいと思っています。どんな助けでも大歓迎です!

4

1 に答える 1

0

結局、Twig はコード内のエラーを定式化する奇妙な方法を持っています。

Twigノードディレクトリにある他のノードの例を注意深く検討した後;、コンパイラメソッドの最後に次の行がないことに気付きましたraw:

class EntityNode extends Twig_Node implements Twig_NodeOutputInterface
{
    public function __construct( 
                    $object,
                    Twig_Node_Expression $expr,
                    Twig_Node_Expression $variables = null, 
                    $lineno, 
                    $tag = null )
    {
        parent::__construct(array('expr' => $expr, 'variables' => $variables), array("object" => $object), $lineno, $tag);
    }
    public function compile(Twig_Compiler $compiler)
    {
        $compiler->addDebugInfo($this);

        $obj        = $this->getAttribute('object');

        if( !is_callable( $obj ) || !class_exists( $obj ))
        {
            // error not callable
        }

        $entities   = forward_static_call( array( $obj , "TemplateEntity" ) , $this -> getNode( "variables" ));
        $subtemplate    = forward_static_call( array( $obj , "TemplateEntityTemplatePath" ));

        $template   = new Twig_Node_Expression_Constant( $subtemplate , $this -> getLine() );
        #return;
        $compiler
            -> write("\$this->env->loadTemplate(")
            -> subcompile($template)
            -> raw(");\n")
            ;
    }
}
于 2013-09-08T19:49:27.187 に答える