我正在尝试使用小枝扩展作为小部件来呈现页面的部分。我有这个类EventWidget
,这是一个分支扩展,它定义了一个分支函数称为event_widget_create
,负责渲染我的实体的创建页面。
问题是,视图内没有打印表单错误,即使我在控制器或小部件功能内执行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";
}
}
最后是view:
这是主视图:"@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) }}
看来你已经冒泡你的错误使用'error_bubbling' => true
。不确定这是否是您想要的,因为您按字段单独呈现错误。
Error冒泡意味着所有错误都附加到父表单上,而不是附加到相关字段上。所以,如果它是你想要的,你必须添加{{ form_errors(form) }}
在你的表单顶部在你的模板,以得到你的错误显示,否则,只是删除error_bubbling
选项。