我正在创建我的细枝扩展来扩展实际的“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文件。
我的问题是:
谢谢
你试过用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 元素是有形的,但是他们被限制在屏幕里面(电脑或者移动设备的屏幕),视觉元素