Добавление родного поиска на сайте :)

18
UPD 4 последняя сборка для поиска на LS 0.3.1

Так как мой приветственный топик об открытии сайта idea2.ru заминусовали :) — пишу в своём блоге :)
Короче — сижу сегодня жду пока отмокнут джинсы, которые я наконец-то собрался постирать и вдруг решил добавить нативный поиск по сайту на базе LS :)

Что из этого получилось можно посмотреть на idea2.ru

А реализовано это функцией которая представляет собой небольшую модификацую функции поиска по тегам :)
Поиск осуществляется по теме и тексту топика банальным
LOWER(topic_text) LIKE LOWER('%{$sTag}%')

Итак для установки потребуется:
самым важным шагом является загрузка картинки для поиска :)
1. в templates\skin\habra\img\ загружаем search.gif


2. в templates\skin\habra\header.tpl
найти закомментированное место формы поиска и туда вставить

<!-- -->
		<DIV class=search_form>
		<form method="get" action="{$DIR_WEB_ROOT}/search/">
			<input type="search" id="srch" maxlength="32" name="searchfor" value="Поиск" onkeyup="fast_search();" onblur="close_fast_search();" onfocus="this.select();" autocomplete="off" />
			<input type="submit" name="submit_search" value="Найти" size="15" />
		</form>
		</DIV>
		<!-- -->

3. далее в templates\skin\habra\js\main.js
добавить фукцию

function submitSearch(sText) {		
	window.location=DIR_WEB_ROOT+'/search/?searchfor='+sText;
	return false;
}

наблюдательный глаз сразу заметит, что это модификация
submitTags(sTag)

далее я даже не стал переименовывать переменную sTag :)

идём далее:
4. добавляем новую регистрацию в config\config.route.php
для этого в
return array(
добавляем строчку
'search' => 'ActionSearch',


5. создаём в classes\actions\ файл ActionSearch.class.php

<?
/*-------------------------------------------------------
*
*   LiveStreet Engine Social Networking
*   Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
*   Official site: www.livestreet.ru
*   Contact e-mail: rus.engine@gmail.com
*
*   GNU General Public License, version 2:
*   http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/

/**
 * Обрабатывает поиск по тегам
 *
 */
class ActionSearch extends Action {	
	/**
	 * Инициализация
	 *
	 */
	public function Init() {		
		/**
		 * Определяем какие блоки выводить
		 */
	}
	
	protected function RegisterEvent() {						
	}
		
	
	/**********************************************************************************
	 ************************ РЕАЛИЗАЦИЯ ЭКШЕНА ***************************************
	 **********************************************************************************
	 */
	
	/**
	 * Отображение топиков
	 *
	 */
	protected function EventNotFound() {
		/**
		 * Получаем тег из УРЛа
		 */
		$sTag=urldecode($this->sCurrentEvent);
		//$sTag = str_replace ('?searchfor=', '', $sTag);
		$sTag = $_GET['searchfor'];
		//$sTag0 = htmlspecialchars($sTag, ENT_QUOTES);
		//$sTag = $sTag0;
		$bad = array ("`","~","@","#","$","%","^","&","*","-","=","+","{","}",">","<",",","?","/","|");
		$repl = array ("","","","","","","","","","","","","","","","","","","","");
		$sTag = str_replace ($bad, $repl, $sTag);
		/**
		 * Передан ли номер страницы
		 */
		if (preg_match("/^page(\d+)$/i",$this->getParam(0),$aMatch)) {			
			$iPage=$aMatch[1];
		} else {
			$iPage=1;
		}		
		/**
		 * Получаем список топиков
		 */
		$iCount=0;			
		//$aResult=$this->Topic_GetTopicsByTag($sTag,$iCount,$iPage,BLOG_TOPIC_PER_PAGE);		
		$aResult=$this->Topic_GetTopicsBySearch($sTag,$iCount,$iPage,BLOG_TOPIC_PER_PAGE);
		$aTopics=$aResult['collection'];	
		/**
		 * Формируем постраничность
		 */		
		$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_TOPIC_PER_PAGE,4,DIR_WEB_ROOT.'/search/'.htmlspecialchars($sTag));
		/**
		 * Загружаем переменные в шаблон
		 */				
		$this->Viewer_Assign('aPaging',$aPaging);
		$this->Viewer_Assign('aTopics',$aTopics);
		$this->Viewer_Assign('sTag',$sTag);
		$this->Viewer_AddHtmlTitle('Поиск');
		$this->Viewer_AddHtmlTitle($sTag);
		/**
		 * Устанавливаем шаблон вывода
		 */
		$this->SetTemplateAction('index');		
	}	
}
?>

