具有GroupBy的EWS FindItem结果中的意外元素

时间:2014-10-22 14:20:06

标签: xml schema exchange-server exchangewebservices php-ews

我使用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>元素的空对象。

现在我想知道问题出在哪里:

  1. 操作指南是否过时?我没有在EWS的其他文档中找到对此<Groups>元素的任何引用,因此我认为这不是问题所在。
  2. 我的Exchange服务器是使用其他XML架构还是仅仅是奇怪的?
  3. php-ews架构是否已过时?我应该掏出deakin&#39;回购最终的解决方案?
  4. 我已经找到了一种方法,通过调整php-ews模式使其工作,但如果问题是我的测试服务器,我不需要费心去做一个分叉......我会发布帖子我目前的解决方案也在下面。

    我很感激对此的任何意见......

1 个答案:

答案 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并在此发布...

干杯