2

序章

オンコール プログラマーが割り当てられた日に携帯している「オンコール」携帯電話を交換しようとしています。緊急の場合は、ヘルプ デスクがその携帯電話に電話します。現在、緊急時にヘルプ デスクが記入する Web フォームに切り替える予定です。フォームが送信されると、スクリプトは (php api を使用して) Google カレンダーと通信し、誰が通話中であるかを確認し、その時点で通話中のプログラマーに緊急事態を警告するテキスト メッセージを送信します。現時点で誰も電話に出ていない場合は、次の電話担当者にメールが届き、翌朝一番に問題に取り組むことができます。定期的なイベントを除いて、これらすべてが機能しています。

単一のイベントで遊んで true に設定すると、現在のイベントの取得をクエリに処理させることにするまではうまくいきました (一連のイベントを取得して手動で時間を確認するのではなく)。たとえば、誰かが現在通話中の場合、そのプログラマーの名前を持つ現在のイベントが存在し、返される必要があります。このイベントは、誰かが日を取引したかどうかに応じて、繰り返される場合と繰り返されない場合があります。現在予定されているイベントがない場合は、テキスト メッセージを送信する代わりに、次のオンコール担当者にメールを送信する [else] に陥ります。else セクションで、最大開始日を 7 日間先に切り替えます。


クエリコードは次のようになります。

$now = date("c");
$gdataCal = new Zend_Gdata_Calendar($client);
$query = $gdataCal->newEventQuery();
$query->setUser('[our_resource_is_here]@resource.calendar.google.com');
$query->setVisibility('private');
$query->setProjection('full');
$query->setOrderby('starttime');
$query->setStartMin($now);
$query->setStartMax($now);
$query->setFutureevents(false);
$query->setSingleevents(true);
$query->setSortorder('a');
$eventFeed = $gdataCal->getCalendarEventFeed($query);
foreach ($eventFeed as $event) {
    foreach ($event->when as $when) {
        echo $when->startTime.'';
        echo $when->endTime.'';
        echo $event->title->text.'';   
    }
}

実行した手順

1) 8 時から 5 時までの定期的なイベントを作成し、繰り返し期間に終わりはありません。
2) 次に、単一のイベントを削除し (誰かの取引日をテストするため)、別のイベントを笑いのために追加します (他のイベントは必要ありませんが、問題を示すのに役立ちます)。

以下のデータに関する情報:
クエリ範囲で削除される定期的なイベントは「Ben」というタイトルで、その日に実際にスケジュールされている定期的でない 2 番目のイベントは「テスト」と呼ばれます。タイトル、開始時刻、終了時刻を返す場合の出力は以下の通り。カレンダーに「Ben」イベントはありませんが、開始時間制限が非常に厳密に設定されていても (コードの $now を参照)、3 回表示されることを覚えておいてください。


$query->setSingleevents(false); で」

2010-05-03T08:00:00.000-05:00
2010-05-03T17:00:00.000-05:00
Ben
2010-05-03T08:00:00.000-05:00
2010-05-03T17:00:00.000-05:00 
Ben
2010-05-03T08:00:00.000-05:00
2010-05-03T17:00:00.000-05:00
Ben
2010-05-03T13:30:00.000-05:00
2010-05-03T15:00:00.000-05:00
test

「$query->setSingleevents(true);」で

2010-05-03T13:30:00.000-05:00
2010-05-03T15:00:00.000-05:00
test

結果の説明

私は本当に関数が誰かの単一の名前を返すことだけを望んでいます(つまり、現在のイベントのみ)。現在のイベントが存在しない場合は、次の 7 日間分のイベントをプルして、週末と休日を確実にキャッチし、最初に予定されているイベントを返します。

上記の 2 番目の出力 (単一のイベントが true に設定されている) は、問題を解決しているように見えますが、繰り返し発生しないイベントが存在する場合にのみ問題を解決します。すべてを繰り返すと、setSingleevents(true) がある場合、データは返されません。

これは $now (現在の時刻) への最小開始時間と最大開始時間の設定に関連しているという予感がありますが、これは非反復でうまく機能するため、問題が何であるかわかりません (特に、しようとしているとき)定期的なイベントを独自の単一のイベントとして扱います。

繰り返しますが、定期的なイベントを使用しない限り、これはすべてうまくいくようです (毎週時間を手動で追加することは、私の意見ではあまり良い解決策ではありません)。

--
助けてくれてありがとう、
ベン

4

1 に答える 1

0

イベントにはイベント ステータスがあります。次のようにして、開発マシンでこれを解決できました。それが物事を行う最も美しい方法かどうかはわかりませんが、仕事は完了します。残念ながら、テスト マシンで問題が発生しており、そこで動作しない理由がわかりません。私は、php の 2 つのバージョンのクレイジーな違いが原因である可能性が高いと判断しました。

$eventStatusUrl = $event->getEventStatus();
list($trash, $eventStatus) = explode('#', $eventStatusUrl);
if ($eventStatus == 'event.confirmed') {
    return $event->title->text;
}
于 2010-05-20T12:53:23.363 に答える