Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Вы не зашли.

#1 2010-05-04 01:24:52

Live
Участник
Зарегистрирован: 2009-12-04
Сообщений: 181
Рейтинг :   

jQuery Autocomplete

Хочу прикрутить этот плагин (плагин автозаполнения, примерно как у яндекса или гугла) к форме поиска, но столкнулся с проблемой.

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

т.к. меня интересуют названия новостей как фразы для автозаполнения, можно ли как то все значения названия новостей заносить в файл, который потом использовать как базу? что бы не было лишних запросов к базе. мои познания в пхп не очень глубокие, сам не могу это реализовать. в атаче архив с примером плагина, может кто нибудь помочь адаптировать его к ng? или сделать в виде плагина для NG

описание плагина брал отсюда http://www.linkexchanger.su/2008/39.html

Не в сети

#2 2010-05-04 10:08:14

KhadeR
Участник
Зарегистрирован: 2009-09-16
Сообщений: 207
Рейтинг :   17 

Re: jQuery Autocomplete

Плагин выберает не заголовки новостей, а список тегов. Делал для себя уже давно, так что берите...
_______________________________________________________________________________________

Необходимо также настроить стили CSS:

.autocomplete-w1{position:absolute;top:0px;left:0px;margin:8px 0 0 7px;/* IE6 fix: */_background:none;_margin:0;}
.autocomplete {border:1px solid #202020;background:#313131;cursor:default;text-align:left;max-height:350px;overflow:auto;margin:-6px 6px 6px -6px;/* IE6 specific: */_height:350px;_margin:0;_overflow-x:hidden;}
.autocomplete .selected{background:#202020;color:#f69b26;}
.autocomplete div{padding:2px 5px; white-space:nowrap;}
.autocomplete strong{font-weight:normal;color:#b5ee0c;}

А вот и вом код JS:

/* Autocomplete*/
(function(d){function l(b,a,c){a="("+c.replace(m,"\\$1")+")";return b.replace(new RegExp(a,"gi"),"<strong>$1</strong>")}function i(b,a){this.el=d(b);this.el.attr("autocomplete","off");this.suggestions=[];this.data=[];this.badQueries=[];this.selectedIndex=-1;this.currentValue=this.el.val();this.intervalId=0;this.cachedResponse=[];this.onChangeInterval=null;this.ignoreValueChange=false;this.serviceUrl=a.serviceUrl;this.isLocal=false;this.options={autoSubmit:false,minChars:1,maxHeight:300,deferRequestBy:0, width:0,highlight:true,params:{},fnFormatResult:l,delimiter:null,zIndex:9999};this.initialize();this.setOptions(a)}var m=new RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\)","g");d.fn.autocomplete=function(b){return new i(this.get(0)||d("<input />"),b)};i.prototype={killerFn:null,initialize:function(){var b,a,c;b=this;a=Math.floor(Math.random()*1048576).toString(16);c="Autocomplete_"+a;this.killerFn=function(e){if(d(e.target).parents(".autocomplete").size()===0){b.killSuggestions(); b.disableKillerFn()}};if(!this.options.width)this.options.width=this.el.width();this.mainContainerId="AutocompleteContainter_"+a;d('<div id="'+this.mainContainerId+'" style="position:absolute;z-index:9999;"><div class="autocomplete-w1"><div class="autocomplete" id="'+c+'" style="display:none; width:300px;"></div></div></div>').appendTo("body");this.container=d("#"+c);this.fixPosition();window.opera?this.el.keypress(function(e){b.onKeyPress(e)}):this.el.keydown(function(e){b.onKeyPress(e)});this.el.keyup(function(e){b.onKeyUp(e)}); this.el.blur(function(){b.enableKillerFn()});this.el.focus(function(){b.fixPosition()})},setOptions:function(b){var a=this.options;d.extend(a,b);if(a.lookup){this.isLocal=true;if(d.isArray(a.lookup))a.lookup={suggestions:a.lookup,data:[]}}d("#"+this.mainContainerId).css({zIndex:a.zIndex});this.container.css({maxHeight:a.maxHeight+"px",width:a.width})},clearCache:function(){this.cachedResponse=[];this.badQueries=[]},disable:function(){this.disabled=true},enable:function(){this.disabled=false},fixPosition:function(){var b= this.el.offset();d("#"+this.mainContainerId).css({top:b.top+this.el.innerHeight()+"px",left:b.left+"px"})},enableKillerFn:function(){d(document).bind("click",this.killerFn)},disableKillerFn:function(){d(document).unbind("click",this.killerFn)},killSuggestions:function(){var b=this;this.stopKillSuggestions();this.intervalId=window.setInterval(function(){b.hide();b.stopKillSuggestions()},300)},stopKillSuggestions:function(){window.clearInterval(this.intervalId)},onKeyPress:function(b){if(!(this.disabled|| !this.enabled)){switch(b.keyCode){case 27:this.el.val(this.currentValue);this.hide();break;case 9:case 13:if(this.selectedIndex===-1){this.hide();return}this.select(this.selectedIndex);if(b.keyCode===9)return;break;case 38:this.moveUp();break;case 40:this.moveDown();break;default:return}b.stopImmediatePropagation();b.preventDefault()}},onKeyUp:function(b){if(!this.disabled){switch(b.keyCode){case 38:case 40:return}clearInterval(this.onChangeInterval);if(this.currentValue!==this.el.val())if(this.options.deferRequestBy> 0){var a=this;this.onChangeInterval=setInterval(function(){a.onValueChange()},this.options.deferRequestBy)}else this.onValueChange()}},onValueChange:function(){clearInterval(this.onChangeInterval);this.currentValue=this.el.val();var b=this.getQuery(this.currentValue);this.selectedIndex=-1;if(this.ignoreValueChange)this.ignoreValueChange=false;else b===""||b.length<this.options.minChars?this.hide():this.getSuggestions(b)},getQuery:function(b){var a;a=this.options.delimiter;if(!a)return d.trim(b);b= b.split(a);return d.trim(b[b.length-1])},getSuggestionsLocal:function(b){var a,c,e,g,f;c=this.options.lookup;e=c.suggestions.length;a={suggestions:[],data:[]};b=b.toLowerCase();for(f=0;f<e;f++){g=c.suggestions[f];if(g.toLowerCase().indexOf(b)===0){a.suggestions.push(g);a.data.push(c.data[f])}}return a},getSuggestions:function(b){var a,c;if((a=this.isLocal?this.getSuggestionsLocal(b):this.cachedResponse[b])&&d.isArray(a.suggestions)){this.suggestions=a.suggestions;this.data=a.data;this.suggest()}else if(!this.isBadQuery(b)){c= this;c.options.params.query=b;d.get(this.serviceUrl,c.options.params,function(e){c.processResponse(e)},"text")}},isBadQuery:function(b){for(var a=this.badQueries.length;a--;)if(b.indexOf(this.badQueries[a])===0)return true;return false},hide:function(){this.enabled=false;this.selectedIndex=-1;this.container.hide()},suggest:function(){if(this.suggestions.length===0)this.hide();else{var b,a,c,e,g,f,j,k;b=this;a=this.suggestions.length;e=this.options.fnFormatResult;g=this.getQuery(this.currentValue); j=function(h){return function(){b.activate(h)}};k=function(h){return function(){b.select(h)}};this.container.hide().empty();for(f=0;f<a;f++){c=this.suggestions[f];c=d((b.selectedIndex===f?'<div class="selected"':"<div")+' title="'+c+'">'+e(c,this.data[f],g)+"</div>");c.mouseover(j(f));c.click(k(f));this.container.append(c)}this.enabled=true;this.container.show()}},processResponse:function(b){var a;try{a=eval("("+b+")")}catch(c){return}if(!d.isArray(a.data))a.data=[];if(!this.options.noCache){this.cachedResponse[a.query]= a;a.suggestions.length===0&&this.badQueries.push(a.query)}if(a.query===this.getQuery(this.currentValue)){this.suggestions=a.suggestions;this.data=a.data;this.suggest()}},activate:function(b){var a,c;a=this.container.children();this.selectedIndex!==-1&&a.length>this.selectedIndex&&d(a.get(this.selectedIndex)).removeClass();this.selectedIndex=b;if(this.selectedIndex!==-1&&a.length>this.selectedIndex){c=a.get(this.selectedIndex);d(c).addClass("selected")}return c},deactivate:function(b,a){b.className= "";if(this.selectedIndex===a)this.selectedIndex=-1},select:function(b){var a;if(a=this.suggestions[b]){this.el.val(a);if(this.options.autoSubmit){a=this.el.parents("form");a.length>0&&a.get(0).submit()}this.ignoreValueChange=true;this.hide();this.onSelect(b)}},moveUp:function(){if(this.selectedIndex!==-1)if(this.selectedIndex===0){this.container.children().get(0).className="";this.selectedIndex=-1;this.el.val(this.currentValue)}else this.adjustScroll(this.selectedIndex-1)},moveDown:function(){this.selectedIndex!== this.suggestions.length-1&&this.adjustScroll(this.selectedIndex+1)},adjustScroll:function(b){var a,c,e;a=this.activate(b).offsetTop;c=this.container.scrollTop();e=c+this.options.maxHeight-25;if(a<c)this.container.scrollTop(a);else a>e&&this.container.scrollTop(a-this.options.maxHeight+25);this.el.val(this.getValue(this.suggestions[b]))},onSelect:function(b){var a,c;a=this.options.onSelect;c=this.suggestions[b];b=this.data[b];this.el.val(this.getValue(c));d.isFunction(a)&&a(c,b,this.el)},getValue:function(b){var a, c;a=this.options.delimiter;if(!a)return b;c=this.currentValue;a=c.split(a);if(a.length===1)return b;return c.substr(0,c.length-a[a.length-1].length)+b}}})(jQuery)

Не в сети

#3 2010-05-04 18:03:57

Live
Участник
Зарегистрирован: 2009-12-04
Сообщений: 181
Рейтинг :   

Re: jQuery Autocomplete

KhadeR, не работает sad
в шаблоне плагина выбрал поле с нужным айдишником, выбрал в настройках плагина что бы он брал шаблон плагина - не работает  sad

Не в сети

#4 2010-05-07 00:15:58

Live
Участник
Зарегистрирован: 2009-12-04
Сообщений: 181
Рейтинг :   

Re: jQuery Autocomplete

знатоки PHP, подскажите:
вот код

<?php
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
  if($_GET['q']){
    $base = @file("auto.txt");
    for($i=0;$i<count($base);$i++){
	  $row_base = $base[$i];
	  $res = strpos(strtolower($row_base), strtolower($_GET['q']));
	  if($res!==false&&$res==0) {
	    print $row_base."\n";
	  }
    }
  }
}
?>

для плагина Autocomplete. если файл auto.txt в утф кодировке - то в поле поиска выводится подсказки в утф8. если файл перевести в кодировку виндос1251 - подсказки не работают. я так понимаю, он налету переводит из сп1251 в утф8? подскажите решение проблемы, как вывести плагин в нужной кодировке?

Не в сети

#5 2010-05-07 00:40:30

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: jQuery Autocomplete

Live, речь видимо про AJAX запросы?
Насколько я помню, встроенные в браузеры библиотеки работают только с данными в UTF8

Поэтому на выбор 2 варианта:
* конвертнуть файл подсказок в utf8
* на лету (при передаче в suggest библиотеку) конвертировать строчки из Win-1251 в UTF8 при помощи библиотеки iconv (она сейчас установлена на, наверное, 95% хостингах с PHP)

Не в сети

#6 2010-05-07 02:15:44

Live
Участник
Зарегистрирован: 2009-12-04
Сообщений: 181
Рейтинг :   

Re: jQuery Autocomplete

vitaly, спасибо, разобрался, только я сделал как раз наоборот - конвертирование подсказки при выводе из UTF8 в Win-1251.

Изменено Live (2010-05-07 02:16:07)

Не в сети

Подвал раздела

Работает на FluxBB