Автозаполнение JQuery из Perl - PullRequest
       0

Автозаполнение JQuery из Perl

1 голос
/ 30 апреля 2011

Я изо всех сил пытаюсь определить точку, где это терпит неудачу.Я могу заставить этот плагин работать, используя php / jquery на моем локальном ПК, но пытаясь продублировать его с Perl на моей рабочей коробке (где php не подходит по причинам, по которым я не буду вдаваться).

index.cgi - это код на Perl, который генерирует html-страницу, содержащую текстовое поле.

#!/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 для автозаполнения:

#!/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 - это фактический JQuery, который используется:

$(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, но не нашел ничего хорошего, где у кого-то есть примерPerl с JQuery.Файлы test.js и index.cgi почти полностью дублируют код из файлов примеров jquery-ui для автозаполнения jquery, за исключением того, что index.cgi написан на Perl с использованием CGI.pm.

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

Ответы [ 2 ]

3 голосов
/ 30 апреля 2011

Perl и jQuery в основном изолированы. Если Perl отправляет правильный HTML, ваш браузер должен выполнить правильный код jQuery. И если в test.pl вы отправите правильный JSON - при условии, что вы настроили JQuery для его правильной обработки - он должен обрабатываться правильно.

Однако, как уже упоминалось в моем комментарии, он должен сначала скомпилироваться. Вам не хватает точки с запятой в конце вашего задания $dbh. Это означает, что Perl думает, что вы еще не закончили, и ожидает, что вы пытаетесь каким-то образом связать назначение $sth с назначением $dbh.

Как только я внес это изменение, ваш код скомпилирован. Чтобы проверить компиляцию: perl -c test.pl. Но это не удалось, потому что у меня нет доступа к БД, которые вы пытаетесь проверить, поэтому, предполагая, что строка подключения верна, я не понимаю, почему это не сработает.

И всегда, всегда - в разработке * хотя бы 1013 * - начинайте свои сценарии с:

use strict;
use warnings;
...

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

0 голосов
/ 09 мая 2011

Вам не присвоено значение или поле метки в возвращенной строке json. Вы сбрасываете имя и идентификатор. Автозаполнение не знает, какой из них вы хотите отобразить в результатах автозаполнения. Присвойте имя клиента полю значения.

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

Для автозаполнения jQuery необходимо поле «value» или «label», возвращаемое с результатом json. Если вы не включите его, автозаполнение jquery не будет работать:

Основные функции автозаполнения работают с результатами запроса, назначенными полям «label» и «value». Объяснение полей 'label' и 'value' с сайта пользовательского интерфейса jQuery:

«Локальные данные могут быть простым массивом строк или содержать объекты для каждого элемента в массиве со свойством метки или значения или с обоими. Свойство метки отображается в меню предложений. Значение будет вставлено в элемент ввода после того, как пользователь выберет что-то из меню. Если указано только одно свойство, оно будет использоваться для обоих, например. если вы предоставляете только значения-свойства, это значение также будет использоваться в качестве метки. ”

Ссылка на полный пример: http://www.jensbits.com/2011/05/09/jquery-ui-autocomplete-widget-with-perl-and-mysql/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...