тут нужно ещё добавить какую-то фильтрацию?

6. в templates\skin\habra\actions\ создаём директорию ActionSearch а уже внутри неё файл index.tpl

{include file='header.tpl'}

{include file='menu.blog.tpl'}



 <table width="100%" border="0" cellspacing="4" cellpadding="4" class="beach_party_ireland">
    <tr>

     <td nowrap align="left"><span class="headline_tags">
     <img src="{$DIR_STATIC_SKIN}/img/search.gif" border="0" width="19" height="17" title="поиск" alt="" > →</span></td>
     <form action="" method="GET" style="margin: 0px;"  onsubmit="return submitSearch(this.searchfor.value);">
     <input type="hidden" name="mode" value="blog">
     <td width="100%"><input type="text" name="searchfor" value="{$sTag|escape:'html'}" style="width: 100%; padding-left: 4px; padding-right: 4px;" class="tag_form"></td>
     </form>
     
    </tr>
   </table>



{include file='topic_list.tpl'}


{include file='footer.tpl'}


7. модифицируем classes\modules\topic\Topic.class.php
добавляем функцию

/**
	 * Получает список топиков по тексту (поиск)
	 *
	 * @param unknown_type $sTag
	 * @param unknown_type $iCount
	 * @param unknown_type $iPage
	 * @param unknown_type $iPerPage
	 * @return unknown
	 */
	public function GetTopicsBySearch($sTag,$iCount,$iPage,$iPerPage) {		
		if (false === ($data = $this->Cache_Get("topic_mysearch_{$sTag}_{$iPage}_{$iPerPage}"))) {			
			$data = array('collection'=>$this->oMapperTopic->GetTopicsBySearch($sTag,$iCount,$iPage,$iPerPage),'count'=>$iCount);
			$this->Cache_Set($data, "topic_mysearch_{$sTag}_{$iPage}_{$iPerPage}", array('topic_update','topic_new'), 60*15);
		}
		return $data;		
	}


8. и соответственно редактируем classes\modules\topic\mapper\Topic.mapper.class.php

//
	// поиск текста по топикам
	//
	public function GetTopicsBySearch($sTag,&$iCount,$iCurrPage,$iPerPage) 
	{
		$iCurrentUserId=-1;
		if (is_object($this->oUserCurrent)) {
			$iCurrentUserId=$this->oUserCurrent->getId();
		}
		$sql = "	SELECT
						t.*,
                        tc.*,
                        u.user_login as user_login,
                        b.blog_title as blog_title,
						b.blog_type as blog_type,
						b.blog_url as blog_url,
                        IF(tv.topic_id IS NULL,0,1) as user_is_vote,
						tv.vote_delta as user_vote_delta,
						IF(tqv.topic_id IS NULL,0,1) as user_question_is_vote 
					FROM (				
							SELECT DISTINCT 
								topic_id										
							FROM 
								".DB_TABLE_TOPIC_CONTENT."								
							WHERE 
							LOWER(topic_text) LIKE LOWER('%{$sTag}%')
							UNION
								
								SELECT DISTINCT 
									topic_id											
								FROM ".DB_TABLE_TOPIC." 
								WHERE 
								LOWER(topic_title) LIKE LOWER('%{$sTag}%')
								
                            ORDER BY topic_id DESC				
						 ) as tt

						 JOIN ".DB_TABLE_TOPIC." AS t ON tt.topic_id=t.topic_id
						 JOIN ".DB_TABLE_USER." AS u ON t.user_id=u.user_id
						 JOIN ".DB_TABLE_BLOG." AS b ON t.blog_id=b.blog_id	
						 LEFT JOIN (
								SELECT
									topic_id,
									vote_delta												
								FROM ".DB_TABLE_TOPIC_VOTE." 
								WHERE user_voter_id = ?d
								) AS tv ON tt.topic_id=tv.topic_id
						 LEFT JOIN (
								SELECT
									topic_id																			
								FROM ".DB_TABLE_TOPIC_QUESTION_VOTE." 
								WHERE user_voter_id = ?d
								) AS tqv ON tt.topic_id=tqv.topic_id
                         LEFT JOIN ".DB_TABLE_TOPIC_CONTENT." AS tc ON tt.topic_id=tc.topic_id
				;	
					";
		$aTopics=array();
		$iCount=0;
		if ($aRows=$this->oDb->select($sql,$sTag,($iCurrPage-1)*$iPerPage, $iPerPage,$iCurrentUserId,$iCurrentUserId)) {
			foreach ($aRows as $aTopic) {
				$aTopics[]=new TopicEntity_Topic($aTopic);
				$iCount++;
			}
			//$iCount=$this->GetCountTopicsBySearch($sTag);
		}
		return $aTopics;
	}


