扩展symfony模板并仅覆盖一个块

时间:2016-04-05 08:42:05

标签: php symfony

我在扩展Bundle模板时遇到问题。以下是这种情况: 我在供应商中拥有自己的Bundle。在我的项目中,我使用这个Bundle,我不想扩展一些模板(让我们说:/ vendor / company / my-bundle / src / Company / MyBundle / Resources / views / Module / index。 html.twig)。我想改变一个块并保持其他块不变。这就是我所做的:我在app / Resources / CompanyMyBundle / views / Module / index.html.twig中创建了覆盖模板,并扩展了供应商模板:{%extends" CompanyMyBundle:Module:index.html .twig" %}

问题在于,作为回报,我得到了一个" ERR_EMPTY_RESPONSE"错误。来自app的模板会覆盖供应商和" CompanyMyBundle:Module:index.html.twig" part是指应用程序模板,而不是供应商模板 - 因此它会自行扩展。有没有办法解决这个问题,而无需在供应商控制器中扩展控制器和覆盖模板名称?

2 个答案:

答案 0 :(得分:0)

我的意见是,这不适用于模板加载器的工作方式。如果有供应商模板的覆盖,则使用它。

如果您想要更改模板的某些部分并拥有供应商模板的代码,那么最简单的方法就是让代码的一部分成为局部,然后覆盖应用程序中的部分。

{% include '_partial.html' with {'foo': 'bar'} %}

如果不是出于任何原因,您需要覆盖整个模板。

答案 1 :(得分:0)

扩展Symfony内核,以访问被覆盖的资源:

/^[-\w\s#|@%]+(?:,[-\w\s#|@%]+)*$/
//      ^^^^            ^^^^ 

然后以这种方式扩展模板:

<?php
namespace Webility\Bundle\WebilityBundle\HttpKernel;

use Symfony\Component\HttpKernel\Kernel as BaseKernel;

abstract class Kernel extends BaseKernel
{
    public function getBundle($name, $first = true)
    {
        $get_next = false;
        if($name[0] == '!' && $first){
            $name = substr($name, 1);
            $first = false;
            $get_next = true;
        }

        $bundles = parent::getBundle($name, $first);

        if($get_next){
            return isset($bundles[1]) ? $bundles[1] : $bundles[0];
        } else {
            return $bundles;
        }
    }

    public function locateResource($name, $dir = null, $first = true)
    {
        $get_next = false;
        if($name[0] == '@' && $name[1] == '!' && $first){
            $name = '@'.substr($name, 2);
            $first = false;
            $get_next = true;
        }

        $files = parent::locateResource($name, $dir, $first);

        if($get_next){
            return isset($files[1]) ? $files[1] : $files[0];
        } else {
            return $files;
        }
    }
}

感叹号表示使用第二个找到的结果,而不是第一个。 PS。不要忘记{% extends '!WebilityAdminBundle::layout.html.twig' %}

中的新内核类