‪TYPO3CMS  11.5
AbstractRecordCollection.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of the TYPO3 CMS project.
5  *
6  * It is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License, either version 2
8  * of the License, or any later version.
9  *
10  * For the full copyright and license information, please read the
11  * LICENSE.txt file that was distributed with this source code.
12  *
13  * The TYPO3 project - inspiring people to share!
14  */
15 
17 
23 
40 {
46  protected static ‪$storageItemsField = 'items';
47 
53  protected static ‪$storageTableName = '';
54 
60  protected ‪$uid = 0;
61 
67  protected ‪$title;
68 
74  protected ‪$description;
75 
81  protected ‪$itemTableName;
82 
88  protected ‪$storage;
89 
93  public function ‪__construct()
94  {
95  $this->storage = new \SplDoublyLinkedList();
96  }
97 
106  #[\ReturnTypeWillChange]
107  public function ‪current()
108  {
109  return $this->storage->current();
110  }
111 
119  #[\ReturnTypeWillChange]
120  public function ‪next()
121  {
122  $this->storage->next();
123  }
124 
133  #[\ReturnTypeWillChange]
134  public function ‪key()
135  {
136  $currentRecord = $this->storage->current();
137  return $currentRecord['uid'] ?? 0;
138  }
139 
148  #[\ReturnTypeWillChange]
149  public function ‪valid()
150  {
151  return $this->storage->valid();
152  }
153 
161  #[\ReturnTypeWillChange]
162  public function ‪rewind()
163  {
164  $this->storage->rewind();
165  }
166 
175  public function ‪serialize()
176  {
177  return ‪serialize($this->‪__serialize());
178  }
179 
183  public function ‪__serialize(): array
184  {
185  return [
186  'uid' => $this->‪getIdentifier(),
187  ];
188  }
189 
199  public function ‪unserialize($serialized)
200  {
201  $this->‪__unserialize(‪unserialize($serialized));
202  }
203 
207  public function ‪__unserialize(array $arrayRepresentation): void
208  {
209  ‪self::load($arrayRepresentation['uid']);
210  }
211 
220  #[\ReturnTypeWillChange]
221  public function ‪count()
222  {
223  return $this->storage->count();
224  }
225 
231  public function ‪getTitle()
232  {
233  return ‪$this->title;
234  }
235 
241  public function ‪getUid()
242  {
243  return ‪$this->uid;
244  }
245 
251  public function ‪getDescription()
252  {
253  return ‪$this->description;
254  }
255 
261  public function ‪setTitle(‪$title)
262  {
263  $this->title = ‪$title;
264  }
265 
271  public function ‪setDescription($desc)
272  {
273  $this->description = $desc;
274  }
275 
281  public function ‪getItemTableName()
282  {
284  }
285 
291  public function ‪setItemTableName($tableName)
292  {
293  $this->itemTableName = $tableName;
294  }
295 
305  public function ‪usort($callbackFunction)
306  {
307  // @todo Implement usort() method with TCEforms in mind
308  throw new \RuntimeException('This method is not yet supported.', 1322545589);
309  }
310 
320  public function ‪moveItemAt($currentPosition, $newPosition = 0)
321  {
322  // @todo Implement usort() method with TCEforms in mind
323  throw new \RuntimeException('This method is not yet supported.', 1322545626);
324  }
325 
331  public function ‪getIdentifier()
332  {
333  return ‪$this->uid;
334  }
335 
341  public function ‪setIdentifier($id)
342  {
343  $this->uid = (int)$id;
344  }
345 
357  public static function ‪load($id, $fillItems = false)
358  {
359  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(static::getCollectionDatabaseTable());
360  $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
361  $collectionRecord = $queryBuilder->select('*')
362  ->from(static::getCollectionDatabaseTable())
363  ->where($queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($id, ‪Connection::PARAM_INT)))
364  ->executeQuery()
365  ->fetchAssociative();
366  return ‪self::create($collectionRecord ?: [], $fillItems);
367  }
368 
377  public static function ‪create(array $collectionRecord, $fillItems = false)
378  {
379  // [phpstan] Unsafe usage of new static()
380  // todo: Either mark this class or its constructor final or use new self instead.
381  $collection = new static();
382  $collection->fromArray($collectionRecord);
383  if ($fillItems) {
384  $collection->loadContents();
385  }
386  return $collection;
387  }
388 
392  public function ‪persist()
393  {
394  ‪$uid = $this->‪getIdentifier() == 0 ? 'NEW' . random_int(100000, 999999) : $this->‪getIdentifier();
395  $data = [
396  trim(static::getCollectionDatabaseTable()) => [
398  ],
399  ];
400  // New records always must have a pid
401  if ($this->‪getIdentifier() == 0) {
402  $data[trim(static::getCollectionDatabaseTable())][‪$uid]['pid'] = 0;
403  }
404  $tce = GeneralUtility::makeInstance(DataHandler::class);
405  $tce->start($data, []);
406  $tce->process_datamap();
407  }
408 
417  abstract protected function ‪getPersistableDataArray();
418 
428  protected function ‪getItemUidList($includeTableName = true)
429  {
430  $list = [];
431  foreach ($this->storage as $entry) {
432  $list[] = ($includeTableName ? $this->‪getItemTableName() . '_' : '') . $entry['uid'];
433  }
434  return implode(',', $list);
435  }
436 
442  public function ‪toArray()
443  {
444  $itemArray = [];
445  foreach ($this->storage as $item) {
446  $itemArray[] = $item;
447  }
448  return [
449  'uid' => $this->‪getIdentifier(),
450  'title' => $this->‪getTitle(),
451  'description' => $this->‪getDescription(),
452  'table_name' => $this->‪getItemTableName(),
453  'items' => $itemArray,
454  ];
455  }
456 
462  public function ‪fromArray(array $array)
463  {
464  $this->uid = $array['uid'];
465  $this->title = $array['title'];
466  $this->description = $array['description'];
467  $this->itemTableName = $array['table_name'];
468  }
469 
470  protected static function ‪getCollectionDatabaseTable(): string
471  {
472  if (!empty(static::$storageTableName)) {
473  return static::$storageTableName;
474  }
475  throw new \RuntimeException('No storage table name was defined the class "' . static::class . '".', 1592207959);
476  }
477 }
‪TYPO3\CMS\Core\DataHandling\DataHandler
Definition: DataHandler.php:86
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\$title
‪string $title
Definition: AbstractRecordCollection.php:63
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\__unserialize
‪__unserialize(array $arrayRepresentation)
Definition: AbstractRecordCollection.php:200
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getCollectionDatabaseTable
‪static getCollectionDatabaseTable()
Definition: AbstractRecordCollection.php:463
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:49
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\__construct
‪__construct()
Definition: AbstractRecordCollection.php:86
‪TYPO3\CMS\Core\Collection\RecordCollectionInterface
Definition: RecordCollectionInterface.php:25
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\moveItemAt
‪moveItemAt($currentPosition, $newPosition=0)
Definition: AbstractRecordCollection.php:313
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\$storage
‪SplDoublyLinkedList $storage
Definition: AbstractRecordCollection.php:81
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\rewind
‪rewind()
Definition: AbstractRecordCollection.php:155
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getTitle
‪string getTitle()
Definition: AbstractRecordCollection.php:224
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection
Definition: AbstractRecordCollection.php:40
‪TYPO3\CMS\Core\Collection\CollectionInterface
Definition: CollectionInterface.php:29
‪TYPO3\CMS\Core\Collection
Definition: AbstractRecordCollection.php:16
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getItemUidList
‪string getItemUidList($includeTableName=true)
Definition: AbstractRecordCollection.php:421
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\usort
‪usort($callbackFunction)
Definition: AbstractRecordCollection.php:298
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\setTitle
‪setTitle($title)
Definition: AbstractRecordCollection.php:254
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\persist
‪persist()
Definition: AbstractRecordCollection.php:385
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\$storageItemsField
‪static string $storageItemsField
Definition: AbstractRecordCollection.php:45
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\setIdentifier
‪setIdentifier($id)
Definition: AbstractRecordCollection.php:334
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getItemTableName
‪string getItemTableName()
Definition: AbstractRecordCollection.php:274
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\fromArray
‪fromArray(array $array)
Definition: AbstractRecordCollection.php:455
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\toArray
‪array toArray()
Definition: AbstractRecordCollection.php:435
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\$uid
‪int $uid
Definition: AbstractRecordCollection.php:57
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\current
‪mixed current()
Definition: AbstractRecordCollection.php:100
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\valid
‪bool valid()
Definition: AbstractRecordCollection.php:142
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\count
‪int count()
Definition: AbstractRecordCollection.php:214
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getUid
‪int getUid()
Definition: AbstractRecordCollection.php:234
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getPersistableDataArray
‪array getPersistableDataArray()
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\next
‪next()
Definition: AbstractRecordCollection.php:113
‪TYPO3\CMS\Core\Collection\SortableCollectionInterface
Definition: SortableCollectionInterface.php:28
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\$description
‪string $description
Definition: AbstractRecordCollection.php:69
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\create
‪static CollectionInterface create(array $collectionRecord, $fillItems=false)
Definition: AbstractRecordCollection.php:370
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:38
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\__serialize
‪__serialize()
Definition: AbstractRecordCollection.php:176
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getIdentifier
‪int getIdentifier()
Definition: AbstractRecordCollection.php:324
‪TYPO3\CMS\Core\Collection\PersistableCollectionInterface
Definition: PersistableCollectionInterface.php:27
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\load
‪static CollectionInterface load($id, $fillItems=false)
Definition: AbstractRecordCollection.php:350
‪TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction
Definition: DeletedRestriction.php:28
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\unserialize
‪mixed unserialize($serialized)
Definition: AbstractRecordCollection.php:192
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\key
‪int string key()
Definition: AbstractRecordCollection.php:127
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\setItemTableName
‪setItemTableName($tableName)
Definition: AbstractRecordCollection.php:284
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getDescription
‪string getDescription()
Definition: AbstractRecordCollection.php:244
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\setDescription
‪setDescription($desc)
Definition: AbstractRecordCollection.php:264
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\serialize
‪string serialize()
Definition: AbstractRecordCollection.php:168
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\$storageTableName
‪static string $storageTableName
Definition: AbstractRecordCollection.php:51
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\$itemTableName
‪string $itemTableName
Definition: AbstractRecordCollection.php:75