Модуль "живой поиск"
#21
Отправлено 19 December 2011 - 09:48 AM
Пример такого поиска тут
#22
Отправлено 19 December 2011 - 11:32 AM
Спасибо за тему. "Живой поиск" - нужная вещь. Все работает. Но хотелось бы чтобы кроме названия в выпадающем списке была миниатюра с изображением товара и цена. Подскажите пожалуйста как это сделать?
нужно в файле devsearch.php
код
$data = mysql_query("SELECT * from ".PRODUCTS_TABLE." where name like '%$q%' AND enabled = '1' or product_code LIKE '$q' order by productID" )
or die( db_error() );
while( $row = mysql_fetch_array( $data )){
if ( strpos( strtolower( $row['name'] ), $q ) !== false ) {
echo $row['name'] . "\n";
}
}
заменить на
if (!$q) return;
$data = mysql_query("SELECT * from ".PRODUCTS_TABLE." INNER JOIN ".PRODUCT_PICTURES." using(productID) where name like '%$q%' AND enabled = '1' or product_code LIKE '$q' order by productID" )
or die( db_error() );
while( $row = mysql_fetch_array( $data )){
if ( strpos( strtolower( $row['name'] ), $q ) !== false ) {
echo '<img width="50px" src="/data/small/'.$row['filename'].'">'.$row['name'] . "\n";
}
}
---------- Сообщение объединено ----------
хотя нет... фотку то оно выведет но потом вставляет ее кодом в поисковую строку ((
---------- Сообщение объединено ----------
сейчас занят.... позже разберусь - самому интересно
#23
Отправлено 19 December 2011 - 09:06 PM
#24
Отправлено 19 December 2011 - 09:21 PM
да, мой 1й вариант как раз под 3.0 (R2 даже) и работал. Там вроде ничего менять не нужно в запросе, структура не поменялась.Кто то реализовывал данную версию под ShopCMS 3.0.x???
#25
Отправлено 20 December 2011 - 05:41 PM
#26
Отправлено 20 December 2011 - 07:35 PM
Я в Вашем варианте заменил "прямой доступ" на функции из mysql.php, оно как-то идеологически правильнее. Хотя, конечно, при полном отстутствии других интерфейсов (к другим ля-ля-SQL) разницы никакой .да, мой 1й вариант как раз под 3.0 (R2 даже) и работал. Там вроде ничего менять не нужно в запросе, структура не поменялась.
У меня как раз в Эксплорере оно и работает. Так уж сложилось, что основной браузер. И дома, и на работе.У меня в Инет Экспрорере не пашет. В остальных работает.Не пойму что не так.
В общем, вот "мой" вариант. Т.е. калька с предыдущих с моими мелкими изменениями:
1. devsearch.php, лежит в корне. Это неправильно, но пока лежит там .
<?php
header("Content-Type: text/html;charset=windows-1251");
include("core/config/connect.inc.php");
include("core/includes/database/".DBMS.".php");
# нижеследующий iconv нужен если на:
# mysql> SHOW VARIABLES LIKE 'character_set_system';
# будет ответ
# character_set_system | utf8 |
# иначе просто закомментаренный вариант (и разбирайтесь сами ).
$q = iconv('UTF8','CP1251',strtolower($_GET["q"]));
#$q = strtolower($_GET["q"]);
db_connect(DB_HOST,DB_USER,DB_PASS) or die (db_error());
db_select_db(DB_NAME) or die (db_error());
$data = mysql_query("SELECT name from ".DB_PRFX."products where name like '%$q%' AND enabled = '1'" )
or die( db_error() );
db_disconnect();
while( $row = mysql_fetch_array( $data )){
echo $row['name']."\n";
}
?>
2. Цитата: "А в index.tpl.html заменил только class="pform" на id="targetDiv", оно там один раз встречается."
3. Цитата из исходного архива, вставил тупо, т.к. пока не понимаю: //В head.tpl.html
<!-- Autocomplete Formatting -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js" type="text/javascript"></script>
<script type='text/javascript' src='front/user/js/jquery.autocomplete.pack.js'></script>
<link rel="stylesheet" type="text/css" href="front/user/css/jquery.autocomplete.css" />
{literal}
<script type="text/javascript">
$().ready(function() {
$("#targetDiv").autocomplete("devsearch.php", {
max: 25,
highlight: false,
scroll: true,
scrollHeight: 400
});
$("#targetDiv").result(function (event, data, formatted)
{
$('#formpoisk').submit();
});
});
</script>
{/literal}
Насколько я помню, вот этих трех действий (понятно, что их было сильно больше, это конечная выжимка) мне хватило, чтобы оно заработало.
#27
Отправлено 21 December 2011 - 01:41 AM
ниже исправляем
while( $row = mysql_fetch_array( $data )){echo $row[name]."|".$row[product_code]."|".show_price($row[Price],5)."|".$row[filename]."\n";}
(вместо цифры 5 подберите свою в зависимости от валюты, вывод в которой нужен)
в js в функции автокомплита дописываем formatItem:liFormat,
и рядом добавляем еще одну функцию с желаемым форматированием, я сделал так
function liFormat (row, i, num) { var result = "<table cellpadding='0' cellspacing='0'><tr valign='middle'><td align='center' width='80' rowspan='2'><img border = '0' height= '70' vspace='2' hspace='2' title='" + row[0]+"' alt='"+row[1]+"' src='/data/small/"+row[3]+"'></td><td>"+row[0]+"</td></tr><tr><td>"+row[2]+"</td></tr></table>"; return result; }
Вроде ничего не упустил...
Свой код полностью не привожу, чтобы не запутать (он отличается переменными и по мелочам еще), но кому нужно, разберется
#28
Отправлено 21 December 2011 - 04:10 PM
#29
Отправлено 21 December 2011 - 04:12 PM
это типо как на розетке?
В финальном варианте - типо да.
#30
Отправлено 22 December 2011 - 04:04 PM
.
Свой код полностью не привожу, чтобы не запутать (он отличается переменными и по мелочам еще), но кому нужно, разберется
Два часа убил. Ничего не получается с выводом в результатах поиска с изображением и ценой. И вообще у меня только такой вариант devsearch работает правильно
<?php header('Content-type: text/html; charset=utf8'); $q = iconv('UTF-8', 'windows-1251', $_GET['q']); include("core/config/connect.inc.php"); include("core/includes/database/".DBMS.".php"); db_connect(DB_HOST,DB_USER,DB_PASS) or die (db_error()); db_select_db(DB_NAME) or die (db_error()); $q = strtolower( $_GET["q"] ); $_GET['q'] = str_replace('\\', '\\\\', $_GET['q']); $q = addCslashes($_GET['q'], '_%'); $q = mysql_real_escape_string ($q); if (!$q) return; mysql_query('set character set utf8'); mysql_query('set character_set_connection=utf8'); $query = "SELECT name, product_code FROM ".DB_PRFX."products WHERE (enabled = 1 AND (name LIKE '%$q%' OR product_code LIKE '%$q%')) LIMIT 25"; $result = mysql_query($query); $output_items = array(); while($row = mysql_fetch_array($result)){ $output_items[] = $row['name']; } print(implode("\n", $output_items)); mysql_close($con); ?>
Также непонятно где devsearch.php хранить. У меня он лежит в корне, но это как я понимаю неправильно.
#31
Отправлено 22 December 2011 - 04:22 PM
добавьте вверху require('core/functions/functions.php');
или include.
#32
Отправлено 22 December 2011 - 07:57 PM
Вот кто бы объяснил, зачем нужно применение этих функций в этом модуле.$_GET['q'] = str_replace('\\', '\\\\', $_GET['q']); $q = addCslashes($_GET['q'], '_%'); $q = mysql_real_escape_string ($q);
#33
Отправлено 22 December 2011 - 08:17 PM
PHP: str_replace - Manual
Функция addcslashes. Справочник функций PHP.
PHP.SU - mysql_real_escape_string()
#34
Отправлено 22 December 2011 - 08:32 PM
Хм... Видимо, я спросил какую-то херню? Иначе зачем бы мне давать пучок ссылок на описание известнейших функций, когда я спрашивал "зачем нужно применение этих функций в ЭТОМ модуле".Гугл не спрашивали ? Он много чего знает...
В принципе, меня вполне удовлетворит ответ: "Да, действительно надо менять двойные слэши на четверные и делать прочие замены еще двумя функциями для получения правильной выборки из SQL-базы". Но таки было бы интересно - а занахуа? Я пока причин для использования этих трех функций не вижу. Но тот, кто их вписал явно видел. Отсюда и возник вопрос. Вот странно, да?
Поскольку я не понимаю, зачем нужно применение этих функций - у меня их нет. И оно вполне работает. Но я таки не уверен. Может, ежели в названии товара два слэша будут, то эти функции застрелись как необходимы...
#35
Отправлено 22 December 2011 - 08:49 PM
имхо, там смысл имеет только mysql_real_escape_string, для защиты от иньекций. Остальное хз зачем.
---------- Сообщение объединено ----------
у меня в коде подключена core/functions/functions.php, и строка обработки запроса одна и выглядит так
$q = xEscSQL(trim(strtolower($_GET['q']))); Всё.
#36
Отправлено 22 December 2011 - 08:52 PM
у меня в коде подключена core/functions/functions.php, и строка обработки запроса одна и выглядит так
$q = xEscSQL(trim(strtolower($_GET['q']))); Всё.
Так а я о чем? У меня примерно так же. Спасибо, развеяли сомнения .
#37
Отправлено 24 December 2011 - 04:22 PM
#38
Отправлено 24 December 2011 - 10:28 PM
Учел все рекомендации, картинка и цена выводится, но Internet Explorer упорно не хочет работать. Вообще не появляется выпадающий список товаров. Не пойму в чем может быть дело?
проверьте css
#39
Отправлено 18 January 2012 - 07:38 AM
Полез в логи и вижу, что "PHP Warning: Cannot modify header information - headers already sent by..." Яндекс сообщил, что этой ошибке часто соответствует ситуация, когда ".
Особенно если в файле ни одного UTF-8 символа.
Похоже, это FAR постарался.
#40
Отправлено 18 January 2012 - 10:18 AM