Всё :)
Вроде ничего не забыл :)

PS если вас заинтересовала судьба джинсов — они постираны и сейчас сохнут на балконе :)))

UPD
вот архив с файлами http://karta39.ru/blog/wp-content/uploads/2009/02/ls-search.zip
однако, я использовал дистрибутив не из svn-на, а скачивал с sf, так что лучше всё же просто добавить нужные функции в файлы вашего проекта.
из проблем с поиском — в настоящее время почему-то не формируются страницы найденного — всё найденное выводится на одной странице :(
UPD 2 проблема c постраничным выводом результатов поиска решается так

так же при попытке перехода на следующую страницу выпадало предупреждение в отсутствии searchfor

убираем предупреждение так :))
if (preg_match("/searchfor/i",$sTag))
{
   $sTag = $_GET['searchfor'];
}


как только эту проблему решу — сразу дам знать :)

UPD 3 адаптация поиска к 0.3 здесь

UPD 4 последняя сборка для поиска на LS 0.3.1
  • +7
  • 22 февраля 2009, 14:32
  • noonv

Комментарии (84)

RSS свернуть / развернуть
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
Если я правильно понял то это реализация поиска без использования sphinx. Тем кто на обычном хостинге может очень пригодиться. Пока не проверял, а вообще респект, молодец. Я только не понял почему столько комментариев удаленных?
+4
еще бы в поиск подсветку найденого текста и было-бы то что нужно!
+2
там был мусор
+2
прошу прощения :) сразу не понял в чём была проблема, а спешил выложить так как уже убегал из дома :) Спасибо за внесённые правки :)
0
да — вы поняли правильно :) в комментариях был мусор — топик не опубликовался до конца — времени разбираться в чём проблема не было — я спешил убегать :) и я запостил продолжение в комментариях :)
0
А можно получить все модифицированные файлы в виде архива, чтобы подлить просто.
0
разумеется :) скоро выложу и сразу дам ссылку ;)
0
не прошло и нескольких часов, как добавляется небольшое улучшение :)
заменить поиск в topic_text на topic_text_source, чтобы не было неправильного срабатывания на код Geshi ;)
0
  • avatar
  • noonv
  • 23 февраля 2009, 06:02

вот архив с файлами http://karta39.ru/blog/wp-content/uploads/2009/02/ls-search.zip
однако, я использовал дистрибутив не из svn-на, а скачивал с sf, так что лучше всё же просто добавить нужные функции в файлы вашего проекта.
из проблем с поиском — в настоящее время почему-то не формируются страницы найденного — всё найденное выводится на одной странице :(

так же при попытке перехода на следующую страницу выпадало предупреждение в отсутствии searchfor

убираем предупреждение так :))
if (preg_match("/searchfor/i",$sTag))
{
   $sTag = $_GET['searchfor'];
}
как только эту проблему решу — сразу дам знать :)
+2
  • avatar
  • noonv
  • 24 февраля 2009, 09:41
Офигеть круто!
А вы бы не могли нормаль статью написать, и все оформить?
Просто Сфинкс — я не могу поставить, у меня простой хостинг.
Поиск от ГУГЛА тоже не особо рулит, а может ваш лучше индексирует? Как вы думаете?
Можно пример посмотреть вашего поиска?
Он к ЛС 0,3 подходит?
-1
хм… а что не понятно из этой заметки? — там есть ответы на все ваши вопросы ;)
относительно LS 0.3 пока сказать не могу — ещё не обновился :)
0
Ответы есть, но их надо искать в самих комментариях. Это не очень удобно. Ссылки на архивы и какие-то изменения (как например эту) в последствие надо добавлять в топик, чтобы потом не читать все комментарии.
+1
это верно :) сейчас обновлю :)
+1
Здравствуйте Уважаемый noonv!

