‪TYPO3CMS  10.4
CategoryCollection.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 
25 
30 {
36  protected static ‪$storageTableName = 'sys_category';
37 
43  protected ‪$relationFieldName = 'categories';
44 
52  public function ‪__construct($tableName = null, $fieldName = null)
53  {
54  parent::__construct();
55  if (!empty($tableName)) {
56  $this->‪setItemTableName($tableName);
57  } elseif (empty($this->itemTableName)) {
58  throw new \RuntimeException(self::class . ' needs a valid itemTableName.', 1341826168);
59  }
60  if (!empty($fieldName)) {
61  $this->‪setRelationFieldName($fieldName);
62  }
63  }
64 
73  public static function ‪create(array $collectionRecord, $fillItems = false)
74  {
76  $collection = GeneralUtility::makeInstance(
77  self::class,
78  $collectionRecord['table_name'],
79  $collectionRecord['field_name']
80  );
81  $collection->fromArray($collectionRecord);
82  if ($fillItems) {
83  $collection->loadContents();
84  }
85  return $collection;
86  }
87 
100  public static function ‪load($id, $fillItems = false, $tableName = '', $fieldName = '')
101  {
102  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
103  ->getQueryBuilderForTable(static::$storageTableName);
104 
105  $queryBuilder->getRestrictions()
106  ->removeAll()
107  ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
108 
109  $collectionRecord = $queryBuilder->select('*')
110  ->from(static::$storageTableName)
111  ->where(
112  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($id, \PDO::PARAM_INT))
113  )
114  ->setMaxResults(1)
115  ->execute()
116  ->fetch();
117 
118  $collectionRecord['table_name'] = $tableName;
119  $collectionRecord['field_name'] = $fieldName;
120 
121  return ‪self::create($collectionRecord, $fillItems);
122  }
123 
131  protected function ‪getCollectedRecordsQueryBuilder()
132  {
133  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
134  ->getQueryBuilderForTable(static::$storageTableName);
135  $queryBuilder->‪getRestrictions()->‪removeAll();
136 
137  $queryBuilder->select($this->‪getItemTableName() . '.*')
138  ->from(static::$storageTableName)
139  ->join(
140  static::$storageTableName,
141  'sys_category_record_mm',
142  'sys_category_record_mm',
143  $queryBuilder->expr()->eq(
144  'sys_category_record_mm.uid_local',
145  $queryBuilder->quoteIdentifier(static::$storageTableName . '.uid')
146  )
147  )
148  ->join(
149  'sys_category_record_mm',
150  $this->‪getItemTableName(),
151  $this->‪getItemTableName(),
152  $queryBuilder->expr()->eq(
153  'sys_category_record_mm.uid_foreign',
154  $queryBuilder->quoteIdentifier($this->getItemTableName() . '.uid')
155  )
156  )
157  ->where(
158  $queryBuilder->expr()->eq(
159  static::$storageTableName . '.uid',
160  $queryBuilder->createNamedParameter($this->getIdentifier(), \PDO::PARAM_INT)
161  ),
162  $queryBuilder->expr()->eq(
163  'sys_category_record_mm.tablenames',
164  $queryBuilder->createNamedParameter($this->getItemTableName(), \PDO::PARAM_STR)
165  ),
166  $queryBuilder->expr()->eq(
167  'sys_category_record_mm.fieldname',
168  $queryBuilder->createNamedParameter($this->getRelationFieldName(), \PDO::PARAM_STR)
169  )
170  )
171  // @todo: MM TCA ref docs say 'sorting' is a required field for MM relations, but it seems code always
172  // hard codes to field name 'sorting' (RelationHandler) and never uses 'sorting' TCA definition.
173  // Furthermore through implementing auto creation of MM tables from TCA 'sorting' is auto created.
174  // Add required sorting field.
175  ->orderBy('sys_category_record_mm.sorting', 'ASC')
176  // Add foreign uid field to ensure determistic sorting across dbms and dbms versions
177  ->addOrderBy('sys_category_record_mm.uid_foreign', 'ASC')
178  ;
179 
180  return $queryBuilder;
181  }
182 
189  protected function ‪getCollectedRecords()
190  {
191  $relatedRecords = [];
192 
193  $queryBuilder = $this->‪getCollectedRecordsQueryBuilder();
194  $result = $queryBuilder->execute();
195 
196  while ($record = $result->fetch()) {
197  $relatedRecords[] = $record;
198  }
199 
200  return $relatedRecords;
201  }
202 
211  public function ‪loadContents()
212  {
213  $entries = $this->‪getCollectedRecords();
214  $this->‪removeAll();
215  foreach ($entries as $entry) {
216  $this->‪add($entry);
217  }
218  }
219 
227  protected function ‪getPersistableDataArray()
228  {
229  return [
230  'title' => $this->‪getTitle(),
231  'description' => $this->‪getDescription(),
232  'items' => $this->‪getItemUidList(true)
233  ];
234  }
235 
241  public function ‪add($data)
242  {
243  $this->storage->push($data);
244  }
245 
251  public function ‪addAll(‪CollectionInterface $other)
252  {
253  foreach ($other as $value) {
254  $this->‪add($value);
255  }
256  }
257 
264  public function remove($data)
265  {
266  $offset = 0;
267  foreach ($this->storage as $value) {
268  if ($value == $data) {
269  break;
270  }
271  $offset++;
272  }
273  $this->storage->offsetUnset($offset);
274  }
275 
280  public function ‪removeAll()
281  {
282  $this->storage = new \SplDoublyLinkedList();
283  }
284 
290  public function ‪getItems()
291  {
292  $itemArray = [];
294  foreach ($this->storage as $item) {
295  $itemArray[] = $item;
296  }
297  return $itemArray;
298  }
299 
305  public function ‪setRelationFieldName($field)
306  {
307  $this->relationFieldName = $field;
308  }
309 
315  public function ‪getRelationFieldName()
316  {
318  }
319 
325  public static function ‪getStorageTableName()
326  {
328  }
329 
335  public static function ‪getStorageItemsField()
336  {
338  }
339 }
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\setRelationFieldName
‪setRelationFieldName($field)
Definition: CategoryCollection.php:303
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\__construct
‪__construct()
Definition: AbstractRecordCollection.php:82
‪TYPO3\CMS\Core\Category\Collection
Definition: CategoryCollection.php:16
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\add
‪add($data)
Definition: CategoryCollection.php:239
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getTitle
‪string getTitle()
Definition: AbstractRecordCollection.php:192
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\__construct
‪__construct($tableName=null, $fieldName=null)
Definition: CategoryCollection.php:50
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\removeAll
‪removeAll()
Definition: CategoryCollection.php:278
‪TYPO3\CMS\Core\Collection\EditableCollectionInterface
Definition: EditableCollectionInterface.php:22
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getCollectedRecords
‪array getCollectedRecords()
Definition: CategoryCollection.php:187
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection
Definition: CategoryCollection.php:30
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection
Definition: AbstractRecordCollection.php:36
‪TYPO3\CMS\Core\Database\Query\Restriction\QueryRestrictionContainerInterface\removeAll
‪QueryRestrictionContainerInterface removeAll()
‪TYPO3\CMS\Core\Collection\CollectionInterface
Definition: CollectionInterface.php:27
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\load
‪static CollectionInterface load($id, $fillItems=false, $tableName='', $fieldName='')
Definition: CategoryCollection.php:98
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getItems
‪array getItems()
Definition: CategoryCollection.php:288
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getRelationFieldName
‪string getRelationFieldName()
Definition: CategoryCollection.php:313
‪TYPO3\CMS\Core\Database\Query\QueryBuilder\getRestrictions
‪QueryRestrictionContainerInterface getRestrictions()
Definition: QueryBuilder.php:104
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getPersistableDataArray
‪array getPersistableDataArray()
Definition: CategoryCollection.php:225
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getStorageTableName
‪static string getStorageTableName()
Definition: CategoryCollection.php:323
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getItemUidList
‪string getItemUidList($includeTableName=true)
Definition: AbstractRecordCollection.php:390
‪TYPO3\CMS\Core\Database\Query\QueryBuilder
Definition: QueryBuilder.php:52
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\$storageItemsField
‪static string $storageItemsField
Definition: AbstractRecordCollection.php:47
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getItemTableName
‪string getItemTableName()
Definition: AbstractRecordCollection.php:242
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\addAll
‪addAll(CollectionInterface $other)
Definition: CategoryCollection.php:249
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getStorageItemsField
‪static string getStorageItemsField()
Definition: CategoryCollection.php:333
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\create
‪static CategoryCollection create(array $collectionRecord, $fillItems=false)
Definition: CategoryCollection.php:71
‪TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction
Definition: DeletedRestriction.php:28
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:46
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\$relationFieldName
‪string $relationFieldName
Definition: CategoryCollection.php:41
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\setItemTableName
‪setItemTableName($tableName)
Definition: AbstractRecordCollection.php:252
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\loadContents
‪loadContents()
Definition: CategoryCollection.php:209
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getDescription
‪string getDescription()
Definition: AbstractRecordCollection.php:212
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getCollectedRecordsQueryBuilder
‪QueryBuilder getCollectedRecordsQueryBuilder()
Definition: CategoryCollection.php:129
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\$storageTableName
‪static string $storageTableName
Definition: CategoryCollection.php:35