You are right.
But the errors produced by Error.pm seem to be irrelevant.
Ok, I'll post the workable code without Ajax and the same after putting some. Here we go:
package dir_browse::dir_browse;
use strict;
use warnings;
use Apache2::RequestRec;
use Apache2::RequestIO;
use Apache2::Const qw(:common);
use Apache2::Reload;
use File::Spec;
use Error qw(:try);
use Template;
sub new {
bless {}
}
sub handler : method {
my ($self, $r) = @_;
$Error::Debug = 1;
$self = $self->new unless ref $self;
$self->{r} = $r;
try {
my $websrc = $self->get_websrc;
my $template = new Template({
INCLUDE_PATH => ["$websrc/src", "$websrc/lib"],
INTERPOLATE => 1,
OUTPUT => $self->{r},
});
$self->get_contents(File::Spec->rel2abs($self->{r}->path_info)
+);
$self->{r}->content_type('text/html');
throw Error(-text => "No path '$websrc'") unless -f "$websrc/s
+rc/dir_browse.tt2";
$template->process('dir_browse.tt2', $self)
or throw Error(text => $template->error());
}
catch Error with {
my $E = shift;
$self->{r}->print($E->stacktrace);
$self->{r}->log_error($E->stacktrace);
return Apache2::Const::SERVER_ERROR;
};
return Apache2::Const::OK;
}
...
1;
Now the one with Ajax:
package dir_browse::dir_browse;
use strict;
use warnings;
use Apache2::RequestRec;
use Apache2::RequestIO;
use Apache2::Const qw(:common);
use Apache2::Reload;
use Apache2::Ajax;
use File::Spec;
use Error qw(:try);
use Template;
sub new {
bless {}
}
sub handler : method {
my ($self, $r) = @_;
$Error::Debug = 1;
$self = $self->new unless ref $self;
$self->{r} = $r;
try {
my $websrc = $self->get_websrc;
my $template = new Template({
INCLUDE_PATH => ["$websrc/src", "$websrc/lib"],
INTERPOLATE => 1,
OUTPUT => $self->{r},
});
$self->get_contents(File::Spec->rel2abs($self->{r}->path_info)
+);
$self->{r}->content_type('text/html');
throw Error(-text => "No path '$websrc'") unless -f "$websrc/s
+rc/dir_browse.tt2";
my $html;
$template->process('dir_browse.tt2', $self, \$html)
or throw Error(text => $template->error());
my $ajax = Apache2::Ajax->new($self->{r}, 'show' => sub {retur
+n $html})
or throw Error(text => "DARN!! ");
$self->{r}->print($ajax->build_html());
}
catch Error with {
my $E = shift;
$self->{r}->print($E->stacktrace);
$self->{r}->log_error($E->stacktrace);
return Apache2::Const::SERVER_ERROR;
};
return Apache2::Const::OK;
}
...
1;
And the httpd.confL
PerlModule Apache2::Ajax
...
PerlModule Apache2::dir_browse
<Location /dir_browse>
SetHandler perl-script
PerlResponseHandler dir_browse::dir_browse
</Location>
And here is the error message I get when I rum this:
Can't locate Apache2/Request.pm in @INC (@INC contains: C:\Program Files\ActiveState Perl Dev Kit 6.0\lib\ C:\cygwin\home\artem\perl_projects\web c:/Perl/site/lib c:/Perl/lib . C:/Program Files/Apache Software Foundation/Apache2.2) at c:/Perl/site/lib/Error.pm line 38 Error::throw_Error_Simple('HASH(0xc5f508)') called at c:/Perl/site/lib/Error.pm line 297 Error::subs::run_clauses('HASH(0xc5f4b4)', 'Can\'t locate Apache2/Request.pm in @INC (@INC contains: C:\P...', 'undef', 'ARRAY(0xc99978)') called at c:/Perl/site/lib/Error.pm line 416 Error::subs::try('CODE(0x107b1b0)', 'HASH(0xc5f4b4)') called at C:\cygwin\home\artem\perl_projects\web/dir_browse/dir_browse.pm line 55 dir_browse::dir_browse::handler('dir_browse::dir_browse', 'Apache2::RequestRec=SCALAR(0x107b15c)') called at -e line 0 eval {...} called at -e line 0
I'm using the latest mod_perl2, ActiveState 5.8.8.819, WinXP SP2.
Thanks a lot,
Artem. |