1

我需要在表单上有一个开始和结束时间小部件。

即用户选择一个日期,然后选择开始和结束时间。

在标准日期小部件中,您可以选择日期和时间,但是我也需要能够选择完成时间。

你们中有人做过吗?

我可以创建 3 个单独的小部件:

  • 日期
  • 开始时间
  • 时间结束

保存表单后,我将对对象进行更新以将所有值合并为一个。例如,我将获取日期并将开始时间添加到它,然后保存到字段“start_date”,然后我将获取日期并将结束时间添加到它,然后保存到字段“end_date”。然而,这似乎是一种非常冗长的方式来做一些对于表单框架来说应该是相当微不足道的事情。

你会这样做吗?多谢你们!

4

3 回答 3

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 验证器仍然可以正常工作。

希望有帮助。

于 2010-12-06T11:22:56.953 回答
1

您的要求听起来是特定于应用程序的,而 Symfony 表单框架并不能真正帮助您开箱即用。

我会同意您从三个小部件的输出生成 start_date 和 end_date 的建议,或者如果您的应用程序需要稍后分别返回 date、start_time 和 end_time,那么可能只需分别保存三个值并在查询时对其进行操作。

于 2010-12-01T21:54:00.607 回答
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();

  }
}
于 2010-12-06T12:43:00.950 回答