2014-06-05 32 views
0

我試圖使用樹枝擴展作爲窗口小部件來呈現頁面的各個部分。 我有這個類EventWidget,它是一個樹枝擴展,它定義了一個名爲event_widget_create的樹枝函數,它負責呈現我的實體的創建頁面。Symfony - 在表單中使用樹枝擴展可防止錯誤出現

問題是,即使在控制器或小部件功能中執行var_dump($form->getErrorsAsString())時顯示錯誤,視圖中也不會顯示任何表單錯誤。

有點我注意到,點擊提交時,字段數據消失,我感覺到頁面重新加載。

這裏是我的插件擴展代碼:

class EventWidget extends \Twig_Extension 
{ 
    /** 
    * @var Twig_Environment 
    */ 
    protected $env; 

    /** 
    * @var \Tsk\FEBundle\FormHandler\EventFormHandler 
    */ 
    protected $eventFormHandler; 

    function __construct(EventFormHandler $eventFormHandler) 
    { 
     $this->eventFormHandler = $eventFormHandler; 
    } 

    /** 
    * @param Twig_Environment $environment 
    */ 
    public function initRuntime(Twig_Environment $environment) 
    { 
     $this->env = $environment; 
    } 

    public function getFunctions() 
    { 
     return [ 
      new \Twig_SimpleFunction("event_widget_create", [$this, "getEventWidgetCreate"]),    
     ]; 
    } 


    public function getEventWidgetCreate(FormInterface $form) 
    { 
     return $this->env->render("@Default/Partial/events_widget_create.html.twig",[ 
      "form" => $form->createView() 
     ]); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return "event_widget"; 
    } 
} 

這是我的控制器:

/** 
* @Route("/") 
* 
* @package Tsk\FEBundle\Controller 
*/ 
class EventController extends Controller 
{ 
    /** 
    * @Route("/event/create", name="tsk_fe_event_create") 
    * @Template("@Default/event_create.html.twig") 
    * @Security("has_role('ROLE_ARTIST')") 
    */ 
    public function createEventAction(Request $request) 
    { 
     $handler = $this->get("tsk_fe.event_form.handler"); 
     $form = $handler->create(); 
     if ($request->getMethod() == "POST") { 
      if ($handler->process($form)) { 
       return new RedirectResponse($this->generateUrl("tsk_fe_default_index")); 
      } 
     } 
     return ["form" => $form]; 
    } 
} 

而且形式:

class EventType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add("title", "text", [ 
       "error_bubbling" => true 
      ]) 
      ->add("description", "textarea", [ 
       "required" => false 
      ]) 
      ->add("start", "thrace_datetimepicker", [ 
       "label" => "From", 
       "error_bubbling" => true 
      ]) 
      ->add("end", "thrace_datetimepicker", [ 
       "label" => "To", 
       "error_bubbling" => true 
      ]) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults([ 
      "data_class" => "Tsk\FEBundle\Entity\Event", 
     ]); 
    } 

    public function getName() 
    { 
     return "event"; 
    } 
} 

而且最後的觀點:

這是主要的觀點: "@Default/event_create.html.twig"

{% extends "@TskFE/layout.html.twig" %} 
{% block content %} 
    {{ event_widget_create(form)|raw }} 
{% endblock content %} 

這是一個的微件呈現的局部視圖: "@Default/Partial/events_widget_create.html.twig"

{% form_theme form with ['ThraceFormBundle:Form:fields.html.twig'] %} 
{{ form_start(form, {"action": url("tsk_fe_event_create"), 'attr': {'novalidate': 'novalidate'} }) }} 
    <div class="form-group"> 
     {{ form_label(form.title) }} 
     {{ form_widget(form.title, {"attr":{"class": "form-control"} }) }} 
     {{ form_errors(form.title) }} 
    </div> 
    <div class="form-group"> 
     {{ form_label(form.description) }} 
     {{ form_widget(form.description, {"attr":{"class": "form-control"} }) }} 
     {{ form_errors(form.description) }} 
    </div> 
    <div class="form-group"> 
     {{ form_label(form.start) }} 
     {{ form_widget(form.start, {"attr":{"class": "form-control"} }) }} 
     {{ form_errors(form.start) }} 
    </div> 
    <div class="form-group"> 
     {{ form_label(form.end) }} 
     {{ form_widget(form.end, {"attr":{"class": "form-control"} }) }} 
     {{ form_errors(form.end) }} 
    </div> 
    <input type="submit" value="Submit" class="btn btn-info"/> 
<a href="{{ url("tsk_fe_default_index") }}">Cancel</a> 
{{ form_rest(form) }} 
{{ form_end(form) }} 

回答

1

看來您已經使用'error_bubbling' => true冒泡你的錯誤。不知道它是否是你想要的,因爲你按字段單獨渲染錯誤。

錯誤冒泡意味着所有錯誤都附加到父窗體而不是附加到相關字段。因此,如果這是您想要的,您必須在您的模板上添加{{ form_errors(form) }}以顯示您的錯誤,否則請刪除error_bubbling選項。

+0

是的,這固定它。我意識到這一點,但小部件內部存在某種邏輯衝突,並且我開始在任何地方拋出該選項來測試,並忘記將其刪除。現在這個邏輯衝突修復了,我必須刪除'error_bubbling'。非常感謝。 –