Проблема с постраничным выводом результатов поиска была в следующем:
В файле Topic.mapper.class.php в функции GetTopicsBySearch необходимо было посчитать вначале общее количество строк в таблице удовлетворяющих поисковому запросу, а уже во втором запросе вытаскивать данные относящиеся к конкретной странице результатов. Осталось только оптимизировать первый запрос, что бы он выдавал только количество строк. Я бы и рад это сделать, но в SQL я увы не силён — для меня это тёмный лес.

<code>//
	// поиск текста по топикам
	//
	public function GetTopicsBySearch($sTag,&$iCount,$iCurrPage,$iPerPage) 
	{
		$iCurrentUserId=-1;
		if (is_object($this->oUserCurrent)) {
			$iCurrentUserId=$this->oUserCurrent->getId();
		}
		$sql = "	SELECT
						t.*,
                        tc.*,
                        u.user_login as user_login,
                        b.blog_title as blog_title,
						b.blog_type as blog_type,
						b.blog_url as blog_url,
                        IF(tv.topic_id IS NULL,0,1) as user_is_vote,
						tv.vote_delta as user_vote_delta,
						IF(tqv.topic_id IS NULL,0,1) as user_question_is_vote 
					FROM (				
							SELECT DISTINCT 
								topic_id										
							FROM 
								".DB_TABLE_TOPIC_CONTENT."								
							WHERE 
							LOWER(topic_text_source) LIKE LOWER('%{$sTag}%')
							UNION
								
								SELECT DISTINCT 
									topic_id											
								FROM ".DB_TABLE_TOPIC." 
								WHERE 
								LOWER(topic_title) LIKE LOWER('%{$sTag}%')
								
								ORDER BY topic_id DESC				
						 ) as tt

						 JOIN ".DB_TABLE_TOPIC." AS t ON tt.topic_id=t.topic_id
						 JOIN ".DB_TABLE_USER." AS u ON t.user_id=u.user_id
						 JOIN ".DB_TABLE_BLOG." AS b ON t.blog_id=b.blog_id	
						 LEFT JOIN (
								SELECT
									topic_id,
									vote_delta												
								FROM ".DB_TABLE_TOPIC_VOTE." 
								WHERE user_voter_id = ?d
								) AS tv ON tt.topic_id=tv.topic_id
						 LEFT JOIN (
								SELECT
									topic_id																			
								FROM ".DB_TABLE_TOPIC_QUESTION_VOTE." 
								WHERE user_voter_id = ?d
								) AS tqv ON tt.topic_id=tqv.topic_id
                         LEFT JOIN ".DB_TABLE_TOPIC_CONTENT." AS tc ON tt.topic_id=tc.topic_id
				;	
					";

		$iCount=0;
		if ($aRows=$this->oDb->select($sql,$sTag,($iCurrPage-1)*$iPerPage, $iPerPage,$iCurrentUserId,$iCurrentUserId)) {
			foreach ($aRows as &$value) {
				$iCount++;
			}
		}

	    $Start=($iCurrPage*$iPerPage)-$iPerPage;

		$sql = "	SELECT
						t.*,
                        tc.*,
                        u.user_login as user_login,
                        b.blog_title as blog_title,
						b.blog_type as blog_type,
						b.blog_url as blog_url,
                        IF(tv.topic_id IS NULL,0,1) as user_is_vote,
						tv.vote_delta as user_vote_delta,
						IF(tqv.topic_id IS NULL,0,1) as user_question_is_vote 
					FROM (				
							SELECT DISTINCT 
								topic_id										
							FROM 
								".DB_TABLE_TOPIC_CONTENT."								
							WHERE 
							LOWER(topic_text_source) LIKE LOWER('%{$sTag}%')
							UNION
								
								SELECT DISTINCT 
									topic_id											
								FROM ".DB_TABLE_TOPIC." 
								WHERE 
								LOWER(topic_title) LIKE LOWER('%{$sTag}%')
								
								ORDER BY topic_id DESC				
						        LIMIT ".$Start.", ".$iPerPage."
						 ) as tt

						 JOIN ".DB_TABLE_TOPIC." AS t ON tt.topic_id=t.topic_id
						 JOIN ".DB_TABLE_USER." AS u ON t.user_id=u.user_id
						 JOIN ".DB_TABLE_BLOG." AS b ON t.blog_id=b.blog_id	
						 LEFT JOIN (
								SELECT
									topic_id,
									vote_delta												
								FROM ".DB_TABLE_TOPIC_VOTE." 
								WHERE user_voter_id = ?d
								) AS tv ON tt.topic_id=tv.topic_id
						 LEFT JOIN (
								SELECT
									topic_id																			
								FROM ".DB_TABLE_TOPIC_QUESTION_VOTE." 
								WHERE user_voter_id = ?d
								) AS tqv ON tt.topic_id=tqv.topic_id
                         LEFT JOIN ".DB_TABLE_TOPIC_CONTENT." AS tc ON tt.topic_id=tc.topic_id
				;	
					";

		$aTopics=array();
		if ($aRows=$this->oDb->select($sql,$sTag,($iCurrPage-1)*$iPerPage, $iPerPage,$iCurrentUserId,$iCurrentUserId)) {
			foreach ($aRows as $aTopic) {
				$aTopics[]=new TopicEntity_Topic($aTopic);
			}
		}
		return $aTopics;
	}</code>


