Перейти к содержимому


Модуль "живой поиск"


  • Закрытая тема Тема закрыта
Сообщений в теме: 57

#41 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 18 January 2012 - 10:48 AM

BOM это всем известные грабли... некоторые редакторы добавляют его.... так что ничего собственно нового ))
  • 0

#42 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 January 2012 - 11:34 AM

Сорри за оффтоп, а зачем вообще пользоваться FAR-ом ? в RapidPHP есть встроенный фтп менеджер, да и сам софт стоит сейчас 30 грн (106 рублей), я недавно писал в какой-то ветке...

Да просто привык я к нему за много лет. Все кнопочки знакомы, жмутся уже на автомате и быстро, подсветка синтаксиса не хуже. А еще больше привык к консольному интерфейсу и отсутствию мышки, наверное :). Rapid у меня есть, купленный. Как раз по тому совету, спасибо. Но пока что-то не торкнуло, только как "просмотр HTML-кода" в Эсплорере использую. Наверное, если к нему довесить виндовый LAMP (или хотя бы виндовый PHP), то получится некое подобие визивига и оно будет удобнее ФАРа, но мне пока лень.

---------- Сообщение объединено ----------

PS. Кстати, я тут в поисках очередных граблей. Не может ли "досовский" CRLF в концах строк вместо линуксового LF влиять на исполнение ява-скрипта для этого модуля? А то у меня тут какие-то очередные расчудесные грабли :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#43 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 18 January 2012 - 11:47 AM

хм....

Замена LF на CRLF
При добавлении проекта в git-репозиторий, последний заругался на файл reset.css, взятый мной где-то на бескрайних просторах интернета: fatal: LF would be replaced by CRLF in ...

Не устроило его, что переносы строк были в Unix-формате, так как дело происходило под Windows. Очень просто конвертировать переносы строк в Windows-формат помогает текстовый редактор Notepad++: Правка>EOL конверсия>Преобразовать в WIN-формат.

Взято отсюда.

Насчет git-репозитория: хорошо, если это был один файл, но что делать, если файлов много, и они вперемешку, unix и win? Самое простое, что можно сделать - отключить проверку формата:

$ git config --global core.autocrlf false
$ git config --global core.safecrlf false



---------- Сообщение объединено ----------

PS. Кстати, я тут в поисках очередных граблей. Не может ли "досовский" CRLF в концах строк вместо линуксового LF влиять на исполнение ява-скрипта для этого модуля? А то у меня тут какие-то очередные расчудесные грабли


Я так понимаю что может.... ява скрипт выполняется же на стороне клиента и если ты по юниксом а переносы виндовые то не воспримет их - хотя разве в яве скрипт вообще играют роль переносы?
  • 0

#44 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 January 2012 - 04:14 PM

В общем, оно заработало "само". Думаю, я просто привык наконец после КАЖДОГО изменения чистить кэш ручками. Ибо класть оно хотело на галочку "чистить кэш" в конфиге и прекрасно создает в кэше файл %%бла-бла-бла-head.tpl.html.php. И не менее прекрасно отдает его потом вместо head.tpl.html, который я редактирую.

Я так понимаю что может.... ява скрипт выполняется же на стороне клиента и если ты по юниксом а переносы виндовые то не воспримет их - хотя разве в яве скрипт вообще играют роль переносы?

