TYPO3 CMS  TYPO3_7-6
ExtensionRepository.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
21 {
25  const TABLE_NAME = 'tx_extensionmanager_domain_model_extension';
26 
31 
35  protected $dataMapper;
36 
40  public function injectDataMapper(\TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper $dataMapper)
41  {
42  $this->dataMapper = $dataMapper;
43  }
44 
50  public function initializeObject()
51  {
53  $defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface::class);
54  $defaultQuerySettings->setRespectStoragePage(false);
56  $this->databaseConnection = $GLOBALS['TYPO3_DB'];
57  }
58 
64  public function countAll()
65  {
66  $query = $this->createQuery();
67  $query = $this->addDefaultConstraints($query);
68  return $query->execute()->count();
69  }
70 
76  public function findAll()
77  {
78  $query = $this->createQuery();
79  $query = $this->addDefaultConstraints($query);
80  $query->setOrderings(
81  [
82  'lastUpdated' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
83  ]
84  );
85  return $query->execute();
86  }
87 
94  public function findByExtensionKeyOrderedByVersion($extensionKey)
95  {
96  $query = $this->createQuery();
97  $query->matching($query->logicalAnd($query->equals('extensionKey', $extensionKey), $query->greaterThanOrEqual('reviewState', 0)));
98  $query->setOrderings(['integerVersion' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING]);
99  return $query->execute();
100  }
101 
108  public function findOneByCurrentVersionByExtensionKey($extensionKey)
109  {
110  $query = $this->createQuery();
111  $query->matching(
112  $query->logicalAnd(
113  $query->equals('extensionKey', $extensionKey),
114  $query->greaterThanOrEqual('reviewState', 0),
115  $query->equals('currentVersion', 1)
116  )
117  );
118  $query->setLimit(1);
119  return $query->execute()->getFirst();
120  }
121 
129  public function findOneByExtensionKeyAndVersion($extensionKey, $version)
130  {
131  $query = $this->createQuery();
132  // Hint: This method must not filter out insecure extensions, if needed,
133  // it should be done on a different level, or with a helper method.
134  $query->matching($query->logicalAnd(
135  $query->equals('extensionKey', $extensionKey),
136  $query->equals('version', $version)
137  ));
138  return $query->setLimit(1)->execute()->getFirst();
139  }
140 
150  public function findByTitleOrAuthorNameOrExtensionKey($searchString)
151  {
152  $quotedSearchString = $this->databaseConnection->escapeStrForLike($this->databaseConnection->quoteStr($searchString, 'tx_extensionmanager_domain_model_extension'), 'tx_extensionmanager_domain_model_extension');
153  $quotedSearchStringForLike = '\'%' . $quotedSearchString . '%\'';
154  $quotedSearchString = '\'' . $quotedSearchString . '\'';
155  $select =
156  self::TABLE_NAME . '.*, ' .
157  'CASE ' .
158  'WHEN extension_key = ' . $quotedSearchString . ' THEN 16 ' .
159  'WHEN extension_key LIKE ' . $quotedSearchStringForLike . ' THEN 8 ' .
160  'WHEN title LIKE ' . $quotedSearchStringForLike . ' THEN 4 ' .
161  'WHEN description LIKE ' . $quotedSearchStringForLike . ' THEN 2 ' .
162  'WHEN author_name LIKE ' . $quotedSearchStringForLike . ' THEN 1 ' .
163  'END AS position';
164  $where = '(
165  extension_key = ' . $quotedSearchString . ' OR
166  extension_key LIKE ' . $quotedSearchStringForLike . ' OR
167  title LIKE ' . $quotedSearchStringForLike . ' OR
168  description LIKE ' . $quotedSearchStringForLike . ' OR
169  author_name LIKE ' . $quotedSearchStringForLike . '
170  )
171  AND current_version = 1 AND review_state >= 0';
172  $order = 'position DESC';
173  $result = $this->databaseConnection->exec_SELECTgetRows($select, self::TABLE_NAME, $where, '', $order);
174  return $this->dataMapper->map(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension::class, $result);
175  }
176 
186  public function findByVersionRangeAndExtensionKeyOrderedByVersion($extensionKey, $lowestVersion = 0, $highestVersion = 0, $includeCurrentVersion = true)
187  {
188  $query = $this->createQuery();
189  $constraint = null;
190  if ($lowestVersion !== 0 && $highestVersion !== 0) {
191  if ($includeCurrentVersion) {
192  $constraint = $query->logicalAnd($query->lessThanOrEqual('integerVersion', $highestVersion), $query->greaterThanOrEqual('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
193  } else {
194  $constraint = $query->logicalAnd($query->lessThanOrEqual('integerVersion', $highestVersion), $query->greaterThan('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
195  }
196  } elseif ($lowestVersion === 0 && $highestVersion !== 0) {
197  if ($includeCurrentVersion) {
198  $constraint = $query->logicalAnd($query->lessThanOrEqual('integerVersion', $highestVersion), $query->equals('extensionKey', $extensionKey));
199  } else {
200  $constraint = $query->logicalAnd($query->lessThan('integerVersion', $highestVersion), $query->equals('extensionKey', $extensionKey));
201  }
202  } elseif ($lowestVersion !== 0 && $highestVersion === 0) {
203  if ($includeCurrentVersion) {
204  $constraint = $query->logicalAnd($query->greaterThanOrEqual('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
205  } else {
206  $constraint = $query->logicalAnd($query->greaterThan('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
207  }
208  } elseif ($lowestVersion === 0 && $highestVersion === 0) {
209  $constraint = $query->equals('extensionKey', $extensionKey);
210  }
211  if ($constraint) {
212  $query->matching($query->logicalAnd($constraint, $query->greaterThanOrEqual('reviewState', 0)));
213  }
214  $query->setOrderings([
215  'integerVersion' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
216  ]);
217  return $query->execute();
218  }
219 
226  {
227  $query = $this->createQuery();
228  $query->matching(
229  $query->logicalAnd(
230  $query->equals('category', \TYPO3\CMS\Extensionmanager\Domain\Model\Extension::DISTRIBUTION_CATEGORY),
231  $query->logicalNot($query->equals('ownerusername', 'typo3v4'))
232  )
233  );
234 
235  $query->setOrderings([
236  'alldownloadcounter' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
237  ]);
238 
239  return $query->execute();
240  }
241 
248  {
249  $query = $this->createQuery();
250  $query->matching(
251  $query->logicalAnd(
252  $query->equals('category', \TYPO3\CMS\Extensionmanager\Domain\Model\Extension::DISTRIBUTION_CATEGORY),
253  $query->equals('ownerusername', 'typo3v4')
254  )
255  );
256 
257  $query->setOrderings([
258  'alldownloadcounter' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
259  ]);
260 
261  return $query->execute();
262  }
263 
272  public function countByVersionRangeAndExtensionKey($extensionKey, $lowestVersion = 0, $highestVersion = 0)
273  {
274  return $this->findByVersionRangeAndExtensionKeyOrderedByVersion($extensionKey, $lowestVersion, $highestVersion)->count();
275  }
276 
283  public function findHighestAvailableVersion($extensionKey)
284  {
285  $query = $this->createQuery();
286  $query->matching($query->logicalAnd($query->equals('extensionKey', $extensionKey), $query->greaterThanOrEqual('reviewState', 0)));
287  $query->setOrderings([
288  'integerVersion' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
289  ]);
290  return $query->setLimit(1)->execute()->getFirst();
291  }
292 
299  public function insertLastVersion($repositoryUid = 1)
300  {
301  $this->markExtensionWithMaximumVersionAsCurrent($repositoryUid);
302 
303  return $this->getNumberOfCurrentExtensions();
304  }
305 
314  protected function markExtensionWithMaximumVersionAsCurrent($repositoryUid)
315  {
316  $uidsOfCurrentVersion = $this->fetchMaximalVersionsForAllExtensions($repositoryUid);
317 
318  $this->databaseConnection->exec_UPDATEquery(
319  self::TABLE_NAME,
320  'uid IN (' . implode(',', $uidsOfCurrentVersion) . ')',
321  [
322  'current_version' => 1,
323  ]
324  );
325  }
326 
335  protected function fetchMaximalVersionsForAllExtensions($repositoryUid)
336  {
337  $queryResult = $this->databaseConnection->sql_query(
338  'SELECT a.uid AS uid ' .
339  'FROM ' . self::TABLE_NAME . ' a ' .
340  'LEFT JOIN ' . self::TABLE_NAME . ' b ON a.repository = b.repository AND a.extension_key = b.extension_key AND a.integer_version < b.integer_version ' .
341  'WHERE a.repository = ' . (int)$repositoryUid . ' AND b.extension_key IS NULL ' .
342  'ORDER BY a.uid'
343  );
344 
345  $extensionUids = [];
346  while ($row = $this->databaseConnection->sql_fetch_assoc($queryResult)) {
347  $extensionUids[] = $row['uid'];
348  }
349  $this->databaseConnection->sql_free_result($queryResult);
350  return $extensionUids;
351  }
352 
358  protected function getNumberOfCurrentExtensions()
359  {
360  return $this->databaseConnection->exec_SELECTcountRows(
361  '*',
362  self::TABLE_NAME,
363  'current_version = 1'
364  );
365  }
366 
374  protected function addDefaultConstraints(\TYPO3\CMS\Extbase\Persistence\Generic\Query $query)
375  {
376  if ($query->getConstraint()) {
377  $query->matching($query->logicalAnd(
378  $query->getConstraint(),
379  $query->equals('current_version', true),
380  $query->greaterThanOrEqual('reviewState', 0)
381  ));
382  } else {
383  $query->matching($query->logicalAnd(
384  $query->equals('current_version', true),
385  $query->greaterThanOrEqual('reviewState', 0)
386  ));
387  }
388  return $query;
389  }
390 }
injectDataMapper(\TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper $dataMapper)
addDefaultConstraints(\TYPO3\CMS\Extbase\Persistence\Generic\Query $query)
findByVersionRangeAndExtensionKeyOrderedByVersion($extensionKey, $lowestVersion=0, $highestVersion=0, $includeCurrentVersion=true)
countByVersionRangeAndExtensionKey($extensionKey, $lowestVersion=0, $highestVersion=0)
setDefaultQuerySettings(\TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface $defaultQuerySettings)
Definition: Repository.php:203
if(TYPO3_MODE==='BE') $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tsfebeuserauth.php']['frontendEditingController']['default']