提问者:小点点

交响乐2


我正在创建我的细枝扩展来扩展实际的“FormExtension”。原因是我需要在不覆盖当前函数的情况下创建新函数,并使其在整个项目中可用。

因此,建筑和扩建似乎是正确的选择。构建扩展不是问题,我的问题是如何从那里渲染块?

到目前为止,我所理解的是,我需要创建一个Twig_环境,在这里我必须加载我的实际Twig模板(包含我的块)。从那里,我应该能够使用“$mytemplate”渲染这些块-

示例代码:

公共函数renderWidgetinline(FormView$view,数组$variables=array()){

  $loader = new \Twig_Loader_Filesystem(__DIR__.'/../Resources/views/Form');
  $twig = new \Twig_Environment($loader);
  $this->template = $twig->loadTemplate("form_layout.html.twig");

  ob_start();
  $this->template->displayBlock(???WHAT-PARAMS???);
  $html = ob_get_clean();

  return $html;

}

我通过查看Symfony base FormExtension找到了这些信息。php文件。

我的问题是:

  1. displayBlock()是如何工作的,在哪里可以找到该函数的定义

谢谢


共1个答案

匿名用户

你试过用renderBlock代替吗?

您需要的第一个参数是块的名称,第二个参数应该是传递给块的值的关联数组。

因此,在呈现块的服务的情况下,您将看到以下内容:

服务类别:

<?php

namespace Acme\BlockBundle\Blocks;

use Doctrine\Common\Persistence\ObjectManager;

Class Block {

    private $om;
    private $environment;
    private $template;

    public function __construct( ObjectManager $om, Twig $environment )
    {
        $this->om = $om;
        $this->environment = $environment;
    }

    public function render( $template, $data )
    {
        $this->template = $this->environment->loadTemplate( $template );

        // maybe query the DB via doctrine, that is why I have included $om
        // in the service arguments
        // example:

        $entities = $om->getRepository( 'AcmePizzaBundle:Pizza' )->getMeatyOnes()

        return $this->template->renderBlock( 'acme_block', array(
            'data' => $entities,
        ));
    }
}

树枝扩展类

<?php

namespace Acme\BlockBundle\Twig\Extension;

use Twig_Extension;
use Twig_Function_Method;

class BlockExtension extends Twig_Extension
{
    protected $container;

    public function __construct( $container )
    {
        $this->container = $container;
    }

    public function getName()
    {
        return 'block_extension';
    }

    public function getFunctions()
    {
        return array(
            'render_block' => new Twig_Function_Method( $this, 'renderBlock', array(
                'is_safe' => array( 'html' ),
            )),
        );
    }

    public function renderBlock( $template, $data )
    {
        return $this->container->get( 'acme.block' )->render( $template, $data );
    }
}

服务。yml

parameters:
    acme.blocks.block.class:           Acme\BlocksBundle\Blocks\Block
    acme.twig.block_extension.class:   Acme\BlocksBundle\Twig\Extension\BlockExtension

services:
    acme.blocks.block:
        class:  '%acme.blocks.block.class%'
        arguments:
            - '@doctrine.orm.entity_manager'
            - '@twig'

acme.twig.block_extension:
    class: %acme.twig.block_extension.class%
    arguments:
        - '@service_container'
    tags:
        - { name: twig.extension }

不要忘记您的模板:

{% block acme_block %}
    {% spaceless %}
        {# do something with your data here #}
    {% endspaceless %}
{% endblock acme_block %}

然后,当您想要显示它时,只需调用刚刚创建的细枝函数:

{{ render_block( '::block_template.html.twig', someDataOneThePage ) }}

这并不意味着这是一个完整的解决方案,但我使用了类似的方法,并证明它是有效的。

HTH

[编辑:2016年4月-供参考:此解决方案用于Symfony 2.4项目]