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

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

84 комментария

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

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

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

убираем предупреждение так :))
if (preg_match("/searchfor/i",$sTag))
{
   $sTag = $_GET['searchfor'];
}
как только эту проблему решу — сразу дам знать :)
avatar
Офигеть круто!
А вы бы не могли нормаль статью написать, и все оформить?
Просто Сфинкс — я не могу поставить, у меня простой хостинг.
Поиск от ГУГЛА тоже не особо рулит, а может ваш лучше индексирует? Как вы думаете?
Можно пример посмотреть вашего поиска?
Он к ЛС 0,3 подходит?
avatar
хм… а что не понятно из этой заметки? — там есть ответы на все ваши вопросы ;)
относительно LS 0.3 пока сказать не могу — ещё не обновился :)
avatar
Ответы есть, но их надо искать в самих комментариях. Это не очень удобно. Ссылки на архивы и какие-то изменения (как например эту) в последствие надо добавлять в топик, чтобы потом не читать все комментарии.
avatar
это верно :) сейчас обновлю :)
avatar
Здравствуйте Уважаемый 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.
avatar
Привет :)
я так и думал :) вот только думал всё же обойтись одним запросом :)
однако даже с двумя запросами никак не получается заставить работать :(
avatar
как бы прикрутить этот поиск под новый дизайн? в нем main.js нет
avatar
наверное имеется в виду новая версия LS — 0.3
например, можно использовать костыль: создать свой js-файл и туда поместить эту функцию, а потом прописать файл в хидере нужных шаблонов.
avatar
спасибо, что откликнулись, все верно речь о pre 0.3, шаблон обзывается new.
а потом прописать файл в хидере нужных шаблонов. 

вас не затруднит поподробнее расписать, как это сделать.
avatar
<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 оставит дизайн поля поиска и кнопки
avatar
не знаю (не смог пока что разобраться) с чем это связано, но по тегам-меткам поиск не совсем корректно происходит.

Проверял по определенному запрос, который находился только в метках публикации. И в результате по поиску я на данную публикацию (которую брал как пример) я не вышел. В чем может быть проблема, кто-нибудь сталкивался?
avatar
если посмотрите исходники, то данный поиск не ищет по тегам, а только по названию и тексту статьи.
avatar
Пробовал к новой сборке прикрутить, не получается, ругается
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
avatar
актуально
avatar
так я вроде бы поставил его на SVN(кажется 263)
все работает, как бы…
но вот интересно вбиваю в поиск, выгоняет список тем по искомому, нажимаю на название топика, и в момент до загрузки страницы с топиком, на доли секунды всплывает окно с «добавлением изображения»… странно. что я не так сделал, придется искать…

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

нельзя применить теги меняющие цвет и размер текста? только(<.b><./b>)?
  • Yuta
  • 0
avatar
Убираю
в файле /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'}

чтобы осталась работать функция вставки картинок в комментариях..?
  • Yuta
  • 0
avatar
в общем сам попросил, сам сделал, файлы под 274 сборку.
avatar
Прикручиваем поиск 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 скрипта специально добавлять не нужно.
Вроде ничего не забыл, если что поправьте меня.
Извиняюсь за портянку.
  • ALF
  • +2
avatar
Когда выставляешь часто встречающееся слово, и поиск выдает сразу несколько страниц, то с первой все ок, а нажимая 2-ю- получаю пустое окно и
Notice: Undefined index: q in Z:\home\ккк.ru\www\classes\actions\ActionSearch.class.php on line 53

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

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