我需要在表单上有一个开始和结束时间小部件。
即。用户选择日期,然后选择开始和结束时间。
在标准日期窗口小部件中,您可以选择日期和时间,但我也需要能够选择完成时间。
你们之前有没有做过?
我可以创建3个单独的小部件:
保存表单后,我会对对象进行更新,将所有值合并为一个。例如,我将获取日期并为其添加开始时间,然后保存到字段“start_date”,然后我将获取日期并将结束时间添加到其中,然后保存到字段“end_date”。然而,对于表单框架而言,这似乎是一种非常漫长的方式来做一些相当微不足道的事情。
这是你怎么做的?谢谢你们!
答案 0 :(得分:2)
我认为你想用symfony形式实现的目标非常简单。你是对的,你需要三个单独的小部件和三个独立的验证器,没有针对这种情况的开箱即用的解决方案。
在表单配置方法中,您可以使用以下内容:
$this->setWidgets(array(
'date' => new sfWidgetFormDate(),
'time_start' => new sfWidgetFormTime(array('label' => 'Start Time', 'with_seconds' => false)),
'time_finish' => new sfWidgetFormTime(array('label' => 'End Time', 'with_seconds' => false)
));
$this->setValidators(array(
'date' => new sfValidatorDate(), // by default outputs in format Y-m-d
'time_start' => new sfValidatorTime(), // by default outputs in format H:i:s
'time_finish' => new sfValidatorTime(),
));
假设对象有两个属性,如您所建议的,都是日期时间字段。
在您的操作中,您可以使用以下内容设置日期时间字段:
$values = $this->form->getValues();
$object->setStartDateTime(sprintf('%s %s', $values['date'], $values['time_start']));
$object->setFinishDateTime(sprintf('%s %s', $values['date'], $value['time_finish']));
编辑:另一个建议是不使用内置时间小部件sfWidgetFormTime,因为它看起来很丑陋。您只需使用普通文本框(居中对齐,maxlength = 5),sfValidatorTime验证器仍可正常工作。
希望有所帮助。
答案 1 :(得分:1)
您的要求听起来特定于应用程序,而Symfony表单框架并不能帮助您开箱即用。
我建议您从三个小部件的输出中生成start_date和end_date,或者如果您的应用程序需要稍后单独返回date,start_time和end_time,那么可能只需单独保存三个值并在查询时操作它们。
答案 2 :(得分:1)
所以,我已经为它完成了代码并且它运行良好。我删除了所有不必要的小部件和验证器。我是这样做的:
class VisitForm extends BaseVisitForm
{
private function getMinutes()
{
$minutes = array();
for($i = 0; $i < 60; $i = $i + 5)
{
$minutes[$i] = sprintf('%02d', $i);
}
return $minutes;
}
public function configure()
{
$this->setWidgets(array(
'id' => new sfWidgetFormInputHidden(),
'date' => new sfWidgetFormJQueryDate(array('date_widget' => new sfWidgetFormDate(array('years' => $years, 'can_be_empty'=> false)), 'image' => '/images/icons/calendar.png', 'format'=>'%day%/%month%/%year%')),
'start_time' => new sfWidgetFormTime(array('with_seconds' => false,'can_be_empty'=> false, 'default' => '08:00', 'minutes'=> array_combine($this->getMinutes(), $this->getMinutes()))),
'end_time' => new sfWidgetFormTime(array('with_seconds' => false,'can_be_empty'=> false, 'default' => '08:00', 'minutes'=> array_combine($this->getMinutes(), $this->getMinutes())))
));
$this->setValidators(array(
'start_time' => new sfValidatorTime(),
'end_time' => new sfValidatorTime(),
'date' => new sfValidatorDate(),
));
$this->widgetSchema->setNameFormat('visit[%s]');
$this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
}
protected function doUpdateObject($values)
{
$this->getObject()->setStartDate(sprintf("%s %s", $values['date'], $values['start_time']));
$this->getObject()->setEndDate(sprintf("%s %s", $values['date'], $values['end_time']));
parent::doUpdateObject($values);
}
public function updateDefaultsFromObject()
{
if(!$this->getObject()->isNew())
{
$this->setDefault('date', $this->getObject()->getDateTimeObject('start_date')->format('Y-m-d'));
$this->setDefault('start_time', $this->getObject()->getDateTimeObject('start_date')->format('H:i'));
$this->setDefault('end_time', $this->getObject()->getDateTimeObject('end_date')->format('H:i'));
}
parent::updateDefaultsFromObject();
}
}