Mercurial > pub > Impl
diff Lib/IMPL/Web/Handler/ViewSelector.pm @ 213:d6e2ea24af08
sync
author | sergey |
---|---|
date | Fri, 03 Aug 2012 01:15:15 +0400 |
parents | 3d433a977e3b |
children | 47f77e6409f7 |
line wrap: on
line diff
--- a/Lib/IMPL/Web/Handler/ViewSelector.pm Fri Jun 29 19:24:15 2012 +0400 +++ b/Lib/IMPL/Web/Handler/ViewSelector.pm Fri Aug 03 01:15:15 2012 +0400 @@ -5,7 +5,8 @@ use IMPL::declare { require => { - NotAcceptable => 'IMPL::Web::NotAcceptableException' + NotAcceptable => 'IMPL::Web::NotAcceptableException', + ViewResult => 'IMPL::Web::Application::ViewResult' }, base => { 'IMPL::Object' => undef, @@ -23,38 +24,47 @@ sub Invoke { my ($this,$action,$next) = @_; - my $handler; - my $path = $action->query->path_info; + my $result = $next ? $next->($action) : undef; - if ($this->types and $path =~ m/\.(\w+)$/) { - my $forced; - if ($forced = $this->types->{$1} and $action->query->Accept($forced) ) { - ($handler) = grep eval { $_->can('contentType') } && $_->contentType eq $forced, $this->views; - } - } + my $model; - if (not $handler) { + if( eval { $result->isa(ViewResult) } ) { - my @handlers = - sort { - $b->{preference} <=> $a->{preference} - } map { - { - handler => $_, - preference => - eval { $_->can('contentType') } ? $action->query->Accept($_->contentType) : 0 - } - } $this->views; - - my $info = shift @handlers; - $handler = $info ? $info->{handler} : undef; - + my $handler; + my $path = $action->query->path_info; + + if ($this->types and $path =~ m/\.(\w+)$/) { + my $forced; + if ($forced = $this->types->{$1} and $action->query->Accept($forced) ) { + ($handler) = grep eval { $_->can('contentType') } && $_->contentType eq $forced, $this->views; + } + } + + if (not $handler) { + + my @handlers = + sort { + $b->{preference} <=> $a->{preference} + } map { + { + handler => $_, + preference => + eval { $_->can('contentType') } ? $action->query->Accept($_->contentType) : 0 + } + } $this->views; + + my $info = shift @handlers; + $handler = $info ? $info->{handler} : undef; + + } + + die NotAcceptable->new(map { eval {$_->can('contentType') } ? $_->contentType : () } $this->views ) + unless $handler; + + return $handler->Invoke($action,sub { $result }); + } else { + return $result; } - - die NotAcceptable->new(map { eval {$_->can('contentType') } ? $_->contentType : () } $this->views ) - unless $handler; - - return $handler->Invoke($action,$next); } 1; @@ -72,6 +82,10 @@ Использует заголовок запроса C<Accept> для выбора подходящего представления, если задано свойство C<types>, пытается в первую очередь по расширению определить, какое представление подходит. +В случаях, когда не требуется строить представление для данных (например, при перенаправлении к другому +ресурсу или если нет данных), нужно, чтобы данному обработчику был возвращен +L<IMPL::Web::Application::ActionResult>, который будет просто передан далее. + =head1 MEMBERS =head2 C<[get,set,list]views>