예제 #1
0
    /**
     * 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);
    }
예제 #2
0
 /**
  * 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);
 }
예제 #3
0
 /**
  * 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;
 }
예제 #4
0
    /**
     * 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);
    }