Тема: Новый поиск для Strawberry 1.1.1 MySQL
Я оценил поиск для версий 1,1,х. И начал разбараться в файле show_search.php
хочется сделать поиск на базе 1,1,1 с выводом результатов как у 1,1,х
Чем удобно. Удобно тем, что не пишется инфа в файл data/search.txt из которого в последствии и беруться слова для поиска. Поиск 1,1,х ищет непосредственно в текстах базы MySQL. И результатов поиска гораздо больше выходит!!!
Теперь к вопросу. Я расковырял код. но есть одна загвоздка. Прошу взглянуть профессионалов. Может что и подскажете ![]()
<?php
/**
* @package Show
* @access private
*/
include_once 'head.php';
$search = replace_all_sucks($search, false);
$search = htmlspecialchars($search);
$first = $sql->select(array('table' => 'news', 'orderby' => array('date', 'ASC'), 'limit' => array(0, 1)));
$last = $sql->select(array('table' => 'news', 'orderby' => array('date', 'DESC'), 'limit' => array(0, 1)));
$sday[] = '';
for ($i = 1; $i < 32; $i++){
$sday[$i] = $i;
}
$smonth[] = '';
for ($i = 1; $i < 13; $i++){
$smonth[$i] = $i;
}
$syear[] = '';
for ($i = date('Y', $first[0]['date']); $i <= date('Y', $last[0]['date']); $i++){
$syear[$i] = $i;
}
?>
<!-- КОД ПОИСКА / НАЧАЛО / МОЖНО НАЧАТЬ ВЫДЕЛЕНИЕ ДЛЯ КОПИРОВАНИЯ -->
<table width="400" border="0" cellspacing="0" cellpadding="0" class=text align=center>
<form method="get" action="<?=$_SERVER['PHP_SELF']; ?>">
<input name="do" type="hidden" value="search">
<tr>
<td width="215">Поиск (не менее 3-х символов)</td>
<td width="185"><nobr><input class=regtext type="text" name="search" size="20" value="<?=$search; ?>"> </nobr></td>
</tr>
<tr>
<td width="215">В категории</td>
<td><select class=regtext size="1" name="category"><option value="">Во всех</option><?=category_get_tree(' ', '<option value="{id}"[php]search_this_cat({id})[/php]>{prefix}{name}</option>'); ?></select></td>
</tr>
<tr>
<td width="215"><nobr>За дату (год/месяц/день)</nobr> </td>
<td><?=makeDropDown($syear, 'year', $year); ?>/<?=makeDropDown($smonth, 'month', $month); ?>/<?=makeDropDown($sday, 'day', $day); ?></td>
</tr>
<tr>
<td colspan="2"><input class=gbadd type="submit" value=" поиск "></td>
</tr>
</form>
</table>
<!-- КОД ПОИСКА / КОНЕЦ / МОЖНО ЗАКОНЧИТЬ ВЫДЕЛЕНИЕ И КОПИРОВАТЬ -->
<?
@ignore_user_abort(true);
@set_time_limit(600);
add_filter('news-where', 'search');
if (strlen($search) < 3)
{
if ($search) { echo '<div class="moder">'.t('<br><br>Запрос должен состоять минимум из 3 (трёх!) знаков.').'</div>'; }
}
else
{
#####################################################
$query = $sql->select(array('table' => 'news', 'join' => array('table' => 'story', 'where' => 'id = post_id')));
foreach ($query as $row)
{
$words = replace_all_sucks($row['title'].' '.$row['short'].' '.$row['full']);
$words = array_unique($words);
}
$result = array();
if (in_array(trim($word), explode(' ', $search)))
{
$result[] = $post_id;
}
#####################################################
if (!$result)
{
echo '<div class="moder">'.t('<br><br>Этого здесь точно нет!').'</div>';
}
else
{
$result = array_unique($result);
add_filter('news-entry-content', 'highlight_search', 999);
function highlight_search($output){
global $search;
$output = formattext($search, $output);
return $output;
}
add_filter('news-where', 'show_search');
function show_search($where)
{
global $result;
$where[] = 'id ? ['.join('|', $result).']';
$where[] = 'and';
return $where;
}
$template = 'Search';
include rootpath.'/show_news.php';
}
}
function need_mooore(&$item1, $key) { if (strlen($item1) < 3) {$item1 = ''; } }
/**
* Подсвечивает $whatfind в $text
*
* @link http://forum.dklab.ru/php/heap/AllocationOfResultInNaydenomAPieceOfTheText.html
*
* @param string $whatfind Искомое слово
* @param string $text Текст, в котором проводится поиск
* @return string
*/
function formattext($whatfind, $text){
$pos = @strpos(strtoupper($text), strtoupper($whatfind));
$otstup = 200; // кол-во символов при выводе результата
$result = '';
if ($pos !== false){ //если найдена подстрока
if ($pos < $otstup){ //если встречается раньше чем первые N символов
$result = substr($text, 0, $otstup * 2); //то результат подстрока от начала и до N-го символа
$result = eregi_replace($whatfind, '<span class="hilite">'.$whatfind.'</span>', $result);
} else {
$start = $pos-$otstup;
//то результат N символов от совпадения и N символов вперёд
$result = '...'.substr($text, $pos-$otstup, $otstup * 2).'...';
// выделяем
$result = eregi_replace($whatfind, '<span class="hilite">'.$whatfind.'</span>', $result);
}
} else {
$result = substr($text, 0, $otstup * 2);
}
return $result;
}
function replace_all_sucks($text, $array_walk = true){
$text = strip_tags($text);
$text = str_replace("\r\n", '', $text);
// $text = preg_replace('/\W/', ' ', $text);
$text = preg_replace('/[^АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIKLMNOPQRSTUVWXYZабвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghiklmnopqrstuvwxyz]/s', ' ', $text);
// $text = strtolower($text);
$text = strtr($text, "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIKLMNOPQRSTUVWXYZ", "абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghiklmnopqrstuvwxyz");
if ($array_walk){
$text = explode(' ', $text);
array_walk($text, 'need_mooore');
}
return $text;
}
function search_this_cat($id){
global $category;
return ($id == $category ? ' selected' : '');
}
?>Непосредственно надо исправить кусок
#####################################################
$query = $sql->select(array('table' => 'news', 'join' => array('table' => 'story', 'where' => 'id = post_id')));
foreach ($query as $row)
{
$words = replace_all_sucks($row['title'].' '.$row['short'].' '.$row['full']);
$words = array_unique($words);
}
$result = array();
if (in_array(trim($word), explode(' ', $search)))
{
$result[] = $post_id;
}
#####################################################Хотя проверить и остальное не мешает ![]()
Демо площадка Strawberry 1.2 - заходим и тестируем!