在Symfony中转换表单字段值

时间:2017-08-01 16:44:17

标签: symfony

我正在使用表格列以Unix时间戳格式存储“date_of_creation”(或created_at)(基本上是一个长度为11的整数)。

同时我想在我的创建/编辑webform(Bootstrap Datepicker)中使用DateTime格式“d-m-Y”处理这个值。

以下是问题

在期望接收整数的表列上转换并保持以DateTime格式传递的值的最佳方法是什么,反之,用其对应的DateTime格式覆盖表单字段默认值“timestamp format”(要制作)它可以被DatePicker识别出来吗?

我正在使用Symfony 3.3.5和Twig。

以下是一个示例

我已经使用了一种解决方法来达到范围,但我并不是100%肯定这是一个很好的做法......

FormType.php在类中添加一个文本字段来挂钩DatePicker小部件:

->add('createdAt', TextType::class, [
            'attr' => [
                'class' => 'js-datepicker'
            ],
        ])

实体设置器看起来像这样:

/**
 * @param mixed $createdAt
 */
public function setCreatedAt($createdAt, $stringToTime = true)
{
    $this->createdAt = ($stringToTime) ? strtotime($createdAt) : $createdAt;
}

这里真正的技巧是额外的$ stringToTime参数。

最后是controllerAction:

/**
 * @Route("/content/edit/{id}", name="admin_content_edit")
 */
public function editContentAction(Request $request, Content $content)
{
    $date = new \DateTime();
    $date->setTimestamp($content->getCreatedAt());
    $content->setCreatedAt($date->format('d-m-Y'), false);

    $form = $this->createForm(ContentType::class, $content);

    $form->handleRequest($request);
    if ($form->isSubmitted()){
        if ($form->isValid()) {

            $content = $form->getData();

            $em = $this->getDoctrine()->getManager();
            $em->persist($content);
            $em->flush();

            $this->addFlash('success', 'Content updated');

            return $this->redirectToRoute('admin_content_show');
        }
    }


    return $this->render('RootgearBundle:Default:editContent.html.twig', array(
        'contentForm' => $form->createView()
    ));
}

关键部分是:

$date = new \DateTime();
$date->setTimestamp($content->getCreatedAt());
$content->setCreatedAt($date->format('d-m-Y'), false);

这就是我所做的,它就像一个魅力。 但我不知道这是正确的方法,还是有更好的解决方案。

提前感谢更多欢迎致辞:)

=============基于Alain Tiembolo建议的新解决方案

在阅读了有关Data Transformer的文档之后,我终于想出了如何使用我的“Date”值

我通过使用带有闭包的CallbackTransformer和addModelTranformer对象仅将更改应用于我的formType类。

这个结果就像魅力一样:)

$builder->get('createdAt')
      ->addModelTransformer(new CallbackTransformer(
        function($dateTime) {
          $date = new \DateTime();
          $date->setTimestamp($dateTime);
          return $date->format('d-m-Y');
        },
        function($timestamp) {
          return $timestamp;
        }
      ));

2 个答案:

答案 0 :(得分:3)

好消息,Symfony Data Transformers正是为此做好的!

创建表单时,您可以添加:

use Symfony\Component\Form\CallbackTransformer;

// (...)

$builder->get('createdAt')
    ->addModelTransformer(new CallbackTransformer(
        function ($dateModelToView) {
            $date = new \DateTime();
            $date->setTimestamp($dateModelToView);
            return $date;
        },
        function ($dateViewToModel) {
            return $dateViewToModel->getTimestamp();
        }
   ));

转型将完全自动化。

答案 1 :(得分:1)

通常你使用一些ORM(如doctrine),你有数据库表的DateTime字段类型,生成的实体会自动将它们视为DateTimes(前端的html日期选择器)。

你根本不需要打扰它。

以下是一个示例:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html

希望它有所帮助。