2011-04-30 6 views
1

나는 이것이 실패하고있는 지점을 찾아 내기 위해 고심하고있다. 내 로컬 PC에서 php/jquery를 사용하여이 플러그인을 사용할 수 있지만 Perl을 사용하여 내 프로덕션 상자에서 복제하려고합니다. (여기서 PHP는 내가 들어 가지 않는 이유로 옵션이 아닙니다.)Perl에서 JQuery 자동 완성

index.cgi - 이것은 텍스트 상자가 들어있는 html 페이지를 생성하는 perl 코드입니다. 이것은 사용되는 실제 JQuery와 인 -

#!/usr/bin/perl 
use warnings; 
use strict; 
use CGI; 
use DBI; 
use JSON; 

my $cgi = CGI->new; 
print $cgi->header(-type => "application/json", -charset => "utf-8"); 
my $dbh = DBI->connect('dbi:mysql:hostname=test;database=test',"test","test"); 
my $term = $cgi->param('term'); 
my $sth = $dbh->prepare(qq{SELECT customer.name, customer.id FROM test WHERE customer.name ?;}) or die $dbh->errstr; 
$sth->execute($term.'%') or die $sth->errstr; 
my $json = {}; 
while(my @customer = $sth->fetchrow_array()) { 
    $json->{$customer[0]} = $customer[1]; 
} 
print JSON::to_json($json); 

test.js :

-

#!/usr/bin/perl -w 

use DBI; 
use CGI; 
use warnings; 
use strict; 

$cgi = new CGI; 
$cgi->autoEscape(undef); 
print $cgi->header; 
print $cgi->start_html(-title=>'test', 
         -dtd=>'//W3C//DTD HTML 4.01 Transitional//EN', 
         -style=>'/themes/ui-lightness/jquery.ui.all.css', 
         -script=>[ 
           {-type=>'javascript', -src=>'/js/jquery-1.5.2.min.js'}, 
           {-type=>'javascript', -src=>'/js/test.js'}, 
           {-type=>'javascript', -src=>'/ui/jquery-ui-1.8.11.custom.js'}, 
           {-type=>'javascript', -src=>'/ui/jquery.ui.core.js'}, 
           {-type=>'javascript', -src=>'/ui/jquery.ui.widget.js'}, 
           {-type=>'javascript', -src=>'/ui/jquery.ui.position.js'}, 
           {-type=>'javascript', -src=>'/ui/jquery.ui.autocomplete.js'} 
         ] 
     ); 

print $cgi->start_div({-class=>'ui-widget'}); 
print $cgi->textfield(-id=>'customer',-size=>25),$cgi->br; 
print $cgi->end_div(),$cgi->br; 
print $cgi->div({-class=>'ui-widget-content',-id=>'log'}); 
print $cgi->end_html; 

test.pl 이것은 자동 완성에 JSON을 공급하는 백그라운드에서 실행되는 코드입니다

$(function() { 
     function log(message) { 
       $("<div/>").text(message).prependTo("#log"); 
       $("#log").attr("scrollTop", 0); 
     } 

     $("#customer").autocomplete({ 
       source: "test.pl?term=", 
       minLength: 2, 
       select: function(event, ui) { 
         log(ui.item ? 
           "Value: " + ui.item.value + " Key " + ui.item.id : 
           "Nothing selected, input was " + this.value); 
       } 
     }); 
}); 

저는 Google을 둘러 보았지만 JQuery를 사용하여 Perl의 예가있는 곳을 찾을 수 없었습니다. test.js와 index.cgi 파일은 jquery 자동 완성을위한 jquery-ui 예제 파일에서 코드를 복제합니다. 단, index.cgi은 CGI.pm을 사용하여 Perl로 작성됩니다.

도움이 될만한 점은 여기에있는 서버 및 응용 프로그램의 특성으로 인해 언어가 다소 제한적이라는 것입니다.

+0

