带有symfony表单的可选DateType字段

时间:2016-05-21 07:53:49

标签: php forms symfony-forms symfony

我正在尝试在Symfony 3项目中创建用户个人资料编辑表单。

在这次尝试中,我编写了以下代码:

控制器:

/**
 * @Route("/profile/edit", name="user_edit_profile", methods={"GET"})
 * @Security("has_role('ROLE_USER')")
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function editMyProfileAction($form = null) {
    return $this->render('user/edit_profile.html.twig', [
        'form' => ($form !== null) ? $form->createView() : $this->createForm(UserProfileType::class, $this->getUser())->createView()
    ]);
}

/**
 * @Route("/profile/edit", name="user_update_profile", methods={"POST"})
 * @Security("has_role('ROLE_USER')")
 * @param \Symfony\Component\HttpFoundation\Request $request
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function updateMyProfileAction(Request $request) {
    $user = $this->getUser();

    $form = $this->createForm(UserProfileType::class, $user);
    $form->handleRequest($request);

    if(!$form->isValid()) {
        return $this->forward('AppBundle:User:editMyProfile', [
            'form' => $form
        ]);
    }
    $this->get('medievistes.user_manager')->updateUser($user);
    return $this->redirectToRoute('user_profile');
}

UserType,用于注册:

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\{AbstractType, FormBuilderInterface};
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\Extension\Core\Type\{EmailType, TextType, RepeatedType, PasswordType};

class UserType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', TextType::class)
            ->add('email', EmailType::class)
            ->add('plainPassword', RepeatedType::class, array(
                'type' => PasswordType::class,
                'invalid_message' => 'users.registration.password_mismatch',
                'first_options'  => ['label' => 'Password'],
                'second_options' => ['label' => 'Repeat Password'],
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
         $resolver->setDefaults(array(
             'data_class' => 'AppBundle\Entity\User'
         ));
    }
}

然后是UserProfileType,用于用户版:

    <?php

namespace AppBundle\Form;

use Symfony\Component\Form\{AbstractType, FormBuilderInterface};
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\Extension\Core\Type\{
    EmailType,
    TextType,
    RepeatedType,
    PasswordType,
    DateType
};

class UserProfileType extends UserType {

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);
        $builder
            ->add('username', TextType::class, [
                'disabled' => true
            ])
            ->add('email', TextType::class, [
                'disabled' => true
            ])
            ->add('firstname', TextType::class)
            ->add('lastname', TextType::class)
            ->add('birthdate', DateType::class, [
                'placeholder' => '',
                'widget' => 'single_text',
                'required' => false,
                'inherit_data' => true,
                'empty_data' => null
            ])
            ->add('avatar', AvatarType::class)
            ->remove('plainPassword')
        ;
    }
}

My Doctrine字段$ birthdate可以为空,我还没有设置任何验证限制。如你所见,我为“birthdate”字段尝试了很多选项:

  • 如果我只是让“小部件”选项,我的表单显示良好,具有birthdate的默认值。我希望它是可选的,如果用户没有填充它,则设置为null。但是当我提交带有默认值的表单时,我有错误“预期的类型参数”DateTime“,”NULL“给出”。
  • 所以我尝试添加一些选项。“required”设置为false没有帮助,同样的错误。
  • 然后我将“empty_data”设置为null。第一个改进,提交时我没有Symfony异常,但是表单错误,说“此值无效”。我进入了Symfony分析器,告诉我DateTime Data Transformer无法处理空值,期待字符串。我在“empty_values”中尝试了一个字符串,但是污物试图解析它。当用户不提供时,我不想要日期时间值。避免精神自杀我继续寻求工作代码。
  • 阅读文档,我遇到了最初禁用的未知“inherit_data”选项。我读了一个非常有趣的事情,告诉我这个选项在启用时可以避免使用Data Transformers。污秽会被忽略,就像我想要的那样。是的 !!有效 !经过一点胜利之舞后,我在配置文件显示中欣赏了我的空白生日数据。为了确保我的胜利,我试图点击“编辑我的表单”按钮,导致我的表单。然后,神经元屠杀:

`在第13行的form_div_layout.html.twig中,在呈现模板期间抛出异常(“Catchable Fatal Error:类AppBundle \ Entity \ User的对象无法转换为字符串”)。 / p>

  • 屈服于这么多的仇恨,我试图给那个神秘的邪恶形式组件提供它想要的东西。令我遗憾的是,我为我的用户类实现了一个__toString方法,返回用户名。表格再次出现,我以为我的痛苦已经结束了。验证使用空值。带着欢乐的泪水,我承诺并推送了我的修补程序(如果它没有投入生产,就不会有任何挑战)。再次开心,我试着填补生日。即使价值正确,它仍然是空的。

我删除了__toString方法,重新获得了我的开发者荣誉,在此之前观察返回的用户名被用作生日输入(真实WTF)的值属性。我真的会相信这是一个框架问题。但我希望我错了。我不经常使用表单组件。

请拯救我的灵魂。

0 个答案:

没有答案