Сижу и медитирую на кусочек кода из этого треда. Это работающий вариант
  $("#targetDiv").result(function (event, data, formatted)
    {
    $('#formpoisk').submit();
а это не работающий. всего лишь фигурная скобка перенесена на предыдущую строку, т.е. убран перевод строки и пара пробелов. Два раза проверил. Сижу в задумчивости :).
  $("#targetDiv").result(function (event, data, formatted) {
    $('#formpoisk').submit();


---------- Сообщение объединено ----------

у меня в коде подключена core/functions/functions.php, и строка обработки запроса одна и выглядит так
$q = xEscSQL(trim(strtolower($_GET['q']))); Всё.

Я тут случайно сообразил, что strtolower совершенно незачем, т.к. LIKE в SQL-запросе регистронезависим.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#45 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 18 January 2012 - 04:20 PM

Сижу и медитирую на кусочек кода из этого треда. Это работающий вариант
Код:
$("#targetDiv").result(function (event, data, formatted)
{
$('#formpoisk').submit();
а это не работающий. всего лишь фигурная скобка перенесена на предыдущую строку, т.е. убран перевод строки и пара пробелов. Два раза проверил. Сижу в задумчивости .
Код:
$("#targetDiv").result(function (event, data, formatted) {
$('#formpoisk').submit();



Крайне странно... и как-то мало верится
проверь еще раз, ведь оптимизированный яваскприпт всегда идет одной строкой даже без пробелов..... так что - где-то тут не что.
  • 0

#46 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 January 2012 - 06:46 PM

Крайне странно... и как-то мало верится
проверь еще раз, ведь оптимизированный яваскприпт всегда идет одной строкой даже без пробелов..... так что - где-то тут не что.

Правильно не верится :). Проверил третий раз (меняем работающий вариант на "не работащий", запускаем скриптик удаления кэша, жмем F5 в эксплорере, чтобы подсосать обновленный head.ptl.html) и нате вам! Все работает. Ладно, спишем на то, что я до того делал все вручную без скриптика и мог что-то пропустить.

Для поддержания треда. Решил я вывести в выпадающем списке не только названия, а код-название-цена (идея с картинкой мне не нравится как ресурсоемкая и бессмысленная, типа облака тэгов). Приведенный Dbus разделитель "|" отпал сразу. Почему-то конструкция
while( $row = db_fetch_assoc( $data ))
{echo $row[product_code]."|".$row[name]."|".show_price($row[Price])."\n";}
выводила только product_code. Заменил на двоеточия - стало выводить нормально. Странно. Вроде, "|" никакой не спецсимвол. Но вопрос не в этом. Вот конструкция:
while( $row = db_fetch_assoc( $data ))
{echo $row[product_code]." : ".str_pad($row[name],20).": ".show_price($row[Price])."\n";}
Чего я такого упустил, в чем лоханулся, что $row[name] ни хрена не добивается пробелами до 20-ти символов, а так в выпадающем списке и выводится, как будто функции str_pad там и в помине нет или я где-то последующую функцию trim не заметил?

PS. А есть возможность задать шрифт? А то от str_pad толку чуть, если не моноширинный шрифт использовать. Хотя подозреваю, что правильным решением будет делить выпадающий список на три секции и выводить в каждую свое - код, наименование, цену. Тогда вне зависимости от шрифта они будут выровняны. Но пока не знаю, как это сделать. CSS?
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#47 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 18 January 2012 - 07:00 PM

форматирование задается в функции liFormat. ну и + css.
  • 0
502 Bad Gateway

#48 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 January 2012 - 07:21 PM

форматирование задается в функции liFormat. ну и + css.

Спасибо тебе, добрый фей.
Увы, пока не в коня корм. Но я стараюсь :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#49 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 18 January 2012 - 07:32 PM

Спасибо тебе, добрый фей.
Увы, пока не в коня корм. Но я стараюсь :).


Не прибедняйся :)
Массив выводит список переменных и по большому счету пофиг что там за разделитель, | или еще что...
А вот как все это выглядит - описывается в js в функции. процитирую себя :) http://vsupport.club...dpost__p__14594

и там уже таблице можно задавать стили, шрифты и тд.

---------- Сообщение объединено ----------

А насчет картинок ты зря, визуально сразу понятно тот товар или нет, а нагрузки особой я не заметил, особенно если в базе поставить лимит на выборку, 30 или 50. Больше искать все равно смысла нет.
  • 0
502 Bad Gateway

#50 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 19 January 2012 - 08:43 AM

Массив выводит список переменных и по большому счету пофиг что там за разделитель, | или еще что...

Я понимаю, что это банальная текстовая строка :). Однако у меня все, что дальше символа "|" в выпадающем списке отсутствует, а пробелы куда-то профукиваются. Причем не все, по одному таки остается.
while( $row = db_fetch_assoc( $data ))
{echo $row['product_code']." : ".show_price($row['price'])." | ".$row['thumbnail']." : ".$row['name']."\n";
fwrite($f,$row['product_code']." : ".show_price($row['price'])." | ".$row['thumbnail']." : ".$row['name']."\n");}

в результате этого кода я получаю в файле
AA0020 : 6420 | 1326531288613662.jpg : Digma S602W
в выпадающем меню
AA0020 : 6420
в форме поиска после выбора этой стоки из выпадающего меню
AA0020 : 6420
явно там где-то заныкана функция форматирования, удаляющая сдвоенные пробелы и обрезающая все после |.

А вот как все это выглядит - описывается в js в функции. процитирую себя :) http://vsupport.club...5.html#post6752
и там уже таблице можно задавать стили, шрифты и тд.

"в js в функции автокомплита дописываем formatItem:liFormat,
и рядом добавляем еще одну функцию с желаемым форматированием" - вот из этой фразы я понял только про желаемое форматирование.
"в функции автокомплита" - это куда? "рядом" - это где? :)
Похоже, надо что-то начальное по яве почитать.

