我在扩展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是指应用程序模板,而不是供应商模板 - 因此它会自行扩展。有没有办法解决这个问题,而无需在供应商控制器中扩展控制器和覆盖模板名称?
答案 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' %}