我使用EWS(Exchange Web服务)从Exchange 2013测试服务器访问数据。我使用PHP和(有点过时的)php-ews存储库执行此操作:github-jamesiarmes-php-ews以及更新且支持作曲家的版本:github-deakin-php-ews
我可以按照来自&jamesiarmes'的wiki中的说明对我的Exchange服务进行基本调用,但在我尝试使用GroupBy方法时遇到了一些麻烦:How to: Perform grouped searches by using EWS in Exchange
正如您在操作指南的XML响应中所看到的,通常<Groups>
元素应包含零个或多个<GroupItems>
,然后包含这些项(在我的案例中为CalendarItems)。但是我从测试服务器返回的是<Group>
个元素而不是<GroupItems>
,导致我的$ response对象不完整。
我使用的代码:
$request = new FindItemType();
$request->Traversal = ItemQueryTraversalType::SHALLOW;
$request->ItemShape = new ItemResponseShapeType();
$request->ItemShape->BaseShape = DefaultShapeNamesType::ALL_PROPERTIES;
// Define the time frame to load calendar items
$request->CalendarView = new CalendarViewType();
$request->CalendarView->StartDate = '2014-01-12T15:18:34+03:00';
$request->CalendarView->EndDate = '2015-01-12T15:18:34+03:00';
// Find events from a certain folders
$request->ParentFolderIds = new NonEmptyArrayOfBaseFolderIdsType();
$request->ParentFolderIds->FolderId = new FolderIdType();
$request->ParentFolderIds->FolderId->Id = $calendarFolderUID;
// Group the events by date
$request->GroupBy = new GroupByType();
$request->GroupBy->Order = 'Ascending';
$request->GroupBy->FieldURI = new FieldURIOrConstantType();
$request->GroupBy->FieldURI->FieldURI = 'calendar:Start';
$request->GroupBy->AggregateOn = new AggregateOnType();
$request->GroupBy->AggregateOn->Aggregate = 'Minimum';
$request->GroupBy->AggregateOn->FieldURI = new FieldURIOrConstantType();
$request->GroupBy->AggregateOn->FieldURI->FieldURI = 'calendar:End';
$response = $this->soapService->FindItem($request);
这是来自var_dump()
的{{1}}:
$response
我设法使用object(stdClass)#685 (1) {
["ResponseMessages"]=>
object(stdClass)#690 (1) {
["FindItemResponseMessage"]=>
object(stdClass)#714 (3) {
["ResponseCode"]=>
string(7) "NoError"
["ResponseClass"]=>
string(7) "Success"
["RootFolder"]=>
object(stdClass)#715 (3) {
["Groups"]=>
object(stdClass)#716 (0) {
}
["IncludesLastItemInRange"]=>
bool(true)
["TotalItemsInView"]=>
int(4)
}
}
}
}
(PHP docs)收集了XML响应,发现它确实获得了所有需要的项目,但是在__getLastResponse()
元素中而不是<Group>
它使SoapClient返回<GroupItems>
元素的空对象。
现在我想知道问题出在哪里:
<Groups>
元素的任何引用,因此我认为这不是问题所在。我已经找到了一种方法,通过调整php-ews模式使其工作,但如果问题是我的测试服务器,我不需要费心去做一个分叉......我会发布帖子我目前的解决方案也在下面。
我很感激对此的任何意见......
答案 0 :(得分:0)
正如我所提到的,我提出了一个解决方案,但我不知道是否值得分析php-ews回购。
我在StackOverflow(SOAP Client receiving empty stdclass)上发现了类似的问题,但只是禁用SOAP缓存显然无法解决问题。但是我确实注意到我的解决方案需要禁用缓存。
我最终做的是从php-ews更改types.xsd架构:
<xs:complexType name="ArrayOfGroupedItemsType">
<xs:choice>
<xs:element name="Group" type="t:GroupedItemsType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="GroupedItems" type="t:GroupedItemsType" minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
奇怪的是我没有必要更改任何EWSTypes类,我预计我必须将$GroupedItems
的{{1}}属性更改为ArrayOfGroupedItemsType
,但这似乎并不真实案件。
如果我没有得到更好的解决方案,我会分发php-ews repo并在此发布...
干杯