---------- Сообщение объединено ----------

Тьфу ты йопт... "И открылось ему сокровенное...." :)
Ты пишешь про модуль, выложенный admin-ом, где есть liFormat, а я пляшу от выложенного тобой (?) кусочка
{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}

  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#51 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 19 January 2012 - 09:01 PM

badisoft, так это было в самом начале :) а потом кто-то задал вопрос про вывод с картинками и мы совместными усилиями слепили обновленную версию, R.Sergey начал, я продолжил - с нее и цитировал. Админ как я понимаю, просто отделил зерна от плевел и выложил в новой теме.
  • 0
502 Bad Gateway

#52 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 20 January 2012 - 07:02 AM

Админ как я понимаю, просто отделил зерна от плевел и выложил в новой теме.

Очень маловероятно. Логика абсолютно разная. В предложенном Вами варианте на каждый набор строки поиска происходит вызов devsearch.php и ява-скрипту возвращается небольшая (!) выборка, соответствующая запросу. Тем меньше, чем длиннее искомая строка. Но на каждую дописанную-удаленную буковку запрос делается снова. В варианте из соседнего треда (я там привел кусок исходника) запрос делается один раз, но по всему товарному контенту, результат передается ява-скрипту, который уже из полученного результата каждый раз отсортировывает только подходящее под строку поиска.
Там СОВСЕМ другой модуль, хотя внешне похож, конечно :).

---------- Сообщение объединено ----------

явно там где-то заныкана функция форматирования, удаляющая сдвоенные пробелы и обрезающая все после |.

autocomplete.js:
cellSeparator – символ, который разделяет «ячейки» в строках данных, возвращаемых сервером. (По умолчанию: «|»).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#53 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 20 January 2012 - 10:31 AM

Мне так кажется, ты не в ту сторону копаешь или неправильно выделил нужные куски в теме :) Выложи код который у тебя сейчас, вместе и пофиксим.
  • 0
502 Bad Gateway

#54 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 20 January 2012 - 10:54 AM

Да все имеющиеся вопросы как-то неудобно задавать, т.к. "процесс пошел", дальше могу и сам разобраться. С "|" разобрался, с liFormat разобрался (просто нашел описания на autocomplete.js и на jquery - ее суть и описание функций). На текущий момент наибольшее непонимание у меня вызывает мелочь и ерунда - некий белый белый прямоугольник, возникающий в самом начале выпадающего списка, если использовать autocomplete.js. Такое впечатление, что там должна быть какая-то реклама, но ее там нет, белое поле :). В описании ключевых слов ничего про него не нашел, при использовании другого модуля (jquery.autocomplete.pack.js) этого квадрата нет. Правда, и набор свойств там частично другой по названиям, описание не искал еще.

devsearch.php вот, он уже устоялся, а вставку в head.tpl.html я постоянно редактирую, нечего выкладывать :):
<?php
header("Content-Type: text/html;charset=windows-1251");
require_once "core/config/connect.inc.php";
require_once "core/includes/database/".DBMS.".php";
require_once "core/functions/functions.php";

