表格中的可选日期
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 在网站上显示为今天的日期。下次我会检查我的数据库时吸取的教训。感谢您的帮助。以上是关于表格中的可选日期的主要内容,如果未能解决你的问题,请参考以下文章