С уважением ALF.
+1
Привет :)
я так и думал :) вот только думал всё же обойтись одним запросом :)
однако даже с двумя запросами никак не получается заставить работать :(
0
как бы прикрутить этот поиск под новый дизайн? в нем main.js нет
+1
наверное имеется в виду новая версия LS — 0.3
например, можно использовать костыль: создать свой js-файл и туда поместить эту функцию, а потом прописать файл в хидере нужных шаблонов.
+1
спасибо, что откликнулись, все верно речь о pre 0.3, шаблон обзывается new.
а потом прописать файл в хидере нужных шаблонов. 

вас не затруднит поподробнее расписать, как это сделать.
0
<DIV class=search>
                <form method="get" action="{$DIR_WEB_ROOT}/search/">
                   
                        <input class="text" type="search" id="srch" maxlength="32" name="searchfor" value="Поиск" onkeyup="fast_search();" onblur="close_fast_search();" onfocus="this.select();" autocomplete="off" />
                        <input class="button" type="submit" value="" />
                		
                </form>
                </DIV>

код в header_nav.tpl оставит дизайн поля поиска и кнопки
0
не знаю (не смог пока что разобраться) с чем это связано, но по тегам-меткам поиск не совсем корректно происходит.

Проверял по определенному запрос, который находился только в метках публикации. И в результате по поиску я на данную публикацию (которую брал как пример) я не вышел. В чем может быть проблема, кто-нибудь сталкивался?
0
если посмотрите исходники, то данный поиск не ищет по тегам, а только по названию и тексту статьи.
0
Пробовал к новой сборке прикрутить, не получается, ругается
Fatal error: Uncaught exception 'Exception' with message 'Не найден класс модуля - GetTopicsBySearch' in classes/engine/Engine.class.php:95 Stack trace: #0 /classes/engine/Engine.class.php(141): Engine->LoadModule('GetTopicsBySear...', true) #1 /classes/engine/Module.class.php(37): Engine->_CallModule('GetTopicsBySear...', Array) #2 [internal function]: Module->__call('GetTopicsBySear...', Array) #3 /classes/engine/Engine.class.php(145) : eval()'d code(1): LsTopic->GetTopicsBySearch('???????????????', 0, 1, 10) #4 /classes/engine/Engine.class.php(145): eval() #5 /classes/engine/Action.class.php(268): Engine->_CallModule('Topic_GetTopics...', Array) #6 [internal function]: Action->__call('Topic_GetTopics...', Array) #7 /classes/actions/ActionSearch.class.php(71): ActionSearch->Topic_ in /classes/engine/Engine.class.php on line 95
0
актуально
0
так я вроде бы поставил его на SVN(кажется 263)
все работает, как бы…
но вот интересно вбиваю в поиск, выгоняет список тем по искомому, нажимаю на название топика, и в момент до загрузки страницы с топиком, на доли секунды всплывает окно с «добавлением изображения»… странно. что я не так сделал, придется искать…

И еще вопрос, почему вот здесь:
, (выделение поиска),
$aTopic['topic_text_short']=str_replace($sTag,"<b>$sTag</b>",$aTopic['topic_text_short']);//подсветка поисковой фразы

нельзя применить теги меняющие цвет и размер текста? только(<.b><./b>)?
0
  • avatar
  • Yuta
  • 14 апреля 2009, 13:02
Убираю
в файле /templates/skin/new/actions/ActionBlog/comment.tpl строку
{include file='window_load_img.tpl' sToLoad='form_comment_text'}


становится все нормально.

В какой файл можно перенести этот код:
{include file='window_load_img.tpl' sToLoad='form_comment_text'}

чтобы осталась работать функция вставки картинок в комментариях..?
0
  • avatar
  • Yuta
  • 14 апреля 2009, 14:04
в общем сам попросил, сам сделал, файлы под 274 сборку.
+3
Прикручиваем поиск noov-a к 0.3 — поехали:

\classes\actions\ActionSearch.class.php

<?
/*-------------------------------------------------------
*
*   LiveStreet Engine Social Networking
*   Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
*   Official site: www.livestreet.ru
*   Contact e-mail: rus.engine@gmail.com
*
*   GNU General Public License, version 2:
*   http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/

/**
 * Обрабатывает поиск по тегам
 *
 */
class ActionSearch extends Action {	
	/**
	 * Инициализация
	 *
	 */
	public function Init() {		
		/**
		 * Определяем какие блоки выводить
		 */
	}
	
	protected function RegisterEvent() {						
	}
		
	
	/**********************************************************************************
	 ************************ РЕАЛИЗАЦИЯ ЭКШЕНА ***************************************
	 **********************************************************************************
	 */
	
	/**
	 * Отображение топиков
	 *
	 */
	protected function EventNotFound() {
		/**
		 * Получаем тег из УРЛа
		 */
		$sTag=urldecode($this->sCurrentEvent);
		//$sTag = str_replace ('?searchfor=', '', $sTag);

			$sTag = $_POST['q'];
			
		if (strlen($sTag)<=6) 
		{
		    $sTag = '!!Слишком!!короткий!!поисковый!!запрос!!';
		} 			

		//$sTag0 = htmlspecialchars($sTag, ENT_QUOTES);
		//$sTag = $sTag0;
		$bad = array ("`","~","@","#","$","%","^","&","*","-","=","+","{","}",">","<",",","?","/","|");
		$repl = array ("","","","","","","","","","","","","","","","","","","","");
		$sTag = str_replace ($bad, $repl, $sTag);
		/**
		 * Передан ли номер страницы
		 */
		if (preg_match("/^page(\d+)$/i",$this->getParam(0),$aMatch)) {			
			$iPage=$aMatch[1];
		} else {
			$iPage=1;
		}		
		/**
		 * Получаем список топиков
		 */
		$iCount=0;			
		//$aResult=$this->Topic_GetTopicsByTag($sTag,$iCount,$iPage,BLOG_TOPIC_PER_PAGE);		
		$aResult=$this->Topic_GetTopicsBySearch($sTag,$iCount,$iPage,BLOG_TOPIC_PER_PAGE);
		$aTopics=$aResult['collection'];	
		/**
		 * Формируем постраничность
		 */		
		$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_TOPIC_PER_PAGE,4,DIR_WEB_ROOT.'/search/topics/'.htmlspecialchars($sTag));
		/**
		 * Загружаем переменные в шаблон
		 */				
		$this->Viewer_Assign('aTopics',$aTopics);
		$this->Viewer_Assign('aPaging',$aPaging);
		$this->Viewer_Assign('sTag',$sTag);
		$this->Viewer_AddHtmlTitle('Поиск');
		$this->Viewer_AddHtmlTitle($sTag);
		/**
		 * Устанавливаем шаблон вывода
		 */
		$this->SetTemplateAction('index');		
	}	
}
?>


