2017-05-05 10 views
0

Symfonyフォームの使用時にユーザーがフォームを完成するまでの時間を取得したいと思います。Symfonyでフォームを完成させるためにユーザーが必要とする時間を取得します

$entity = new Entity(); 
$form = $this->get('form.factory')->create(new EntityType(), $entity); 

$begin_time = new \DateTime(); 

if ($form->handleRequest($request)->isValid() && $form->get('save')->isClicked()) { 
    $end_time = new \DateTime(); 
    $delta_time = $end_time->diff($begin_time); 
    $em = $this->getDoctrine()->getManager(); 
    $em->persist($entity); 
    $em->flush(); 
} 

私がフォームを送信すると、私の変数$ BEGIN_DATEと$ END_DATEは、このように私の間隔がnullの場合、等しい:

私の現在のコードは、(私は、エンティティとその関連フォームを持っている)は次のようです。これは、フォームを送信するときにコントローラが再初期化され、結果として$ begin_timeが再度変更されるためですか?

私はまた、フォームが送信されていないときの状態を作成しようとしました:

if(!$form->get('save')->isClicked()) { 
    $begin_time = new \DateTime(); 
} 

しかし、私はまだ$ END_TIMEに等しいの$ BEGIN_TIMEを得ます。ですから、私の質問は、ユーザーがフォームを完成させるために必要な時間と、Symfonyでこれを行う方法を得ることですか?

ご意見ありがとうございます。

+0

$ begin_time = $ entity-> getDate(); 'エンティティコンストラクタでその日付がどのように初期化されているかを表示できますか? – xDaizu

+0

これはエラーです。実際は$ begin_time = \ DateTime()です。私は質問を編集します。 – modkin

+0

あなたは提出時間に$ begin_timeを設定しています。そのタイムスタンプの値を要求時(ifの前)にフォームに保存し、送信処理(ifの内部)で回復させる必要があります。 – xDaizu

答えて

2

"data"パラメータを現在のタイムスタンプに設定して、EntityTypeにhidden inputを追加します。フォームの送信処理で

//Untested code 
$builder->add('begin_date', HiddenType::class, array(
    'data' => time(), 
    'mapped' => false 
)); 

、サーバー上の現在のタイムスタンプを取得し、あなたが隠し入力で受け取った金額をsubstract。

//Untested code 
if ($form->handleRequest($request)->isValid() && $form->get('save')->isClicked()) { 
    $begin_time = $form->getData()['begin_date']; 
    $end_time = new \DateTime(); 
    $delta_time = $end_time->diff($begin_time); 
    $em = $this->getDoctrine()->getManager(); 
    $em->persist($entity); 
    $em->flush(); 
} 

重要なことは、あなたが元の要求に設定された値が含まれているフォームデータ、からの$ begin_data値を取得する必要があるということです。

今、$ delta_timeは、ページと投稿の読み込み(ネットワーク転送を無視して、&ブラウザのレンダリング時間)からの時間を秒単位で表示する必要があります。


ユーザーがそれを隠し入力にそれがトリガされた最初の時間を設定して、フォーム上の「入力」イベントに関数をバインドすることができ、フォーム上の書き込みを開始した時間から測定したい場合。

+0

あなたのソリューションを試してみましたが、EntityType.phpに追加しました: $ builder-> add( 'begin_data'、 'hidden'、array( 'data' => new DateTime)) しかし、プロパティ "begin_data"とメソッド "getBeginData()"、 "beginData()"、 "isBeginData()"、 "hasBeginData()"、 "__get()"のいずれも存在せず、Entityクラスのパブリックアクセスもありません。 これは、エンティティファイルにこれらのメソッドを追加する必要があることを意味しますか? – modkin

+0

@modkinいいえ、[mappedプロパティ]を設定するだけです(http://symfony.com/doc/current/reference/forms/ types/hidden.html#mapped)をfalseに設定します。申し訳ありませんが、言及していませんでした。 – xDaizu

+0

はい、この部分はうまく動作します。ありがとうございます。フォーム自体に隠しフィールドを表示する必要がありますか?今私はこのエラーが表示されます: "キャッチ可能な致命的なエラー:クラスのオブジェクトSymfony \ Component \ Validator \ Constraints \ DateTimeを文字列に変換できませんでした" – modkin

関連する問題