X-Git-Url: http://wagnertech.de/git?p=kivitendo-erp.git;a=blobdiff_plain;f=SL%2FController%2FBase.pm;fp=SL%2FController%2FBase.pm;h=63f153fa8d20143a175ea3e417c56be36c479828;hp=b97f3c50981a3d3c7fbf3c11ac1a8ede1b0c8b2c;hb=53593baa211863fbf66540cf1bcc36c8fb37257f;hpb=deb4d2dbb676d7d6f69dfe7815d6e0cb09bd4a44 diff --git a/SL/Controller/Base.pm b/SL/Controller/Base.pm index b97f3c509..63f153fa8 100644 --- a/SL/Controller/Base.pm +++ b/SL/Controller/Base.pm @@ -7,6 +7,7 @@ use parent qw(Rose::Object); use Carp; use IO::File; use List::Util qw(first); +use MIME::Base64; use SL::Request qw(flatten); use SL::MoreCommon qw(uri_encode); use SL::Presenter; @@ -14,7 +15,7 @@ use SL::Presenter; use Rose::Object::MakeMethods::Generic ( scalar => [ qw(action_name) ], - 'scalar --get_set_init' => [ qw(js) ], + 'scalar --get_set_init' => [ qw(js p) ], ); # @@ -29,6 +30,7 @@ sub url_for { my %params = ref($_[0]) eq 'HASH' ? %{ $_[0] } : @_; my $controller = delete($params{controller}) || $self->controller_name; my $action = $params{action} || 'dispatch'; + my $fragment = delete $params{fragment}; my $script; if ($controller =~ m/\.pl$/) { @@ -41,7 +43,7 @@ sub url_for { my $query = join '&', map { uri_encode($_->[0]) . '=' . uri_encode($_->[1]) } @{ flatten(\%params) }; - return "${script}?${query}"; + return "${script}?${query}" . (defined $fragment ? "#$fragment" : ''); } sub redirect_to { @@ -53,7 +55,7 @@ sub redirect_to { SL::Helper::Flash::delay_flash(); } - return $self->render(SL::ClientJS->new->redirect_to($self->url_for(@_))) if $::request->is_ajax; + return $self->render(SL::ClientJS->new->redirect_to($url)) if $::request->is_ajax; print $::request->{cgi}->redirect($url); } @@ -73,6 +75,7 @@ sub render { header => 1, layout => 1, process => 1, + status => '200 ok', ); $options->{$_} //= $defaults{$_} for keys %defaults; $options->{type} = lc $options->{type}; @@ -129,7 +132,8 @@ sub render { : 'application/json'; print $::form->create_http_response(content_type => $content_type, - charset => 'UTF-8'); + charset => 'UTF-8', + (status => $options->{status}) x !!$options->{status}); } } @@ -155,23 +159,35 @@ sub send_file { my $attachment_name = $params{name} || (!ref($file_name_or_content) ? $file_name_or_content : ''); $attachment_name =~ s:.*//::g; - print $::form->create_http_response(content_type => $content_type, - content_disposition => 'attachment; filename="' . $attachment_name . '"', - content_length => $size); - - if (!ref $file_name_or_content) { - $::locale->with_raw_io(\*STDOUT, sub { print while <$file> }); - $file->close; - unlink $file_name_or_content if $params{unlink}; + if ($::request->is_ajax || $params{ajax}) { + my $octets = ref $file_name_or_content ? $file_name_or_content : \ do { local $/ = undef; <$file> }; + $self->js->save_file(MIME::Base64::encode_base64($$octets), $content_type, $size, $attachment_name); + $self->js->render unless $params{js_no_render}; } else { - $::locale->with_raw_io(\*STDOUT, sub { print $$file_name_or_content }); + print $::form->create_http_response(content_type => $content_type, + content_disposition => 'attachment; filename="' . $attachment_name . '"', + content_length => $size); + + if (!ref $file_name_or_content) { + $::locale->with_raw_io(\*STDOUT, sub { print while <$file> }); + $file->close; + unlink $file_name_or_content if $params{unlink}; + } else { + $::locale->with_raw_io(\*STDOUT, sub { print $$file_name_or_content }); + } } + + return 1; } sub presenter { return SL::Presenter->get; } +sub init_p { + return SL::Presenter->get; +} + sub controller_name { my $class = ref($_[0]) || $_[0]; $class =~ s/^SL::Controller:://; @@ -526,6 +542,9 @@ L. The action to call is given by C<$params{action}>. It defaults to C. +If C<$params{fragment}> is present, it's used as the fragment of the resulting +URL. + All other key/value pairs in C<%params> are appended as GET parameters to the URL.