test.pl도 컴파일하지 않습니다. – tadmc

+0

나는 당신이 그 일에 열중하지 않는다고 말했지만, 왜 당신이 서버에 PHP를 설치할 수 없는지 궁금합니다. –

+1

'use strict'와'warnings'가 없습니다. 그것들을 생략함으로써 시간을 낭비하지 마십시오. – Lumi

답변

0

리턴 된 json 문자열에 값 또는 레이블 필드가 지정되어 있지 않습니다. 당신은 이름과 이드를 버리고 있습니다. 자동 완성은 자동 완성 결과에 표시 할 항목을 알지 못합니다. 값 필드에 고객 이름을 지정하십시오.

$json->{"value"} = $customer[0]; 
$json->{"id"} = $customer[1]; 

jQuery 자동 완성에는 json 결과와 함께 "value"또는 "label"필드가 반환되어야합니다. 포함하지 않으면 jquery 자동 완성이 작동하지 않습니다.

자동 완성의 기본 기능은 '라벨'및 '값'입력란에 할당 된 검색어의 결과와 함께 작동합니다.jQuery UI 사이트의 'label'및 'value'필드에 대한 설명 :

"로컬 데이터는 문자열의 단순한 배열 일 수도 있고 배열의 각 항목에 대한 객체를 레이블이나 값과 함께 포함 할 수도 있습니다 속성 또는 둘 다. 제안 사항 메뉴에 label 속성이 표시됩니다. 사용자가 메뉴에서 항목을 선택한 후에 값이 입력 요소에 삽입됩니다. 속성이 하나만 지정되면 두 속성 모두에 사용됩니다 (예 : 당신은 단지 가치 특성을 제공하는 경우, 값은 레이블로 사용됩니다 "전체 예제에

링크 :. http://www.jensbits.com/2011/05/09/jquery-ui-autocomplete-widget-with-perl-and-mysql/

3

대부분 Perl과 jQuery가 격리되어 있습니다. Perl이 올바른 HTML을 보내면 브라우저가 올바른 jQuery 코드를 실행해야합니다. test.pl에 올바른 JSON을 보내면 제대로 처리하도록 jQuery를 설정했다면 올바르게 처리해야합니다.

그러나 내 의견에 언급 된대로 먼저 컴파일해야합니다. $dbh 과제가 끝나면 세미콜론이 누락되었습니다. 이는 Perl이 완료되지 않았다고 생각하고 $dbh 지정으로 $sth 할당을 연결하기 위해 어떤 방식 으로든 노력하고있을 것으로 예상하고 있음을 의미합니다.

변경을 완료하면 코드가 컴파일됩니다. 컴파일을 확인하려면 perl -c test.pl. 하지만 확인하려고하는 DB에 액세스 할 수 없어서 실패했습니다. 따라서 연결 문자열이 맞다고 가정하면 이것이 작동하지 않는 이유를 알 수 없습니다.

그리고 항상, 항상 - 개발 적어도 -와 떨어져 스크립트를 시작합니다

use strict; 
use warnings; 
... 

가 자신에게 코딩 오류를 잡기 위해 싸울 기회를 제공하기 위해. 프로덕션 환경에서 프로덕션 전 테스트에서 테스트하지 못한 코드 세그먼트가 있으면 더 나은 오류 메시지도 제공합니다.

+0

CLI에서 test.pl을 실행하면 JSON 형식의 데이터 출력을 볼 수 있습니다. 필자는 Perl 스크립트의 결과와 JQuery 스크립트의 결과 사이에 잘못된 통신이 어디에 있는지를 디버그하는 방법에 대해서는 확신 할 수 없다. 콘텐츠 유형 : application/json; 캐릭터 = UTF-8 { "559": "이 기록 (126) \ R 인" "32": "127", "이 (558) \ R 레코드는" "이 기록 31 \ R" } 경고를 사용하고 perl 스크립트에 엄격한 사용을하고 괜찮습니다. – Mose