Регистрация
Вход через соцсети
Восстановление пароля

Помагите с поиском

Новый топик
12.10.2012, 10:00
Ответить | Цитировать
Гость
Гость

netcat 4.7 не работает стандартная выборка по названию товара если в названии есть символ "+" (например "Комплект (шина + цепь)") подскажите пожалуйста как поправить
18.10.2012, 15:00
Ответить | Цитировать
MipH
Спирин Дмитрий
MipH

Зарегистрирован:
2004-12-22
Сообщений: 252

Что еще за стандартная выборка?..

bbzone@gmail.com | bbz.ru | miph.info | miph.ru
Вы можете обратиться ко мне, если необходима разработка функционала на NetCat
18.10.2012, 16:39
Ответить | Цитировать
Гость
Гость

Стандартный поиск
18.10.2012, 16:44
Ответить | Цитировать
MipH
Спирин Дмитрий
MipH

Зарегистрирован:
2004-12-22
Сообщений: 252

Полагаю, причина в http://http11.ru/post.php?post=14

bbzone@gmail.com | bbz.ru | miph.info | miph.ru
Вы можете обратиться ко мне, если необходима разработка функционала на NetCat
18.10.2012, 17:01
Ответить | Цитировать
Гость
Гость

меняет "+" на '%2B'
19.10.2012, 17:45
Ответить | Цитировать
Гость
Гость

а где это все правится?
20.10.2012, 01:40
Ответить | Цитировать
MipH
Спирин Дмитрий
MipH

Зарегистрирован:
2004-12-22
Сообщений: 252

Я глубоко не копал, но кажется мне, что это проблема в неткете.
Дело в том, что неткет ПЕРЕОПРЕДЕЛЯЕТ стандартный массив $_GET в файле nc_input.class.php
Код:
    // validate query parameter
if ( is_array($parsed_url) && array_key_exists('query', $parsed_url) && $parsed_url['query']) {
parse_str($parsed_url['query'], $parsed_query_arr);
// validate
$parsed_query_arr = $this->clear_system_vars($parsed_query_arr);
// in error_document $_GET is empty, so set them at this line
$_GET = $parsed_query_arr ? $parsed_query_arr : array();
}


Функция parse_str выглядит так:
Код:
    static function parse_str($query)
{
if ($query === null) {
return null;
}

$parts = explode('&', $query);

$new_parts = array();
for ($i = 0; $i < count($parts); $i++) {
$pair = explode('=', $parts[$i]);

if (count($pair) != 2) {
continue;
}

list($key, $value) = $pair;
$new_parts[urldecode($key)] = urldecode($value);
}

return $new_parts;
}


Однако, в мануале PHP четко написано, что массив _GET НЕ НАДО urldecode'ить, он это делает автоматически.

Получается, что над параметром 2 раза производится операция urldecode, первая конвертирует закодированный знак %2B обратно в знак +, а вторая как раз уже знак + в пробел.

Поэтому ваша строка с плюсом превращается в строку с пробелом.

Если вы используете какой-то кастомный поиск через системные настройки шаблона, просто возьмите аккуратно (с экранирование кавычек, если у вас вдруг выключены magic_quote_gpc) нужны вам параметр из массива $_REQUEST, он неткетовцами не портится вроде как.

Ну а вообще эта задача чисто для саппорта неткета, пусть разбираются.

bbzone@gmail.com | bbz.ru | miph.info | miph.ru
Вы можете обратиться ко мне, если необходима разработка функционала на NetCat
29.10.2012, 10:56
Ответить | Цитировать
Гость
Гость

когда-нибудь, как-нибудь исправят
29.10.2012, 22:14
Ответить | Цитировать
dimidroll
Егоровых Дмитрий
dimidroll

Зарегистрирован:
2007-10-05
Сообщений: 81

Если вам нужен простой поиск в каталоге, гляньте здесь осуществил поиск по 3 полям в таблице, в вашем случае задача упрощается. Если интересно, могу предложить свой вариант реализации с морфологическим анализом, если можно так назватьулыбка - проще говоря находит корни слов в введенной строке поиска, формирует запрос и выдает результат. В вашем случае (например "Комплект (шина + цепь)" - вырежет лишние символы, оставит комплект шин цеп - отсюда сформирует запрос вида " and Name LIKE %комплект%шин%цеп%"

ася - 97336016
198 196 2012-10-29 22:14:42 12668
Описание проекта