‪TYPO3CMS  ‪main
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 
23 use TYPO3\CMS\Core\Database\Query\QueryBuilder;
27 
32 {
38  protected static ‪$storageTableName = 'sys_category';
39 
45  protected ‪$relationFieldName = 'categories';
46 
54  public function ‪__construct($tableName = null, $fieldName = null)
55  {
56  parent::__construct();
57  if (!empty($tableName)) {
58  $this->‪setItemTableName($tableName);
59  } elseif (empty($this->itemTableName)) {
60  throw new \RuntimeException(self::class . ' needs a valid itemTableName.', 1341826168);
61  }
62  if (!empty($fieldName)) {
63  $this->‪setRelationFieldName($fieldName);
64  }
65  }
66 
75  public static function ‪create(array $collectionRecord, $fillItems = false)
76  {
77  $collection = GeneralUtility::makeInstance(
78  self::class,
79  $collectionRecord['table_name'],
80  $collectionRecord['field_name']
81  );
82  $collection->fromArray($collectionRecord);
83  if ($fillItems) {
84  $collection->loadContents();
85  }
86  return $collection;
87  }
88 
101  public static function ‪load($id, $fillItems = false, $tableName = '', $fieldName = '')
102  {
103  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
104  ->getQueryBuilderForTable(static::$storageTableName);
105 
106  $queryBuilder->getRestrictions()
107  ->‪removeAll()
108  ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
109 
110  $collectionRecord = $queryBuilder->select('*')
111  ->from(static::$storageTableName)
112  ->where(
113  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($id, ‪Connection::PARAM_INT))
114  )
115  ->setMaxResults(1)
116  ->executeQuery()
117  ->fetchAssociative();
118 
119  $collectionRecord['table_name'] = $tableName;
120  $collectionRecord['field_name'] = $fieldName;
121 
122  return ‪self::create($collectionRecord, $fillItems);
123  }
124 
132  protected function ‪getCollectedRecordsQueryBuilder()
133  {
134  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
135  ->getQueryBuilderForTable(static::$storageTableName);
136  $queryBuilder->getRestrictions()->removeAll();
137 
138  $queryBuilder->select($this->‪getItemTableName() . '.*')
139  ->from(static::$storageTableName)
140  ->join(
141  static::$storageTableName,
142  'sys_category_record_mm',
143  'sys_category_record_mm',
144  $queryBuilder->expr()->eq(
145  'sys_category_record_mm.uid_local',
146  $queryBuilder->quoteIdentifier(static::$storageTableName . '.uid')
147  )
148  )
149  ->join(
150  'sys_category_record_mm',
151  $this->‪getItemTableName(),
152  $this->‪getItemTableName(),
153  $queryBuilder->expr()->eq(
154  'sys_category_record_mm.uid_foreign',
155  $queryBuilder->quoteIdentifier($this->getItemTableName() . '.uid')
156  )
157  )
158  ->where(
159  $queryBuilder->expr()->eq(
160  static::$storageTableName . '.uid',
161  $queryBuilder->createNamedParameter($this->getIdentifier(), ‪Connection::PARAM_INT)
162  ),
163  $queryBuilder->expr()->eq(
164  'sys_category_record_mm.tablenames',
165  $queryBuilder->createNamedParameter($this->getItemTableName())
166  ),
167  $queryBuilder->expr()->eq(
168  'sys_category_record_mm.fieldname',
169  $queryBuilder->createNamedParameter($this->getRelationFieldName())
170  )
171  )
172  // Add required sorting field.
173  ->orderBy('sys_category_record_mm.sorting', 'ASC')
174  // Add foreign uid field to ensure determistic sorting across dbms and dbms versions
175  ->addOrderBy('sys_category_record_mm.uid_foreign', 'ASC')
176  ;
177 
178  return $queryBuilder;
179  }
180 
187  protected function ‪getCollectedRecords()
188  {
189  $relatedRecords = [];
190 
191  $queryBuilder = $this->‪getCollectedRecordsQueryBuilder();
192  $result = $queryBuilder->executeQuery();
193 
194  while (‪$record = $result->fetchAssociative()) {
195  $relatedRecords[] = ‪$record;
196  }
197 
198  return $relatedRecords;
199  }
200 
209  public function ‪loadContents()
210  {
211  $entries = $this->‪getCollectedRecords();
212  $this->‪removeAll();
213  foreach ($entries as $entry) {
214  $this->‪add($entry);
215  }
216  }
217 
225  protected function ‪getPersistableDataArray()
226  {
227  return [
228  'title' => $this->‪getTitle(),
229  'description' => $this->‪getDescription(),
230  'items' => $this->‪getItemUidList(true),
231  ];
232  }
233 
239  public function ‪add($data)
240  {
241  $this->storage->push($data);
242  }
243 
247  public function ‪addAll(‪CollectionInterface $other)
248  {
249  foreach ($other as $value) {
250  $this->‪add($value);
251  }
252  }
253 
260  public function remove($data)
261  {
262  $offset = 0;
263  foreach ($this->storage as $value) {
264  if ($value == $data) {
265  break;
266  }
267  $offset++;
268  }
269  $this->storage->offsetUnset($offset);
270  }
271 
276  public function ‪removeAll()
277  {
278  $this->storage = new \SplDoublyLinkedList();
279  }
280 
286  public function ‪getItems()
287  {
288  $itemArray = [];
290  foreach ($this->storage as $item) {
291  $itemArray[] = $item;
292  }
293  return $itemArray;
294  }
295 
301  public function ‪setRelationFieldName($field)
302  {
303  $this->relationFieldName = $field;
304  }
305 
311  public function ‪getRelationFieldName()
312  {
314  }
315 
321  public static function ‪getStorageTableName()
322  {
324  }
325 
331  public static function ‪getStorageItemsField()
332  {
334  }
335 }
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\setRelationFieldName
‪setRelationFieldName($field)
Definition: CategoryCollection.php:299
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:52
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\__construct
‪__construct()
Definition: AbstractRecordCollection.php:86
‪TYPO3\CMS\Core\Category\Collection
Definition: CategoryCollection.php:16
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\add
‪add($data)
Definition: CategoryCollection.php:237
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getTitle
‪string getTitle()
Definition: AbstractRecordCollection.php:171
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\__construct
‪__construct($tableName=null, $fieldName=null)
Definition: CategoryCollection.php:52
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\removeAll
‪removeAll()
Definition: CategoryCollection.php:274
‪TYPO3\CMS\Core\Collection\EditableCollectionInterface
Definition: EditableCollectionInterface.php:22
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getCollectedRecords
‪array getCollectedRecords()
Definition: CategoryCollection.php:185
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection
Definition: CategoryCollection.php:32
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection
Definition: AbstractRecordCollection.php:40
‪TYPO3\CMS\Core\Collection\CollectionInterface
Definition: CollectionInterface.php:28
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getItems
‪array getItems()
Definition: CategoryCollection.php:284
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\load
‪static CategoryCollection load($id, $fillItems=false, $tableName='', $fieldName='')
Definition: CategoryCollection.php:99
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getRelationFieldName
‪string getRelationFieldName()
Definition: CategoryCollection.php:309
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getPersistableDataArray
‪array getPersistableDataArray()
Definition: CategoryCollection.php:223
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getStorageTableName
‪static string getStorageTableName()
Definition: CategoryCollection.php:319
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getItemUidList
‪string getItemUidList($includeTableName=true)
Definition: AbstractRecordCollection.php:368
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\$storageItemsField
‪static string $storageItemsField
Definition: AbstractRecordCollection.php:45
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getItemTableName
‪string getItemTableName()
Definition: AbstractRecordCollection.php:221
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\addAll
‪addAll(CollectionInterface $other)
Definition: CategoryCollection.php:245
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:26
‪TYPO3\CMS\Webhooks\Message\$record
‪identifier readonly int readonly array $record
Definition: PageModificationMessage.php:36
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getStorageItemsField
‪static string getStorageItemsField()
Definition: CategoryCollection.php:329
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\create
‪static CategoryCollection create(array $collectionRecord, $fillItems=false)
Definition: CategoryCollection.php:73
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪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:52
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\$relationFieldName
‪string $relationFieldName
Definition: CategoryCollection.php:43
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\setItemTableName
‪setItemTableName($tableName)
Definition: AbstractRecordCollection.php:231
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\loadContents
‪loadContents()
Definition: CategoryCollection.php:207
‪TYPO3\CMS\Core\Collection\AbstractRecordCollection\getDescription
‪string getDescription()
Definition: AbstractRecordCollection.php:191
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\getCollectedRecordsQueryBuilder
‪QueryBuilder getCollectedRecordsQueryBuilder()
Definition: CategoryCollection.php:130
‪TYPO3\CMS\Core\Category\Collection\CategoryCollection\$storageTableName
‪static string $storageTableName
Definition: CategoryCollection.php:37