Symfony1 Symfony表单开始和结束时间小部件
我需要在表单上有一个开始和结束时间小部件 i、 e.用户选择日期,然后选择开始和结束时间 在标准日期小部件中,您可以选择日期和时间,但是我也需要能够选择完成时间 你们有人做过吗 我可以创建3个单独的小部件: 日期 开始时间 结束时间 保存表单后,我将对对象进行更新,以将所有值合并为一个值。例如,我将获取日期并将开始时间添加到其中,然后保存到“开始日期”字段,然后获取日期并将结束时间添加到该字段,然后保存到“结束日期”字段。然而,对于表单框架来说,这似乎是一种非常冗长的方式来完成一些应该相当琐碎的事情Symfony1 Symfony表单开始和结束时间小部件,symfony1,symfony-1.4,symfony-forms,Symfony1,Symfony 1.4,Symfony Forms,我需要在表单上有一个开始和结束时间小部件 i、 e.用户选择日期,然后选择开始和结束时间 在标准日期小部件中,您可以选择日期和时间,但是我也需要能够选择完成时间 你们有人做过吗 我可以创建3个单独的小部件: 日期 开始时间 结束时间 保存表单后,我将对对象进行更新,以将所有值合并为一个值。例如,我将获取日期并将开始时间添加到其中,然后保存到“开始日期”字段,然后获取日期并将结束时间添加到该字段,然后保存到“结束日期”字段。然而,对于表单框架来说,这似乎是一种非常冗长的方式来完成一些应该相当琐碎的
你会这样做吗?谢谢大家 您的需求听起来是特定于应用程序的,而不是Symfony表单框架能够帮助您实现的现成功能
我同意你的建议,从三个小部件的输出中生成开始日期和结束日期,或者如果你的应用程序需要稍后分别返回日期、开始时间和结束时间,然后可能只需分别保存三个值,并在查询时对其进行操作。您的需求听起来与应用程序相关,而不是Symfony表单框架能够帮助您实现的现成功能
我同意你的建议,从三个小部件的输出中生成开始日期和结束日期,或者如果你的应用程序需要稍后分别返回日期、开始时间和结束时间,然后可能只需分别保存三个值,并在查询时对其进行操作。我认为您希望通过symfony表单实现的目标非常简单。您是对的,您需要三个单独的小部件和三个单独的验证器,对于这种情况没有现成的解决方案 在form configure方法中,您将有如下内容:
$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(),
));
让我们假设对象有两个属性,正如您所建议的,这两个属性都是datetime字段
在您的操作中,您可以使用类似以下的内容来设置日期时间字段:
$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,SFValidator时间验证器仍然可以完美地工作
希望这会有所帮助。我认为您希望通过symfony表单实现的目标非常简单。您是对的,您需要三个单独的小部件和三个单独的验证器,对于这种情况没有现成的解决方案 在form configure方法中,您将有如下内容:
$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(),
));
让我们假设对象有两个属性,正如您所建议的,这两个属性都是datetime字段
在您的操作中,您可以使用类似以下的内容来设置日期时间字段:
$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,SFValidator时间验证器仍然可以完美地工作
希望这能有所帮助。因此,我已经为它编写了代码,并且工作得非常好。我已经删除了所有不必要的小部件和验证器。我是这样做的:
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();
}
}
所以,我已经为它编写了代码,它运行得非常好。我已经删除了所有不必要的小部件和验证器。我是这样做的:
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();
}
}
嗨,汤姆。是的,我会继续这样做。恕我直言,您可能会认为它是一个现成的小部件。铁路公司、机场、航空公司、酒店公司、管理层等可能会在某个时候使用开始时间和结束时间小部件。但是,如果我创建了这个小部件,我会发布源代码来帮助其他人。是的,我会继续这样做。恕我直言,您可能会认为它是一个现成的小部件。铁路公司、机场、航空公司、酒店公司、管理层等可能会在某个时候使用开始时间和结束时间小部件。但是,如果我创建这个小部件,我会发布源代码来帮助其他人。因此有2个db字段,开始日期和结束日期,每个时间戳?是的,正是这样。每个的日期都是一样的,但是每个的时间都是不同的,希望这是有意义的,因为有2个db字段,开始日期和结束日期,每个时间戳?是的,正是这样。每一个的日期都是一样的,但是每一个的时间都是不同的。希望这是有意义的。马克,我就是这么做的。另外,我还需要添加一些额外的内容,比如编辑记录时填充字段等。不过,以贡献的赏金声誉为例!谢谢嗨,马克,我就是这么做的。另外,我还需要添加一些额外的内容,比如编辑记录时填充字段等。不过,以贡献的赏金声誉为例!谢谢