【问题标题】:Symfony - Using twig extension with form prevents errors from showing upSymfony - 使用带有表单的树枝扩展可以防止错误出现
【发布时间】:2014-06-06 04:56:51
【问题描述】:

我正在尝试使用树枝扩展作为小部件来呈现页面的各个部分。 我有这个类EventWidget,它是一个twig 扩展,它定义了一个名为event_widget_create 的twig 函数,它负责呈现我的实体的创建页面。

问题是,即使我在控制器或小部件函数内执行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) }}

【问题讨论】:

    标签: php forms symfony widget twig


    【解决方案1】:

    您似乎使用'error_bubbling' =&gt; true 冒泡了您的错误。不确定这是否是您想要的,因为您按字段单独呈现错误。

    错误冒泡意味着所有错误都附加到父表单而不是附加到相关字段。因此,如果这是您想要的,您必须在模板中的表单顶部添加 {{ form_errors(form) }} 以显示错误,否则只需删除 error_bubbling 选项。

    【讨论】:

    • 是的,解决了它。我意识到了这一点,但是小部件内部存在某种逻辑冲突,我开始将这个选项扔到各处进行测试,却忘记了将其删除。现在解决了逻辑冲突,我必须删除error_bubbling。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多