Skip to content

Commit 89fd826

Browse files
committed
ClientObjectCollection.php enhancements, introduced getAll method
1 parent 49756ff commit 89fd826

File tree

4 files changed

+210
-17
lines changed

4 files changed

+210
-17
lines changed

examples/SharePoint/ListItems/ReadLargeList.php

+15-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,21 @@
1111
$ctx = (new ClientContext($siteUrl))->withCredentials($credentials);
1212

1313
$list = $ctx->getWeb()->getLists()->getByTitle("Contacts_Large");
14-
$items = $list->getItems()->get()->top(100)->executeQuery();
14+
15+
/*
16+
$items = $list->getItems()->get()->paged(500, function ($itemsCountLoaded){
17+
print("$itemsCountLoaded items loaded...\n");
18+
})->executeQuery();
1519
1620
foreach ($items as $index => $item){
1721
print($index . ":" . $item->getProperty('Title') . PHP_EOL);
18-
}
22+
}*/
23+
24+
//$totalItemsCount = $items->getCount();
25+
//print($totalItemsCount);
26+
27+
$allItems = $list->getItems()->getAll()->paged(5000, function ($itemsCount){
28+
print("$itemsCount items loaded...\n");
29+
})->executeQuery();
30+
31+

generator/Settings.SharePoint.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
"docsRoot": "https:\/\/docs.microsoft.com\/en-us\/openspecs\/sharepoint_protocols\/ms-csomspt\/",
77
"rootNamespace": "Office365\\SharePoint",
88
"entityRootNamespace": "SP",
9-
"version": "16.0.23207.12005",
10-
"timestamp": "2023-01-13T18:22:53+02:00",
9+
"version": "16.0.23207.12006",
10+
"timestamp": "2023-01-15T17:16:42+02:00",
1111
"placeholder": "Generated ",
1212
"typeMappings": {
1313
"SP.List": "SP.SPList",

generator/metadata/SharePoint.xml

+112
Original file line numberDiff line numberDiff line change
@@ -20282,6 +20282,7 @@
2028220282
<EntitySet Name="Orders_x005f_22681ListItems" EntityType="SP.Data.Orders_x005f_22681ListItem"/>
2028320283
<EntitySet Name="Orders_x005f_22684ListItems" EntityType="SP.Data.Orders_x005f_22684ListItem"/>
2028420284
<EntitySet Name="Orders_x005f_22724ListItems" EntityType="SP.Data.Orders_x005f_22724ListItem"/>
20285+
<EntitySet Name="Orders_x005f_27749ListItems" EntityType="SP.Data.Orders_x005f_27749ListItem"/>
2028520286
<EntitySet Name="Orders_x005f_27919ListItems" EntityType="SP.Data.Orders_x005f_27919ListItem"/>
2028620287
<EntitySet Name="Orders_x005f_29081ListItems" EntityType="SP.Data.Orders_x005f_29081ListItem"/>
2028720288
<EntitySet Name="Orders_x005f_29315ListItems" EntityType="SP.Data.Orders_x005f_29315ListItem"/>
@@ -53856,6 +53857,26 @@
5385653857
<End Role="TaskGroupPartner" EntitySet="Orders_x005f_22724ListItems"/>
5385753858
<End Role="TaskGroup" EntitySet="UserInfoItems"/>
5385853859
</AssociationSet>
53860+
<AssociationSet Name="SP_Data_Orders__x005f__27749ListItem_Author_SP_Data_UserInfoItem_AuthorPartnerSet" Association="SP.Data.SP_Data_Orders__x005f__27749ListItem_Author_SP_Data_UserInfoItem_AuthorPartner">
53861+
<End Role="AuthorPartner" EntitySet="Orders_x005f_27749ListItems"/>
53862+
<End Role="Author" EntitySet="UserInfoItems"/>
53863+
</AssociationSet>
53864+
<AssociationSet Name="SP_Data_Orders__x005f__27749ListItem_Editor_SP_Data_UserInfoItem_EditorPartnerSet" Association="SP.Data.SP_Data_Orders__x005f__27749ListItem_Editor_SP_Data_UserInfoItem_EditorPartner">
53865+
<End Role="EditorPartner" EntitySet="Orders_x005f_27749ListItems"/>
53866+
<End Role="Editor" EntitySet="UserInfoItems"/>
53867+
</AssociationSet>
53868+
<AssociationSet Name="SP_Data_Orders__x005f__27749ListItem_Predecessors_SP_Data_Orders__x005f__27749ListItem_PredecessorsPartnerSet" Association="SP.Data.SP_Data_Orders__x005f__27749ListItem_Predecessors_SP_Data_Orders__x005f__27749ListItem_PredecessorsPartner">
53869+
<End Role="PredecessorsPartner" EntitySet="Orders_x005f_27749ListItems"/>
53870+
<End Role="Predecessors" EntitySet="Orders_x005f_27749ListItems"/>
53871+
</AssociationSet>
53872+
<AssociationSet Name="SP_Data_Orders__x005f__27749ListItem_AssignedTo_SP_Data_UserInfoItem_AssignedToPartnerSet" Association="SP.Data.SP_Data_Orders__x005f__27749ListItem_AssignedTo_SP_Data_UserInfoItem_AssignedToPartner">
53873+
<End Role="AssignedToPartner" EntitySet="Orders_x005f_27749ListItems"/>
53874+
<End Role="AssignedTo" EntitySet="UserInfoItems"/>
53875+
</AssociationSet>
53876+
<AssociationSet Name="SP_Data_Orders__x005f__27749ListItem_TaskGroup_SP_Data_UserInfoItem_TaskGroupPartnerSet" Association="SP.Data.SP_Data_Orders__x005f__27749ListItem_TaskGroup_SP_Data_UserInfoItem_TaskGroupPartner">
53877+
<End Role="TaskGroupPartner" EntitySet="Orders_x005f_27749ListItems"/>
53878+
<End Role="TaskGroup" EntitySet="UserInfoItems"/>
53879+
</AssociationSet>
5385953880
<AssociationSet Name="SP_Data_Orders__x005f__27919ListItem_Author_SP_Data_UserInfoItem_AuthorPartnerSet" Association="SP.Data.SP_Data_Orders__x005f__27919ListItem_Author_SP_Data_UserInfoItem_AuthorPartner">
5386053881
<End Role="AuthorPartner" EntitySet="Orders_x005f_27919ListItems"/>
5386153882
<End Role="Author" EntitySet="UserInfoItems"/>
@@ -308278,6 +308299,77 @@
308278308299
<NavigationProperty Name="AssignedTo" Relationship="SP.Data.SP_Data_Orders__x005f__22724ListItem_AssignedTo_SP_Data_UserInfoItem_AssignedToPartner" ToRole="AssignedTo" FromRole="AssignedToPartner"/>
308279308300
<NavigationProperty Name="TaskGroup" Relationship="SP.Data.SP_Data_Orders__x005f__22724ListItem_TaskGroup_SP_Data_UserInfoItem_TaskGroupPartner" ToRole="TaskGroup" FromRole="TaskGroupPartner"/>
308280308301
</EntityType>
308302+
<EntityType Name="Orders_x005f_27749ListItem" BaseType="SP.ListItem">
308303+
<Property Name="ID" Type="Edm.Int32"/>
308304+
<Property Name="ContentTypeId" Type="Edm.String"/>
308305+
<Property Name="Title" Type="Edm.String"/>
308306+
<Property Name="Modified" Type="Edm.DateTime"/>
308307+
<Property Name="Created" Type="Edm.DateTime"/>
308308+
<Property Name="AuthorId" Type="Edm.Int32"/>
308309+
<Property Name="EditorId" Type="Edm.Int32"/>
308310+
<Property Name="OData__HasCopyDestinations" Type="Edm.Boolean"/>
308311+
<Property Name="OData__CopySource" Type="Edm.String"/>
308312+
<Property Name="owshiddenversion" Type="Edm.Int32"/>
308313+
<Property Name="WorkflowVersion" Type="Edm.Int32"/>
308314+
<Property Name="OData__UIVersion" Type="Edm.Int32"/>
308315+
<Property Name="OData__UIVersionString" Type="Edm.String"/>
308316+
<Property Name="Attachments" Type="Edm.Boolean"/>
308317+
<Property Name="OData__ModerationStatus" Type="Edm.Int32"/>
308318+
<Property Name="OData__ModerationComments" Type="Edm.String"/>
308319+
<Property Name="Edit" Type="Edm.String"/>
308320+
<Property Name="LinkTitleNoMenu" Type="Edm.String"/>
308321+
<Property Name="LinkTitle" Type="Edm.String"/>
308322+
<Property Name="LinkTitle2" Type="Edm.String"/>
308323+
<Property Name="SelectTitle" Type="Edm.String"/>
308324+
<Property Name="InstanceID" Type="Edm.Int32"/>
308325+
<Property Name="Order" Type="Edm.Double"/>
308326+
<Property Name="GUID" Type="Edm.Guid"/>
308327+
<Property Name="WorkflowInstanceID" Type="Edm.Guid"/>
308328+
<Property Name="FileRef" Type="Edm.String"/>
308329+
<Property Name="FileDirRef" Type="Edm.String"/>
308330+
<Property Name="Last_x0020_Modified" Type="Edm.DateTime"/>
308331+
<Property Name="Created_x0020_Date" Type="Edm.DateTime"/>
308332+
<Property Name="FSObjType" Type="Edm.Int32"/>
308333+
<Property Name="PermMask" Type="Edm.String"/>
308334+
<Property Name="PrincipalCount" Type="Edm.String"/>
308335+
<Property Name="FileLeafRef" Type="Edm.String"/>
308336+
<Property Name="UniqueId" Type="Edm.Guid"/>
308337+
<Property Name="File_x0020_Type" Type="Edm.String"/>
308338+
<Property Name="HTML_x0020_File_x0020_Type" Type="Edm.String"/>
308339+
<Property Name="OData__EditMenuTableStart" Type="Edm.String"/>
308340+
<Property Name="OData__EditMenuTableStart2" Type="Edm.String"/>
308341+
<Property Name="OData__EditMenuTableEnd" Type="Edm.String"/>
308342+
<Property Name="LinkFilenameNoMenu" Type="Edm.String"/>
308343+
<Property Name="LinkFilename" Type="Edm.String"/>
308344+
<Property Name="LinkFilename2" Type="Edm.String"/>
308345+
<Property Name="DocIcon" Type="Edm.String"/>
308346+
<Property Name="ServerUrl" Type="Edm.String"/>
308347+
<Property Name="EncodedAbsUrl" Type="Edm.String"/>
308348+
<Property Name="BaseName" Type="Edm.String"/>
308349+
<Property Name="OData__Level" Type="Edm.Int32"/>
308350+
<Property Name="OData__IsCurrentVersion" Type="Edm.Boolean"/>
308351+
<Property Name="OData__IsRecord" Type="Edm.String"/>
308352+
<Property Name="AppAuthorId" Type="Edm.Int32"/>
308353+
<Property Name="AppEditorId" Type="Edm.Int32"/>
308354+
<Property Name="ComplianceAssetId" Type="Edm.String"/>
308355+
<Property Name="PredecessorsId" Type="Collection(Edm.Int32)" Nullable="false"/>
308356+
<Property Name="Priority" Type="Edm.String"/>
308357+
<Property Name="Status" Type="Edm.String"/>
308358+
<Property Name="PercentComplete" Type="Edm.Double"/>
308359+
<Property Name="AssignedToId" Type="Edm.Int32"/>
308360+
<Property Name="AssignedToStringId" Type="Edm.String"/>
308361+
<Property Name="TaskGroupId" Type="Edm.Int32"/>
308362+
<Property Name="TaskGroupStringId" Type="Edm.String"/>
308363+
<Property Name="Body" Type="Edm.String"/>
308364+
<Property Name="StartDate" Type="Edm.DateTime"/>
308365+
<Property Name="DueDate" Type="Edm.DateTime"/>
308366+
<Property Name="RelatedItems" Type="Edm.String"/>
308367+
<NavigationProperty Name="Author" Relationship="SP.Data.SP_Data_Orders__x005f__27749ListItem_Author_SP_Data_UserInfoItem_AuthorPartner" ToRole="Author" FromRole="AuthorPartner"/>
308368+
<NavigationProperty Name="Editor" Relationship="SP.Data.SP_Data_Orders__x005f__27749ListItem_Editor_SP_Data_UserInfoItem_EditorPartner" ToRole="Editor" FromRole="EditorPartner"/>
308369+
<NavigationProperty Name="Predecessors" Relationship="SP.Data.SP_Data_Orders__x005f__27749ListItem_Predecessors_SP_Data_Orders__x005f__27749ListItem_PredecessorsPartner" ToRole="Predecessors" FromRole="PredecessorsPartner"/>
308370+
<NavigationProperty Name="AssignedTo" Relationship="SP.Data.SP_Data_Orders__x005f__27749ListItem_AssignedTo_SP_Data_UserInfoItem_AssignedToPartner" ToRole="AssignedTo" FromRole="AssignedToPartner"/>
308371+
<NavigationProperty Name="TaskGroup" Relationship="SP.Data.SP_Data_Orders__x005f__27749ListItem_TaskGroup_SP_Data_UserInfoItem_TaskGroupPartner" ToRole="TaskGroup" FromRole="TaskGroupPartner"/>
308372+
</EntityType>
308281308373
<EntityType Name="Orders_x005f_27919ListItem" BaseType="SP.ListItem">
308282308374
<Property Name="ID" Type="Edm.Int32"/>
308283308375
<Property Name="ContentTypeId" Type="Edm.String"/>
@@ -449931,6 +450023,26 @@
449931450023
<End Type="SP.Data.UserInfoItem" Role="TaskGroup" Multiplicity="0..1"/>
449932450024
<End Type="SP.Data.Orders_x005f_22724ListItem" Role="TaskGroupPartner" Multiplicity="0..1"/>
449933450025
</Association>
450026+
<Association Name="SP_Data_Orders__x005f__27749ListItem_Author_SP_Data_UserInfoItem_AuthorPartner">
450027+
<End Type="SP.Data.UserInfoItem" Role="Author" Multiplicity="0..1"/>
450028+
<End Type="SP.Data.Orders_x005f_27749ListItem" Role="AuthorPartner" Multiplicity="0..1"/>
450029+
</Association>
450030+
<Association Name="SP_Data_Orders__x005f__27749ListItem_Editor_SP_Data_UserInfoItem_EditorPartner">
450031+
<End Type="SP.Data.UserInfoItem" Role="Editor" Multiplicity="0..1"/>
450032+
<End Type="SP.Data.Orders_x005f_27749ListItem" Role="EditorPartner" Multiplicity="0..1"/>
450033+
</Association>
450034+
<Association Name="SP_Data_Orders__x005f__27749ListItem_Predecessors_SP_Data_Orders__x005f__27749ListItem_PredecessorsPartner">
450035+
<End Type="SP.Data.Orders_x005f_27749ListItem" Role="Predecessors" Multiplicity="*"/>
450036+
<End Type="SP.Data.Orders_x005f_27749ListItem" Role="PredecessorsPartner" Multiplicity="0..1"/>
450037+
</Association>
450038+
<Association Name="SP_Data_Orders__x005f__27749ListItem_AssignedTo_SP_Data_UserInfoItem_AssignedToPartner">
450039+
<End Type="SP.Data.UserInfoItem" Role="AssignedTo" Multiplicity="0..1"/>
450040+
<End Type="SP.Data.Orders_x005f_27749ListItem" Role="AssignedToPartner" Multiplicity="0..1"/>
450041+
</Association>
450042+
<Association Name="SP_Data_Orders__x005f__27749ListItem_TaskGroup_SP_Data_UserInfoItem_TaskGroupPartner">
450043+
<End Type="SP.Data.UserInfoItem" Role="TaskGroup" Multiplicity="0..1"/>
450044+
<End Type="SP.Data.Orders_x005f_27749ListItem" Role="TaskGroupPartner" Multiplicity="0..1"/>
450045+
</Association>
449934450046
<Association Name="SP_Data_Orders__x005f__27919ListItem_Author_SP_Data_UserInfoItem_AuthorPartner">
449935450047
<End Type="SP.Data.UserInfoItem" Role="Author" Multiplicity="0..1"/>
449936450048
<End Type="SP.Data.Orders_x005f_27919ListItem" Role="AuthorPartner" Multiplicity="0..1"/>

src/Runtime/ClientObjectCollection.php

+81-13
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use IteratorAggregate;
88
use Office365\Runtime\Http\RequestOptions;
99
use Office365\Runtime\OData\V3\JsonLightFormat;
10+
use Office365\Runtime\Types\EventHandler;
1011
use Traversable;
1112

1213

@@ -33,6 +34,17 @@ class ClientObjectCollection extends ClientObject implements IteratorAggregate,
3334
protected $itemTypeName;
3435

3536

37+
/**
38+
* @var bool
39+
*/
40+
protected $pagedMode;
41+
42+
/**
43+
* @var EventHandler
44+
*/
45+
protected $pageLoaded;
46+
47+
3648
/**
3749
* @param ClientRuntimeContext $ctx
3850
* @param ResourcePath $resourcePath
@@ -44,6 +56,8 @@ public function __construct(ClientRuntimeContext $ctx,ResourcePath $resourcePath
4456
$this->data = array();
4557
$this->NextRequestUrl = null;
4658
$this->itemTypeName = $itemTypeName;
59+
$this->pagedMode = false;
60+
$this->pageLoaded = new EventHandler();
4761
}
4862

4963

@@ -165,7 +179,10 @@ public function getCount()
165179

166180
public function clearData()
167181
{
168-
$this->data = array();
182+
if(!$this->pagedMode){
183+
$this->data = array();
184+
}
185+
$this->NextRequestUrl = null;
169186
}
170187

171188
/**
@@ -180,6 +197,22 @@ public function filter($value)
180197
}
181198

182199

200+
/**
201+
* Retrieves via server-driven paging mode
202+
* @param int $pageSize
203+
* @param callable $pageLoaded
204+
*/
205+
public function paged($pageSize=null, $pageLoaded=null){
206+
$this->pagedMode = true;
207+
if(isset($pageLoaded))
208+
$this->pageLoaded->addEvent($pageLoaded);
209+
if(isset($pageSize)){
210+
$this->top($pageSize);
211+
}
212+
return $this;
213+
}
214+
215+
183216
/**
184217
* Determines the maximum number of records to return.
185218
* @param string $value
@@ -292,26 +325,61 @@ public function getIterator(): Traversable
292325
yield $index => $item;
293326
}
294327

295-
if(is_null($this->queryOptions->Top) && !is_null($this->NextRequestUrl)){
296-
foreach ($this->getNextItems() as $item){
297-
$this->addChild($item);
298-
yield $item;
328+
if($this->pagedMode){
329+
$nextItems = $this->getNext()->executeQuery();
330+
if($this->hasNext()){
331+
foreach ($nextItems as $item){
332+
yield $item;
333+
}
299334
}
300335
}
301336
}
302337

338+
protected function hasNext(){
339+
return !is_null($this->NextRequestUrl);
340+
}
341+
342+
/**
343+
* @return self
344+
*/
345+
public function get()
346+
{
347+
$this->getContext()->getPendingRequest()->afterExecuteRequest(function (){
348+
$this->pageLoaded->triggerEvent(array(count($this->data)));
349+
});
350+
return parent::get();
351+
}
352+
353+
354+
/**
355+
* Gets all the items in a collection, regardless of the size.
356+
* @param int $pageSize
357+
* @param callable $pageLoaded
358+
* @return self
359+
*/
360+
public function getAll($pageSize=null, $pageLoaded=null)
361+
{
362+
$this->paged($pageSize,$pageLoaded);
363+
$this->getContext()->getPendingRequest()->afterExecuteRequest(function (){
364+
if($this->hasNext()) {
365+
$this->getNext();
366+
}
367+
}, false);
368+
return $this->get();
369+
}
370+
371+
372+
303373
/**
304374
* @return ClientObjectCollection
305375
* @throws Exception
306376
*/
307-
private function getNextItems(){
308-
$items = new ClientObjectCollection($this->context,$this->resourcePath);
309-
$request = new RequestOptions($this->NextRequestUrl);
310-
$response = $this->getContext()->executeQueryDirect($request);
311-
$payload = json_decode($response->getContent(), true);
312-
$this->getContext()->getPendingRequest()->mapJson($payload,$items,new JsonLightFormat());
313-
$this->NextRequestUrl = null;
314-
return $items;
377+
private function getNext(){
378+
$this->getContext()->getPendingRequest()->beforeExecuteRequest(function (RequestOptions $request){
379+
$request->Url = $this->NextRequestUrl;
380+
});
381+
$this->get();
382+
return $this;
315383
}
316384

317385
/**

0 commit comments

Comments
 (0)