1

フォームに開始時間ウィジェットと終了時間ウィジェットが必要です。

つまり、ユーザーは日付を選択してから、開始時刻と終了時刻を選択します。

標準の日付ウィジェットでは、日付と時刻を選択できますが、終了時刻も選択できるようにする必要があります。

以前にやったことがある人はいますか?

3 つの個別のウィジェットを作成できます。

  • 日にち
  • 始まる時間
  • 終了時間

フォームが保存されたら、オブジェクトを更新して、すべての値を 1 つに結合します。たとえば、日付を取得して開始時刻を追加し、「start_date」フィールドに保存します。次に、日付を取得して終了時刻を追加し、「end_date」フィールドに保存します。しかし、フォームフレームワークにとってはかなり些細なことを行うには、非常に長い道のりのように思えます。

これはあなたがそれを行う方法ですか?みんなありがとう!

4

3 に答える 3

2

symfony フォームで達成したいことはかなり簡単だと思います。その通りです。3 つの個別のウィジェットと 3 つの個別のバリデータが必要です。この正確な状況にすぐに使用できるソリューションはありません。

フォーム構成メソッドでは、次のようなものがあります。

$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(),
));

あなたが提案したように、オブジェクトに2つのプロパティがあると仮定しましょう。どちらも日時フィールドです。

アクションでは、日時フィールドを設定するために次のようなものがあります。

$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 を使用しないことです。通常のテキスト ボックス (中央揃え、最大長 = 5) を使用するだけで、sfValidatorTime バリデーターは引き続き完全に機能します。

それが役立つことを願っています。

于 2010-12-06T11:22:56.953 に答える
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 に答える
1

あなたの要件はアプリケーション固有のように聞こえますが、実際には Symfony フォーム フレームワークがすぐに役立つものではありません。

3 つのウィジェットの出力から start_date と end_date を生成するという提案に同意します。または、アプリケーションが後で date、start_time、および end_time を個別に返す必要がある場合は、3 つの値を個別に保存し、クエリ時にそれらを操作するだけです。

于 2010-12-01T21:54:00.607 に答える