/** * Find an extension by title, author name or extension key * This is the function used by the TER search. It is using a * scoring for the matches to sort the extension with an * exact key match on top * * @param string $searchString The string to search for extensions * @return mixed */ public function findByTitleOrAuthorNameOrExtensionKey($searchString) { $quotedSearchString = $GLOBALS['TYPO3_DB']->escapeStrForLike($GLOBALS['TYPO3_DB']->quoteStr($searchString, 'tx_extensionmanager_domain_model_extension'), 'tx_extensionmanager_domain_model_extension'); $quotedSearchStringForLike = '\'%' . $quotedSearchString . '%\''; $quotedSearchString = '\'' . $quotedSearchString . '\''; $select = 'tx_extensionmanager_domain_model_extension.*, ( (extension_key like ' . $quotedSearchString . ') * 8 + (extension_key like ' . $quotedSearchStringForLike . ') * 4 + (title like ' . $quotedSearchStringForLike . ') * 2 + (author_name like ' . $quotedSearchStringForLike . ') ) as position'; $from = 'tx_extensionmanager_domain_model_extension'; $where = '( extension_key = ' . $quotedSearchString . ' OR extension_key LIKE ' . $quotedSearchStringForLike . ' OR description LIKE ' . $quotedSearchStringForLike . ' OR title LIKE ' . $quotedSearchStringForLike . ' ) AND current_version=1 HAVING position > 0'; $order = 'position desc'; $result = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows($select, $from, $where, '', $order); return $this->dataMapper->map('TYPO3\\CMS\\Extensionmanager\\Domain\\Model\\Extension', $result); }
/** * Find an extension by title, author name or extension key * This is the function used by the TER search. It is using a * scoring for the matches to sort the extension with an * exact key match on top * * @param string $searchString The string to search for extensions * @return mixed */ public function findByTitleOrAuthorNameOrExtensionKey($searchString) { $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(self::TABLE_NAME); $searchPlaceholder = $queryBuilder->createNamedParameter($searchString); $searchPlaceholderForLike = '%' . $queryBuilder->escapeLikeWildcards($searchString) . '%'; $searchConstraints = ['extension_key' => $queryBuilder->expr()->eq('extension_key', $queryBuilder->createNamedParameter($searchPlaceholder, \PDO::PARAM_STR)), 'extension_key_like' => $queryBuilder->expr()->like('extension_key', $queryBuilder->createNamedParameter($searchPlaceholderForLike, \PDO::PARAM_STR)), 'title' => $queryBuilder->expr()->like('title', $queryBuilder->createNamedParameter($searchPlaceholderForLike, \PDO::PARAM_STR)), 'description' => $queryBuilder->expr()->like('description', $queryBuilder->createNamedParameter($searchPlaceholderForLike, \PDO::PARAM_STR)), 'author_name' => $queryBuilder->expr()->like('author_name', $queryBuilder->createNamedParameter($searchPlaceholderForLike, \PDO::PARAM_STR))]; $caseStatement = 'CASE ' . 'WHEN ' . $searchConstraints['extension_key'] . ' THEN 16 ' . 'WHEN ' . $searchConstraints['extension_key_like'] . ' THEN 8 ' . 'WHEN ' . $searchConstraints['title'] . ' THEN 4 ' . 'WHEN ' . $searchConstraints['description'] . ' THEN 2 ' . 'WHEN ' . $searchConstraints['author_name'] . ' THEN 1 ' . 'END AS ' . $queryBuilder->quoteIdentifier('position'); $result = $queryBuilder->select('*')->addSelectLiteral($caseStatement)->from(self::TABLE_NAME)->where($queryBuilder->expr()->orX(...array_values($searchConstraints)), $queryBuilder->expr()->eq('current_version', $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT)), $queryBuilder->expr()->gte('review_state', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)))->orderBy('position', 'DESC')->execute()->fetchAll(); return $this->dataMapper->map(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension::class, $result); }
/** * Returns the first object in the result set * * @return object * @api */ public function getFirst() { if (is_array($this->queryResult)) { $queryResult = $this->queryResult; reset($queryResult); } else { $query = $this->getQuery(); $query->setLimit(1); $queryResult = $this->dataMapper->map($query->getType(), $this->persistenceManager->getObjectDataByQuery($query)); } $firstResult = current($queryResult); if ($firstResult === false) { $firstResult = null; } return $firstResult; }
/** * Find an extension by title, author name or extension key * This is the function used by the TER search. It is using a * scoring for the matches to sort the extension with an * exact key match on top * * @param string $searchString The string to search for extensions * @return mixed */ public function findByTitleOrAuthorNameOrExtensionKey($searchString) { $quotedSearchString = $this->databaseConnection->escapeStrForLike($this->databaseConnection->quoteStr($searchString, 'tx_extensionmanager_domain_model_extension'), 'tx_extensionmanager_domain_model_extension'); $quotedSearchStringForLike = '\'%' . $quotedSearchString . '%\''; $quotedSearchString = '\'' . $quotedSearchString . '\''; $select = self::TABLE_NAME . '.*, ' . 'CASE ' . 'WHEN extension_key = ' . $quotedSearchString . ' THEN 16 ' . 'WHEN extension_key LIKE ' . $quotedSearchStringForLike . ' THEN 8 ' . 'WHEN title LIKE ' . $quotedSearchStringForLike . ' THEN 4 ' . 'WHEN description LIKE ' . $quotedSearchStringForLike . ' THEN 2 ' . 'WHEN author_name LIKE ' . $quotedSearchStringForLike . ' THEN 1 ' . 'END AS position'; $where = '( extension_key = ' . $quotedSearchString . ' OR extension_key LIKE ' . $quotedSearchStringForLike . ' OR title LIKE ' . $quotedSearchStringForLike . ' OR description LIKE ' . $quotedSearchStringForLike . ' OR author_name LIKE ' . $quotedSearchStringForLike . ' ) AND current_version = 1 AND review_state >= 0'; $order = 'position DESC'; $result = $this->databaseConnection->exec_SELECTgetRows($select, self::TABLE_NAME, $where, '', $order); return $this->dataMapper->map(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension::class, $result); }