表格中的可选日期

Posted

技术标签:

【中文标题】表格中的可选日期【英文标题】:Optional date in form 【发布时间】:2022-01-17 16:37:28 【问题描述】:

想以 symfony 形式添加可选的 DateType 类。它有点工作,因为我可以在不设置日期的情况下提交表单,但它会自动设置今天的日期。

TodoType.php

public function buildForm(FormBuilderInterface $builder, array $options): void
    
        $builder
            ->add('name')
            ->add('Deadline', DateType::class, [
                'widget' => 'single_text',
                'required' => false,
                'empty_data' => ''
            ])
            ->add('Submit', SubmitType::class)
        ;
    

截止日期

/**
* @ORM\Column(type="date", nullable=true)
*/
private $deadline;

...

public function getDeadline(): ?\DateTimeInterface
    
        return $this->deadline;
    

public function setDeadline(\DateTimeInterface $deadline = null): self
    
        $this->deadline = $deadline;

        return $this;
    

TodoController.php

    /**
     * @Route("/todos", methods="GET", "POST", name="todos")
     * 
     */
    public function todos(EntityManagerInterface $entityManager, Request $request): Response
    
        
        // Rendering todos
        $todos = $entityManager->getRepository(Todo::class)
            ->findBy(
                ['owner' => $this->getUser()]
            );
        

        // Creating new TODO
        $todo = new Todo();
        
        $todo
            ->setOwner($this->getUser())
            ->setCreationDate(new \DateTime());
        $form = $this->createForm(TodoType::class, $todo);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid())
        
            $entityManager->persist($todo);
            $entityManager->flush();
            
            return $this->redirectToRoute('todos');
         


        return $this->render('todo/todos.html.twig', [
            'todos' => $todos,
            'form' => $form->createView(),
        ]);
    

要在 .twig 中渲染,我只使用了 form(form) ,尚未对其进行自定义。

编辑:代码丢失

【问题讨论】:

你能告诉我们deadline实体的构造,以及带有javascript的html表单吗?并且管理表单的操作。 编辑并添加了缺失的代码。 【参考方案1】:

一切看起来都不错。

我试过了,它工作正常(在数据库中,我得到了 null): 表格:

$builder->add(
            'dateTime', DateType::class, [
                          'required' => false,
                          'widget'   => 'single_text',
                          'empty_data' => ''
                      ]
        );

实体


    public function __construct() 
        // empty
    

    /**
     * @var DateTime|null
     * @ORM\Column(name="date_time", type="datetime", nullable=true)
     */
    private ?DateTime $dateTime;

    /**
     * @return DateTime|null
     */
    public function getDateTime(): ?DateTime
    
        return $this->dateTime;
    

    /**
     * @param DateTime|null $dateTime
     *
     * @return SupportTimeSlot
     */
    public function setDateTime(?DateTime $dateTime): SupportTimeSlot
    
        $this->dateTime = $dateTime;
        return $this;
    

控制器



    /**
     * @Route("/time-slot-detail/id", name="time_slot_detail", methods="GET", "POST")
     * @param SupportTimeSlot        $supportTimeSlot
     * @param Request                $request
     * @param SupportTimeSlotManager $supportTimeSlotManager
     *
     * @return Response
     */
    public function timeSlotDetail(
        SupportTimeSlot $supportTimeSlot,
        Request $request,
        SupportTimeSlotManager $supportTimeSlotManager
    ): Response
    
        $form = $this->createForm(TimeSlotEditType::class, $supportTimeSlot);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) 
            $supportTimeSlotManager->save($supportTimeSlot);
            return $this->redirectToRoute('boa_support_time_slot_detail', ['id' => $supportTimeSlot->getId()]);
        
        return $this->render(
            'boa/support/detail.twig', [
                                         'timeSlot' => $supportTimeSlot,
                                         'form'     => $form->createView(),
                                     ]
        );
    

树枝

    <div class="row">
        <div class="col-12">
             form_start(form) 
             form_row(form.dateTime) 
            <button type="submit" class="btn btn-block btn-outline-info">
                 % trans %Save% endtrans %
            </button>
             form_end(form) 
        </div>
    </div>

我的项目包含一些 datepicker 和 datetimepicker js,也许尝试实例化 js 来检查它是否来自这个。

否则,请尝试在您的控制器中调试您的 $request。如果它为您的截止日期属性提供了一些日期,那么您的问题来自 twig/js 如果 $request 为空,但您的实体填充了截止日期的数据,那么您的问题来自您的构造 如果您使用 enpty 截止日期保存您的实体,但您在数据库中获得了一个,那么您的问题来自您的数据库

【讨论】:

好的,问题解决了。实际上,截止日期设置为 null,但由于 twig todo.deadline|("d/m/Y") null 在网站上显示为今天的日期。下次我会检查我的数据库时吸取的教训。感谢您的帮助。

以上是关于表格中的可选日期的主要内容,如果未能解决你的问题,请参考以下文章

怎样在excel表格中 插入日历 达到可选日期的效果

如何限制 Bootstrap Datepicker 中的可选日期范围?

比较表格中的日期和表格中的日期

如何使表格中只有一列可选?

将文本字段数据保存在 xcode 中的可扩展表格单元格中

如何处理 Play 框架中的可选查询参数