Берём функцию из этого сообщения:
livestreet.ru/blog/909.html#comment12233
и вставляем её в Topic.mapper.class.php

Создаём папку:
\templates\skin\new\actions\ActionSearch
В этой папке создаём файлик index.tpl к следующего содержания:

{include file='header.tpl' showWhiteBack=true}

<h1>Поиск</h1>
<form action="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_SEARCH}/topics/" method="POST">
	<p>
		<input type="text" value="" name="q" class="w300">
		<input type="submit" value="Найти">
	</p>
</form>

{include file='topic_list.tpl'}

{include file='footer.tpl'}


Никакого java скрипта специально добавлять не нужно.
Вроде ничего не забыл, если что поправьте меня.
Извиняюсь за портянку.
+2
  • avatar
  • ALF
  • 14 апреля 2009, 19:00
Когда выставляешь часто встречающееся слово, и поиск выдает сразу несколько страниц, то с первой все ок, а нажимая 2-ю- получаю пустое окно и
Notice: Undefined index: q in Z:\home\ккк.ru\www\classes\actions\ActionSearch.class.php on line 53

(Использую денвер)
+1
  • avatar
  • Yuta
  • 14 апреля 2009, 21:54
в сафари криво отображается новый поиск… как можно исправить?
0
было бы неплохо увидеть скриншот :)
0
http://img34.imageshack.us/img34/4605/searchz.th.gif
+1
тут дело не в поиске, а в шаблоне :)
0
согласен… ) кст на idea2.ru в сафари такая же проблема…