db_connect(DB_HOST,DB_USER,DB_PASS) or die (db_error());
db_select_db(DB_NAME) or die (db_error());
$q = xEscSQL (iconv('UTF8','CP1251',$_GET["q"]));
$data = db_query("select t1.product_code,t1.name,t1.price,t2.filename
from ".DB_PRFX."products t1,".DB_PRFX."product_pictures t2
where t1.name like '%$q%'
and t1.productID = t2.productID
and enabled = '1'
limit 20")
# этот селект для выборки всего товара без LIKE
#$data = db_query("select t1.product_code,t1.name,t1.price,t2.filename
# from ".DB_PRFX."products t1,".DB_PRFX."product_pictures t2
# where t1.productID = t2.productID and enabled = '1'")
or die( db_error() );
while( $row = db_fetch_assoc( $data ))
{echo $row['name']."|".$row['product_code']."|".show_price($row['price'])."|".$row['filename']."\n";}
db_disconnect();
?>

И мне почему-то не удалось заставить autocomplete.js делать запрос к серверу КАЖДЫЙ раз. Даже при cacheLength:1.
в отличие от jquery.autocoplete.pack.js
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#55 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 20 January 2012 - 08:37 PM

В общем, отказался я от autocomplete.js из почти одноименного треда (какой-то он таки глючный) в пользу jquery.autocomplete.pack.js из этого треда, хотя он и более младшей версии. Благо, по факту оказалось, что ключевые слова (опции) там те же. Это меня опция max попутала, нет такой в описании. Вставка в head.tpl.html выглядит так (сопирайт на liFormat - DBus):
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js" type="text/javascript"></script>
<script type='text/javascript' src='data/{$smarty.const.TPL}/jquery.autocomplete.pack.js'></script>
<link rel="stylesheet" type="text/css" href="data/{$smarty.const.TPL}/jquery.autocomplete.css" />
{literal}
<script type="text/javascript">
$().ready(function() {

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;
 }

$("#targetDiv").autocomplete("devsearch.php", {
 max: 30,
 highlight: false,
 scroll: true,
 scrollHeight: 600,
 width:250,
 formatItem:liFormat
 });

$("#targetDiv").result(function () {
 $('#formpoisk').submit(); 
 });
});
</script>
{/literal}
devsearch.php я только что публиковал, он почти не отличается, но можно скачать архив со всем набором и инструкцией:
[ATTACH]298[/ATTACH]
А тут можно посмотреть, как оно выглядит.
Наберите, например, pocket и посмотрите, как выглядит результат работы модуля.
Ну чем не офигенный модуль за 15 баксов? :)

PS. Сцуко. Забыл таки. i и num в параметрах функции - лишние. Не нужны. Удалить. На работоспособность не влияет но "неоптимальненько".
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#56 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 20 January 2012 - 09:21 PM

Йопта! В модуль вкралась досадная реклама моей лавки в виде названия. Не со зла, а по ошибке. Вот модуль без нее.

Прикрепленные файлы

  • Прикрепленный файл  LiveSearch.rar   12.82К   1 Количество загрузок:

  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#57 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 21 January 2012 - 05:41 PM

Что-то мне не нравится функция show_price в devsearch.php. Получается один SQL-запрос на все желаемое, а затем каждый вызов show_price это еще один SQL-запрос, а вызовов может быть до тридцати (LIMIT 30).

---------- Сообщение объединено ----------

Кстати, при использовании выложенного тут кем-то jquery.autocomplete.pack.js полностью запрос выглядит примерно так - devsearch.php?q=poisk&limit=30×tamp=1327159130257. Т.е. можно LIMIT ХХ не задавать жестко в devsearch.php, а использовать заданное в ява-скрипте max:ХХ (видимо, это укороченный вариант maxItemsToShow). А вот autocomplete.js засылает только devsearch.php?q=poisk
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#58 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 13 April 2012 - 11:52 AM

Более актуальная версия модуля "Живой поиск" здесь >> Живой поиск
  • 0