Symfony -使用小枝扩展与表单防止错误显示


Symfony - Using twig extension with form prevents errors from showing up

我正在尝试使用小枝扩展作为小部件来呈现页面的部分。我有这个类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选项。