2016-04-05 1 views
0

私のバンドルのテンプレートを拡張することに問題があります。ここに状況があります: 私は自分のバンドルをベンダーに持っています。私のプロジェクトでは、このバンドルを使用して、いくつかのテンプレートを拡張することはできません(/vendor/company/my-bundle/src/Company/MyBundle/Resources/views/Module/index.html.twig)。私は1つのブロックを変更し、他のブロックを変更しないままにしたい。これは私がしたことです:app/Resources/CompanyMyBundle/views/Module/index.html.twigにテンプレートをオーバーライドし、ベンダーテンプレートを拡張しました:{%extends "CompanyMyBundle:Module:index.html.twig"%}symfonyテンプレートを拡張して1つのブロックのみをオーバーライドします

問題は、「ERR_EMPTY_RESPONSE」というエラーが返されることです。アプリからのテンプレートがベンダーをオーバーライドし、 "CompanyMyBundle:Module:index.html.twig"部分がベンダーのものではなくアプリテンプレートを参照するため、それ自体が拡張されています。コントローラを拡張せずにこの問題を解決し、ベンダコントローラのテンプレート名を上書きする方法はありますか?

答えて

0

私の意見では、これはテンプレートローダーの仕組みにはうまくいかないということです。ベンダーテンプレートのオーバーライドがある場合は、それを使用します。

テンプレートの一部を変更したい場合、ベンダーテンプレートのコードを所有している場合は、最も簡単な方法は、コードの一部を部分的にしてアプリケーションの部分をオーバーライドすることです。これは、何らかの理由でできない場合は

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

あなたは全体のテンプレートをオーバーライドする必要があります。

0

はオーバーライドされたリソースにアクセスするために、symfonyのカーネルを拡張:

<?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; 
     } 
    } 
} 

を次にあなたがこの方法をテンプレート拡張:

{% extends '!WebilityAdminBundle::layout.html.twig' %} 

感嘆符は、第二見つから結果ではなく、最初のものを使用することを意味します。 PS。新しいカーネルクラスを忘れないでくださいapp/AppKernel.php

関連する問題