当前位置: 首页 > 知识库问答 >
问题:

交响乐2

邵胜涝
2023-03-14

我正在创建我的细枝扩展来扩展实际的“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个答案

易宏阔
2023-03-14

你试过用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项目]

 类似资料:
  • 当我在构造函数内的behat上下文文件中注入服务时,我想将behat与symfonyflex一起使用,autowire不起作用。我需要显式地将服务配置为public,以便在behat中使用该服务。有没有其他方法可以在不公开的情况下在behat上下文文件中注入服务? 在这里,我得到下面的错误"应用\数据消费者"服务或别名已被删除或内联时,容器被编译。您应该将其公开,或者直接停止使用容器,转而使用依赖

  • 我有一个实体,它将从traits中获取其属性(和基本方法): 这是正确的。但是,当我尝试将注释放在

  • 我读到了乐观锁定方案,客户端可以读取值,执行计算,当需要写入时,更新在写入数据库之前经过验证。 假设如果我们为乐观锁采用版本机制,那么(在两个客户端的情况下)两者都将具有更新语句,如下所示: 更新表名称集字段 = val,版本 = 旧版本 1,其中版本 = 旧版本,ID = x; 现在让我们考虑以下两个客户端的场景: > 两个客户端都读取字段和版本的值。 两个客户端都在那里计算一些东西。生成字段的

  • 我得到这个错误 Symfony\Component\Debug\Exception\fatalthrowable错误:传递给Illumb\Routing\Middleware\ThrottlereRequests::addHeaders()的参数1必须是Symfony\Component\HttpFoundation\Response的实例,给定为空, 当在Laravel 5.7的中间件中获取标题

  • 我的Symfony 3.4项目不再识别任何路线。终端(php-bin/console-debug:router)中的调试路由确实显示了所有路由,但app_dev.php不断给出错误消息。路由已启用,并在路由中设置为正确。yml文件。 清除缓存也不起作用。 邮件:资源:“@MailChimpBundle/Controller/”类型:注释前缀:/ 截图谢谢。

  • 【公司科普】酷家乐是一家专注于室内设计工具的独角兽公司,产品在国内室内设计圈里耳熟能详。并且此公司非常专注于用户体验,可以使得无设计经验的人也可以完成设计并渲染。 一面: 双方进行自我介绍 讲解作品集(对交互及ui各种细节挖掘很深) 在你的项目中你扮演的角色 用户研究常用的方法 需求如何转换为功能 你对于设计问卷的经验及看法 是否有过酷家乐使用经验 在你的这个项目中如何实现商业化 你的App是否考

  • 我对Symfony2中的令牌形式有问题。(2.7.0) 行动: 我的表格: 当我测试表单时,总是显示相同的错误:“CSRF令牌无效。请尝试重新提交表单”。我确信输入隐藏在表单中。这是一种观点: 谁能帮帮我? 我测试禁用csrf保护,像这样: 行动: 形式: 但是出现了一个不同的错误:此表单不应包含额外的字段。因为令牌的隐藏输入,它还在表单中,我不知道要删除它。 谢谢你!

  • 响应式交互能让用户信任,并且吸引他们。 当用户操作一个美观且符合常理的应用时,他们会感到满意甚至很高兴。那是一种经过深思熟虑、有目的、非随机的而且可以带有轻微异想天开但不会让人分心的交互。 在 material design 中,应用是响应式的并且渴望用户操作的: 触摸,语音,键盘及鼠标作为首要考虑的输入方式。 虽然 UI 元素是有形的,但是他们被限制在屏幕里面(电脑或者移动设备的屏幕),视觉元素