1

PHP Webアプリケーションの一部として、MySQLの連絡先テーブルがあります。アプリ全体に統合されているため、連絡先を追加したり、連絡先を編集したり、別のテーブルへのリレーションとして連絡先を追加したりできます。ただし、現在は自己完結型です。会社はExchangeと同期して、Exchangeに追加された連絡先がWebアプリに表示され、Webアプリに追加された連絡先がExchangeを介して表示されるようにしたいと考えています。

したがって、2つの問題があります。1)Exchangeとの通信2)Exchangeとの同期。

基本的なコミュニケーションに関する限り、このライブラリはそれを管理できるように見えますhttps://github.com/jamesiarmes/php-ews。しかし、同期を管理する方法についてはかなり迷っており、どこから始めればよいのかわかりません。

4

2 に答える 2

3

アイテムを同期する組み込みの方法は、と呼ばれる関数を使用することSyncFolderItemsです。基本的に、連絡先を含むすべてを交換するのはフォルダなので、同期要求の場合と同じように渡しますCONTACTSDistinguishedFolderId

同期は、特定のアカウントのすべてのアイテムを最大512要素のバッチでドンロードすることによって機能し、各バッチの後にSyncState、Exchangeが中断した場所を知るための参照ポイントとして機能します。したがって、インクリメンタル同期を実行する機能が提供されます。

もちろん、これは1つの方法であり、Exchange->YourDBを意味します。もう1つの方法は、アトミック更新/リクエストを実行する必要があることです。データベースからアイテムを変更/追加/削除した瞬間に、データの同期を維持するためにExchangeサーバーに適切なリクエストを発行する必要があります。そうしないと、次のデータが上書きされますSyncFolderItems

@MSDNで詳細を読むことができますSyncFolderItems

EWSWrapperの@pythonバージョンをSyncFolderItems見てみることができる例を見たい場合は、最近追加されました。Pythonですが、リクエスト/ハンドルレスポンスを作成する方法の基本的なアイデアを得ることができます。

お役に立てれば :)

于 2012-04-27T06:55:57.607 に答える
2

このトピックはかなり古いことを私は知っています。ただし、将来の参考のために、以下の解決策を見つけてください。上記のライブラリphp-ewsを使用しています。

また、これを公式のphp-ews wikiに追加しました:https ://github.com/jamesiarmes/php-ews/wiki/Calendar:-同期

// Define EWS
$ews = new ExchangeWebServices($host, $username, $password, $version);

// fill with string from last sync
$sync_state = null;

$request = new EWSType_SyncFolderItemsType;
$request->SyncState = $sync_state;
$request->MaxChangesReturned = 512;
$request->ItemShape = new EWSType_ItemResponseShapeType;
$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES;

$request->SyncFolderId = new EWSType_NonEmptyArrayOfBaseFolderIdsType;
$request->SyncFolderId->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType;
$request->SyncFolderId->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::CALENDAR;

$response = $ews->SyncFolderItems($request);

$sync_state = $response->ResponseMessages->SyncFolderItemsResponseMessage->SyncState;
$changes = $response->ResponseMessages->SyncFolderItemsResponseMessage->Changes;

// created events
if(property_exists($changes, 'Create')) {
    foreach($changes->Create as $event) {
        $id = $event->CalendarItem->ItemId->Id;
        $change_key = $event->CalendarItem->ItemId->ChangeKey;
        $start = $event->CalendarItem->Start;
        $end = $event->CalendarItem->End;
        $subject = $event->CalendarItem->Subject;
    }
}

// updated events
if(property_exists($changes, 'Update')) {
    foreach($changes->Update as $event) {
        $id = $event->CalendarItem->ItemId->Id;
        $change_key = $event->CalendarItem->ItemId->ChangeKey;
        $start = $event->CalendarItem->Start;
        $end = $event->CalendarItem->End;
        $subject = $event->CalendarItem->Subject;
    }
}

// deleted events
if(property_exists($changes, 'Delete')) {
    foreach($changes->Delete as $event) {
        $id = $event->CalendarItem->ItemId->Id;
        $change_key = $event->CalendarItem->ItemId->ChangeKey;
        $start = $event->CalendarItem->Start;
        $end = $event->CalendarItem->End;
        $subject = $event->CalendarItem->Subject;
    }
}
于 2014-11-04T13:21:29.713 に答える