так как можно это исправить?
0
думаю, лучше этот вопрос задать ort-у и авторам шаблона — мне пока ничего в голову не приходит :)
0
Вопрос по поиску.
Как можно найти человека, если помнишь только город. В тегах на LS значатся не все города. К примеру нет Твери и Рыбинска, а зарегистрированные пользователи есть. Ввожу в поиске «Тверь» или «Рыбинск» и получаю: «Удивительно, но поиск не дал результатов».
0
Привет из Твери) Ты немного путаешь. Этот поиск не сканирует поля профилей, идет поиск только по топикам и комментариям.
Не все города в тегах peoples, потому, что выводится какое то определенное количество городов с максимальным числом указавших этот город, если например ты забьешь, что ты из Твери, то в /peoples/ наш город появится.
0
поиск по городам здесь: livestreet.ru/people/city/*cityname*. И тут все ищет.
0
заставлять пользователя вбивать урлы выглядит примерно также, как заставлять писать посты запросами :)
Хотя поиск по городам я думаю некритичен :)
0
Ну коль пошла такая пьянка, то передать значение из текстового поля(кстати, с юзаньем Autocompliter) элементарно.
Или же сделать полное облако городов. Кстати второе — очень даже хорошая идея… на отдельной странице /peoples/cities/ отдельным экшеном.
+1
вот тут я полностью с тобой солидарен :)
0
небольшое уточнение :) поиск по комментариям не идёт — только по названию и содержимому топика :)
0
да, кстати, а почему не был реализован поиск и по комментариям, а только по топику?
+1
:) действительно :) нужно будет доработать :)
+1
это не будет нести дополнительной нагрузки на базу/движок?
0
я кстати пользуюсь вашей разработкой(+ ALF доработкой) и очень доволен.
Мне кажется это лучше чем — прикручивать поиск(+Рекламу) google
имхо
+3
мне тоже так кажется :)))
+1
Странно. Разархивировал все. Раскидал папки, внес строку в header.tpl. Но когда выдает результаты поиска, в поисковой строке всегда topics и, как следствие, «Сюда еще никто не успел написать»
0
сорри — забыл упомянуть — нужно сделать редакцию header_nav.tpl
— заменить стандартную форму поиска на:

<form method="get" action="{$DIR_WEB_ROOT}/search/">
                        <input class="text" type="search" id="srch" maxlength="32" name="searchfor" value="Поиск" onkeyup="fast_search();" onblur="close_fast_search();" onfocus="this.select();" autocomplete="off" />
                        <input class="button" type="submit" value="" />
			</form>
+3
Да, я заметил, уже внес. :)
Вообще, спасибо большое. Действительно здорово. Если нет возможности сфинкса поставить — это именно то, что нужно.
+1
как говорится — «на безрыбье и такой поиск за гугл сойдёт» :))))
0
Спасибо, помогло:) Правда для 0.4.2 пришлось переделать, но «ядро» спасло:)
+1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.