2010-12-01 35 views
1

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

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

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

以前に行ったことがありますか?

私は3つの別々のウィジェットを作成することができます。フォームが保存されると

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

    これはどのように行うのですか?みんなありがとう!

+0

したがって、2つのdbフィールド、start_dateとend_date、各タイムスタンプがありますか? –

+0

うん、まさにそれ。それぞれの日付は同じですが、それぞれの時間は異なります(意味があることを望みます)。 – Flukey

答えて

2

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

あなたはのようなものだろう:あなたが示唆したように、のオブジェクトが2つのプロパティを持っていると仮定しましょう

$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バリデーターは引き続き完全に動作します。

希望に役立ちます。

+0

こんにちはマーク、これは私がそれをやったところです。さらに、レコードを編集するときにフィールドにデータを追加するなど、いくつか余分なビットを追加する必要がありました。それでも、寄付の賞金の評判を取ってください!ありがとう! – Flukey

1

あなたの要件はアプリケーション固有のものであり、Symfonyフォームフレームワークがすぐに使えるものではないと思われます。

3つのウィジェットの出力からstart_dateとend_dateを生成することをお勧めします。あるいは、アプリケーションがstart_timeとend_timeを別々に返す必要がある場合は、3つの値を別々に保存し、 。

+0

こんにちは。ええ、私はこのようにするつもりです。すべての敬意を払って、あなたはそれがすぐに使えるウィジェットであると思ったでしょう。鉄道会社、空港、航空会社、ホテル企業、経営幹部などは、ある時点では「開始時刻」と「終了時刻」ウィジェットを使用するでしょう。しかし、ウィジェットを作成すると、他の人を助けるソースコードがリリースされます。 – Flukey

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

    } 
} 
関連する問題