Конструктор

Возможно ли в лс воплотить конструктор, суть конструктора такая:
-выбираешь из всплывающего списка «тэги» несколько штук ( как «метки» заполняешь суть такая)
-нажимаешь поиск и результат поиска выводит те топики в которых встречаются только эти «тэги»

Что то похожее на:



Куда копать наведите на мысль?

8 комментариев

avatar
в сторону авадимовского плагина поиск без сфинкса, пилить его
  • hoti
  • 0
avatar
в 2 слова тут не ответишь.
во первых нужно определится оформлять это как отдельный плагин с введением нового экшена с модулями и шаблонами, либо добиливать сам ls.

а дальше уже реализовывать это используя примерно такой mysql запрос в меппере

SELECT
    tt.topic_id 
FROM
    prefix_topic_tag tt,
    prefix_topic t
WHERE 
    t.topic_publish=1 
AND 
    tt.topic_id=t.topic_id 
AND 
    tt.topic_tag_text in ( ? ) 
ORDER BY 
    t.topic_rating desc 
LIMIT 0, ?d ;


т.е передавать теги в поиск, получать айдишники, по айдишникам вытаскивать дополнительные данные топиков и выводить их. сумбурно, но используя исходники ls сделать это более чем реально.
и наверно самое наглядное это покопать экшен tag и его модуль.
avatar
передавать теги в метод меппера в запрос*
avatar
скорей всего в виде плагина что бы на отдельной странице была форма заполнения + поиск
avatar
/**
   * Поиск текста по топикам
   *
   * @param <type> $aRegExp
   * @param <type> $iCount
   * @param <type> $iCurrPage
   * @param <type> $iPerPage
   * @param <type> $aParams
   * @return <type>
   */
  private function _GetTopicsIdByRegexp($aRegExp, &$iCount, $iCurrPage, $iPerPage, $aParams) {
    $aResult=array();
    if (!$aParams['bSkipTags']) {
      $sql = "
	SELECT DISTINCT t.topic_id, 
          CASE WHEN (LOWER(t.topic_title) REGEXP ?) THEN 1 ELSE 0 END +
          CASE WHEN (LOWER(tc.topic_text_source) REGEXP ?) THEN 1 ELSE 0 END AS weight
	FROM ".Config::Get('db.table.topic')." AS t
          LEFT JOIN ".Config::Get('db.table.topic_content')." AS tc ON tc.topic_id=t.topic_id
	WHERE (topic_publish=1) AND
          ((LOWER(t.topic_title) REGEXP ?)
           {OR (LOWER(t.topic_title) REGEXP ?)}
            OR
           (LOWER(tc.topic_text_source) REGEXP ?)
           {OR (LOWER(tc.topic_text_source) REGEXP ?)}
	)
	ORDER BY
          weight DESC,
          t.topic_id ASC
	LIMIT ?d, ?d
	";
      $aRows=$this->oDb->selectPage($iCount, $sql,
          $aRegExp[0],
          $aRegExp[0],
          $aRegExp[0], (isset($aRegExp[1])? $aRegExp[1] : DBSIMPLE_SKIP),
          $aRegExp[0], (isset($aRegExp[1])? $aRegExp[1] : DBSIMPLE_SKIP),
          ($iCurrPage-1)*$iPerPage, $iPerPage);
    }

    if ($aRows) {
      foreach ($aRows as $aRow) {
        $aResult[]=$aRow['topic_id'];
      }
    }
    return $aResult;
  } // private function _GetTopicsIdByRegexp() //

это в маппере плагина acemysearch
avatar
public function GetSimilar($aTags,$iLimit) {		
		$sql = "SELECT
					tt.question_id 
				FROM
					prefix_qa_question_tag tt,
					prefix_qa_question t
				WHERE 
					t.question_publish=1 
				AND 
					tt.question_id=t.question_id 
				AND 
					tt.question_tag_text in ( ? ) 
				ORDER BY 
					t.question_rating desc 
				LIMIT 0, ?d ;";
	    $aQuestions=array();
		if($aRows=$this->oDb->select($sql,implode("','",$aTags),$iLimit)) {
			foreach($aRows as $aRow)
			{
				$aQuestions[]=$aRow['question_id'];
			}
		}
		return  $aQuestions;
	}
avatar
форму заполнения выбрать такую можно?
<p>
<label for="topic_tags">Ингредиенты:</label>

<input type="text" id="topic_tags" name="topic_tags" value="" class="input-wide autocomplete-tags-sep ui-autocomplete-input" autocomplete="off" role="textbox" aria-autocomplete="list" aria-haspopup="true"/>

<span class="note">Выберете ингредиент</span>
</p>
avatar
по типу этого eda.ru/includedsearch/ куда копать?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.