Тема: Новый поиск для Strawberry 1.1.1 MySQL

Я оценил поиск для версий 1,1,х. И начал разбараться в файле show_search.php
хочется сделать поиск на базе 1,1,1 с выводом результатов как у 1,1,х

Чем удобно. Удобно тем, что не пишется инфа в файл data/search.txt из которого в последствии и беруться слова для поиска. Поиск 1,1,х ищет непосредственно в текстах базы MySQL. И результатов поиска гораздо больше выходит!!!

Теперь к вопросу. Я расковырял код. но есть одна загвоздка. Прошу взглянуть профессионалов. Может что и подскажете smile

<?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('&nbsp;', '<option value="{id}"[php]search_this_cat({id})[/php]>{prefix}{name}</option>'); ?></select></td>
</tr>
 <tr>
<td width="215"><nobr>За дату (год/месяц/день)</nobr>&nbsp;</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;
}

#####################################################

Хотя проверить и остальное не мешает smile

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Новый поиск для Strawberry 1.1.1 MySQL

Супер, а идея реализовалась? за 2 года

Strawberry 1.1.1

Re: Новый поиск для Strawberry 1.1.1 MySQL

В 1.2 я реализовал уже много идей.  Так же над поиском потрудился. Новая подсветка - которая не искажает вывод данных. (допустим если искомое слово есть в теге  alt изображения, то код вывода изображения будет валидным и не нарушен подсветкой слова...). Поиск непосредственно в базе. Новая листалка, которая подойдет для всех модулей (реализовано в функции). Сейчас сделаю чтоб форма была в шаблоне. И в планах сделать расширенный поиск. Что будет включать в себя поиск по одному любому слову или фразу целиком.

Еще простил запросы

$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)));

к одному.

Ну вот как то так...

Но если переписать запросы в базу и скопировать функцию подсветки - то и на 1.1.1 заработает...
Если надо, или найдется энтузиаст, то могу дать последнюю рабочую версию для переписывания...

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!