/**
  * Test ordering if a searchword was given
  * - show sorting in FE is allowed
  * - admin presorts are uninteresting
  * - FE-User is allowed to choose between sortdate,tstamp and title
  * - allowed piVars are given
  *
  * @test
  */
 public function checkOrderingWithSearchwordAndUserCanSortWithAllowedPiVars()
 {
     $this->pObj->sword = 'Hallo';
     $this->pObj->conf = array('sortWithoutSearchword' => 'tstamp asc', 'showSortInFrontend' => true, 'sortByVisitor' => 'sortdate,tstamp,title', 'sortByAdmin' => 'sortdate desc');
     $this->pObj->piVars = array('orderByField' => 'title', 'orderByDir' => 'asc');
     $this->pObj->piVars = $this->div->cleanPiVars($this->pObj->piVars);
     $db = new tx_kesearch_db($this->pObj);
     $this->assertEquals('title asc', $db->getOrdering());
 }
 /**
  * Initializes flexform, conf vars and some more
  *
  * @return void
  */
 public function init()
 {
     // get some helper functions
     $this->div = GeneralUtility::makeInstance('tx_kesearch_lib_div', $this);
     // set start of query timer
     if (!$GLOBALS['TSFE']->register['ke_search_queryStartTime']) {
         $GLOBALS['TSFE']->register['ke_search_queryStartTime'] = GeneralUtility::milliseconds();
     }
     // make settings from flexform available in general configuration ($this->conf)
     $this->moveFlexFormDataToConf();
     // in pi2 (the list plugin) fetch the configuration from pi1 (the search
     // box plugin) since all the configuration is done there
     if (!empty($this->conf['loadFlexformsFromOtherCE'])) {
         $data = $this->pi_getRecord('tt_content', intval($this->conf['loadFlexformsFromOtherCE']));
         $this->cObj->data = $data;
         $this->moveFlexFormDataToConf();
     }
     // clean piVars
     $this->piVars = $this->div->cleanPiVars($this->piVars);
     // get preselected filter from rootline
     $this->getFilterPreselect();
     // add stdWrap properties to each config value (not to arrays)
     foreach ($this->conf as $key => $value) {
         if (!is_array($this->conf[$key])) {
             $this->conf[$key] = $this->cObj->stdWrap($value, $this->conf[$key . '.']);
         }
     }
     // set some default values (this part have to be after stdWrap!!!)
     if (!$this->conf['resultPage']) {
         $this->conf['resultPage'] = $GLOBALS['TSFE']->id;
     }
     if (!isset($this->piVars['page'])) {
         $this->piVars['page'] = 1;
     }
     if (!empty($this->conf['additionalPathForTypeIcons'])) {
         $this->conf['additionalPathForTypeIcons'] = rtrim($this->conf['additionalPathForTypeIcons'], '/') . '/';
     }
     // hook: modifyFlexFormData
     if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ke_search']['modifyFlexFormData'])) {
         foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ke_search']['modifyFlexFormData'] as $_classRef) {
             $_procObj =& GeneralUtility::getUserObj($_classRef);
             $_procObj->modifyFlexFormData($this->conf, $this->cObj, $this->piVars);
         }
     }
     // prepare database object
     $this->db = GeneralUtility::makeInstance('tx_kesearch_db', $this);
     // set startingPoints
     $this->startingPoints = $this->div->getStartingPoint();
     // get filter class
     $this->filters = GeneralUtility::makeInstance('tx_kesearch_filters');
     // get extension configuration array
     $this->extConf = tx_kesearch_helper::getExtConf();
     $this->extConfPremium = tx_kesearch_helper::getExtConfPremium();
     // initialize filters
     $this->filters->initialize($this);
     // init templating (marker based or fluid)
     $this->initTemplate();
     // get first startingpoint
     $this->firstStartingPoint = $this->div->getFirstStartingPoint($this->startingPoints);
     // build words searchphrase
     $searchPhrase = GeneralUtility::makeInstance('tx_kesearch_lib_searchphrase');
     $searchPhrase->initialize($this);
     $searchWordInformation = $searchPhrase->buildSearchPhrase();
     // Hook: modifySearchWords
     if (isset($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ke_search']['modifySearchWords'])) {
         foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ke_search']['modifySearchWords'] as $classRef) {
             $hookObj = GeneralUtility::getUserObj($classRef);
             if (method_exists($hookObj, 'modifySearchWords')) {
                 $hookObj->modifySearchWords($searchWordInformation, $this);
             }
         }
     }
     // set searchword and tag information
     $this->sword = $searchWordInformation['sword'];
     $this->swords = $searchWordInformation['swords'];
     $this->wordsAgainst = $searchWordInformation['wordsAgainst'];
     $this->tagsAgainst = $searchWordInformation['tagsAgainst'];
     $this->scoreAgainst = $searchWordInformation['scoreAgainst'];
     $this->isEmptySearch = $this->isEmptySearch();
     // Since sorting for "relevance" in most cases ist the most useful option and
     // this sorting option is not available until a searchword is given, make it
     // the default sorting after a searchword has been given.
     // Set default sorting to "relevance" if the following conditions are true:
     // * sorting by user is allowed
     // * sorting for "relevance" is allowed (internal: "score")
     // * user did not select his own sorting yet
     // * a searchword is given
     $isInList = GeneralUtility::inList($this->conf['sortByVisitor'], 'score');
     if ($this->conf['showSortInFrontend'] && $isInList && !$this->piVars['sortByField'] && $this->sword) {
         $this->piVars['sortByField'] = 'score';
         $this->piVars['sortByDir'] = 'desc';
     }
     // after the searchword is removed, sorting for "score" is not possible
     // anymore. So remove this sorting here and put it back to default.
     if (!$this->sword && $this->piVars['sortByField'] == 'score') {
         unset($this->piVars['sortByField']);
         unset($this->piVars['sortByDir']);
     }
     // chooseBestIndex is only needed for MySQL-Search. Not for Sphinx
     if (!$this->extConfPremium['enableSphinxSearch']) {
         // precount results to find the best index
         $this->db->chooseBestIndex($this->wordsAgainst, $this->tagsAgainst);
     }
     // perform search at this point already if we need to calculate what
     // filters to display.
     if ($this->conf['checkFilterCondition'] != 'none') {
         $this->db->getSearchResults();
     }
     // add cssTag to header if set
     $cssFile = $GLOBALS['TSFE']->tmpl->getFileName($this->conf['cssFile']);
     if (!empty($cssFile)) {
         $GLOBALS['TSFE']->getPageRenderer()->addCssFile($cssFile);
     }
 }