2012-02-10 127 views
2

我試圖在我的應用程序中更改註冊表單的模板,以便我可以添加其他一些HTML。這裏是/My/UserBundle/Resources/views/Registration/register.html.twig文件:Symfony2 FOSUserBundle覆蓋表格

{% extends "MyUserBundle::layout.html.twig" %} 

{% block fos_user_content %} 
<section class="register site-content"> 
    <header> 
     <h1>{{ 'layout.register'|trans({}, 'FOSUserBundle') }}</h1> 
    </header> 
    <div class="block"> 
     {% include "FOSUserBundle:Registration:register_content.html.twig" %} 
    </div> 
</section> 
{% endblock fos_user_content %} 

而且我已經成功覆蓋了layout.html.twig:

{% extends 'MyMainBundle::layout.html.twig' %} 

{% block title %}{{ site_name }}{% endblock %} 

{% block content %} 
    {% for key, message in app.session.getFlashes() %} 
    <div class="{{ key }}"> 
     {{ message|trans({}, 'FOSUserBundle') }} 
    </div> 
    {% endfor %} 
    {% block fos_user_content %}{% endblock %} 
{% endblock %} 

以及form.html.twig:

{% extends 'FOSUserBundle::form.html.twig' %} 

{% block field_row %} 
    <li class="form_row"> 
     {{ form_label(form) }} 
     {{ form_errors(form) }} 
     {{ form_widget(form) }} 
    </li> 
{% endblock field_row %} 

{% block form_widget %} 
    <ul {{ block('container_attributes') }}> 
     {{ block('field_rows') }} 
     {{ form_rest(form) }} 
    </ul> 
{% endblock form_widget %} 

配置部分:

# FOS User Configuration 
fos_user: 
    db_driver: orm 
    firewall_name: main 
    user_class: My\UserBundle\Entity\User 
    from_email: 
     address: %admin_email% 
     sender_name: %site_name% 
    template: 
     engine: twig 
     theme: MyUserBundle::form.html.twig 

我清除了我的緩存。

每當我去

http://localhost/register/

阿帕奇只是掛起,直到超時。

我能弄明白的最好的是PHP最大執行消息說它崩潰在緩存中的樹枝模板上line 16。這條線是function doGetParent(...)的文件是:

<?php 

/* FOSUserBundle::form.html.twig */ 
class __TwigTemplate_9cf68a2af1db50466c556a735bcdeba0 extends Twig_Template 
{ 
    public function __construct(Twig_Environment $env) 
    { 
     parent::__construct($env); 

     $this->blocks = array(
      'field_row' => array($this, 'block_field_row'), 
      'form_widget' => array($this, 'block_form_widget'), 
     ); 
    } 

    protected function doGetParent(array $context) 
    { 
     return "FOSUserBundle::form.html.twig"; 
    } 

    protected function doDisplay(array $context, array $blocks = array()) 
    { 
     $this->getParent($context)->display($context, array_merge($this->blocks, $blocks)); 
    } 

    // line 3 
    public function block_field_row($context, array $blocks = array()) 
    { 
     // line 4 
     echo " <li class=\"form_row\"> 
     "; 
     // line 5 
     echo $this->env->getExtension('form')->renderLabel($this->getContext($context, "form")); 
     echo " 
     "; 
     // line 6 
     echo $this->env->getExtension('form')->renderErrors($this->getContext($context, "form")); 
     echo " 
     "; 
     // line 7 
     echo $this->env->getExtension('form')->renderWidget($this->getContext($context, "form")); 
     echo " 
    </li> 
"; 
    } 

    // line 11 
    public function block_form_widget($context, array $blocks = array()) 
    { 
     // line 12 
     echo " <ul "; 
     $this->displayBlock("container_attributes", $context, $blocks); 
     echo "> 
     "; 
     // line 13 
     $this->displayBlock("field_rows", $context, $blocks); 
     echo " 
     "; 
     // line 14 
     echo $this->env->getExtension('form')->renderRest($this->getContext($context, "form")); 
     echo " 
    </ul> 
"; 
    } 

    public function getTemplateName() 
    { 
     return "FOSUserBundle::form.html.twig"; 
    } 

    public function isTraitable() 
    { 
     return false; 
    } 
} 

超時上\vendor\twig\lib\Twig\Template.php on line 65這是public function getParent(array $context)

因此顯然有一些問題的getParent,但我不知道這意味着什麼或如何要解決這個問題。

回答

11

按照FOSUserBundle文檔:

覆蓋一個包的模板是簡單地放置在您的應用程序/資源文件夾 新的一個最簡單的方法。在FOSUserBundle 目錄要覆蓋位於資源/視圖的佈局模板 /layout.html.twig,你會將你在 應用程序/資源/ FOSUserBundle新的佈局模板/視圖/ layout.html.twig

正如你所看到的圖案以這種方式重寫模板是 創建一個文件夾在應用程序/資源 目錄捆綁類的名稱。然後將新模板添加到此文件夾,從原始包中保留 目錄結構。

在我的項目中,我重寫了FOSUserBundle的佈局,因爲他們說,它的工作就像一個魅力。

這樣做時,你需要創建app/Resources/FOSUserBundle/views/Registration/register.html.twig相同的方式。 (或形式要覆蓋)

編輯

好吧,我才意識到你已經選擇延長FOSUserBundle。在這種情況下,而不是app/Resources/,你需要在你的包裏面做。但是你不需要把

{% extends 'FOSUserBundle::form.html.twig' %} 

FOSUserBundle將檢測到你正在重寫該包,並將自動擴展。

而且你還需要告訴你的捆綁FOSUserBundle是其母公司。

class YourBundle extends Bundle 
{ 
    public function getParent() 
    { 
     return 'FOSUserBundle'; 
    } 
} 
+0

我會接受這個,因爲你提到刪除擴展部分是我的問題。 – Matt 2012-02-12 23:19:21

+0

我又增加了一件事,我忘了提及它。 – Axxiss 2012-02-13 09:52:18

+4

另外,編輯模板後不要忘記清除緩存,這可能是您更改不可見的原因。 (使用'php app/console cache:clear') – 2013-01-17 11:05:43

0

我覺得很蠢,只是刪除了form.html.twig中的{% extends ... %}行,它工作。我想我對捆綁中繼承的內容不夠了解。 (我也想從FOSUserBundle form.html.twig繼承,但我不知道如何訪問從從FOSUserBundle繼承的束)文件

1

複製:

{% include "FOSUserBundle:Registration:register_content.html.twig" %} 

到:app/Resources/FOSUserBundle/views/目錄。然後它會覆蓋基本的FOS表單。您可以編輯複製的文件。

否則,您必須重寫FOS RegisterController。

+0

這是另一種方式來做到這一點,當然,但我重寫了這個包,所以我可以用其他方式擴展它。 – Matt 2012-02-10 17:01:43