Mercurial > pub > Impl
comparison Lib/IMPL/Web/Handler/ViewSelector.pm @ 213:d6e2ea24af08
sync
| author | sergey |
|---|---|
| date | Fri, 03 Aug 2012 01:15:15 +0400 |
| parents | 3d433a977e3b |
| children | 47f77e6409f7 |
comparison
equal
deleted
inserted
replaced
| 212:292226770180 | 213:d6e2ea24af08 |
|---|---|
| 3 | 3 |
| 4 use IMPL::lang qw(:declare :constants); | 4 use IMPL::lang qw(:declare :constants); |
| 5 | 5 |
| 6 use IMPL::declare { | 6 use IMPL::declare { |
| 7 require => { | 7 require => { |
| 8 NotAcceptable => 'IMPL::Web::NotAcceptableException' | 8 NotAcceptable => 'IMPL::Web::NotAcceptableException', |
| 9 ViewResult => 'IMPL::Web::Application::ViewResult' | |
| 9 }, | 10 }, |
| 10 base => { | 11 base => { |
| 11 'IMPL::Object' => undef, | 12 'IMPL::Object' => undef, |
| 12 'IMPL::Object::Autofill' => '@_', | 13 'IMPL::Object::Autofill' => '@_', |
| 13 'IMPL::Object::Serializable' => undef | 14 'IMPL::Object::Serializable' => undef |
| 21 } | 22 } |
| 22 | 23 |
| 23 sub Invoke { | 24 sub Invoke { |
| 24 my ($this,$action,$next) = @_; | 25 my ($this,$action,$next) = @_; |
| 25 | 26 |
| 26 my $handler; | 27 my $result = $next ? $next->($action) : undef; |
| 27 my $path = $action->query->path_info; | |
| 28 | 28 |
| 29 if ($this->types and $path =~ m/\.(\w+)$/) { | 29 my $model; |
| 30 my $forced; | 30 |
| 31 if ($forced = $this->types->{$1} and $action->query->Accept($forced) ) { | 31 if( eval { $result->isa(ViewResult) } ) { |
| 32 ($handler) = grep eval { $_->can('contentType') } && $_->contentType eq $forced, $this->views; | 32 |
| 33 my $handler; | |
| 34 my $path = $action->query->path_info; | |
| 35 | |
| 36 if ($this->types and $path =~ m/\.(\w+)$/) { | |
| 37 my $forced; | |
| 38 if ($forced = $this->types->{$1} and $action->query->Accept($forced) ) { | |
| 39 ($handler) = grep eval { $_->can('contentType') } && $_->contentType eq $forced, $this->views; | |
| 40 } | |
| 33 } | 41 } |
| 42 | |
| 43 if (not $handler) { | |
| 44 | |
| 45 my @handlers = | |
| 46 sort { | |
| 47 $b->{preference} <=> $a->{preference} | |
| 48 } map { | |
| 49 { | |
| 50 handler => $_, | |
| 51 preference => | |
| 52 eval { $_->can('contentType') } ? $action->query->Accept($_->contentType) : 0 | |
| 53 } | |
| 54 } $this->views; | |
| 55 | |
| 56 my $info = shift @handlers; | |
| 57 $handler = $info ? $info->{handler} : undef; | |
| 58 | |
| 59 } | |
| 60 | |
| 61 die NotAcceptable->new(map { eval {$_->can('contentType') } ? $_->contentType : () } $this->views ) | |
| 62 unless $handler; | |
| 63 | |
| 64 return $handler->Invoke($action,sub { $result }); | |
| 65 } else { | |
| 66 return $result; | |
| 34 } | 67 } |
| 35 | |
| 36 if (not $handler) { | |
| 37 | |
| 38 my @handlers = | |
| 39 sort { | |
| 40 $b->{preference} <=> $a->{preference} | |
| 41 } map { | |
| 42 { | |
| 43 handler => $_, | |
| 44 preference => | |
| 45 eval { $_->can('contentType') } ? $action->query->Accept($_->contentType) : 0 | |
| 46 } | |
| 47 } $this->views; | |
| 48 | |
| 49 my $info = shift @handlers; | |
| 50 $handler = $info ? $info->{handler} : undef; | |
| 51 | |
| 52 } | |
| 53 | |
| 54 die NotAcceptable->new(map { eval {$_->can('contentType') } ? $_->contentType : () } $this->views ) | |
| 55 unless $handler; | |
| 56 | |
| 57 return $handler->Invoke($action,$next); | |
| 58 } | 68 } |
| 59 | 69 |
| 60 1; | 70 1; |
| 61 | 71 |
| 62 __END__ | 72 __END__ |
| 70 =head1 DESCRIPTION | 80 =head1 DESCRIPTION |
| 71 | 81 |
| 72 Использует заголовок запроса C<Accept> для выбора подходящего представления, если задано свойство C<types>, | 82 Использует заголовок запроса C<Accept> для выбора подходящего представления, если задано свойство C<types>, |
| 73 пытается в первую очередь по расширению определить, какое представление подходит. | 83 пытается в первую очередь по расширению определить, какое представление подходит. |
| 74 | 84 |
| 85 В случаях, когда не требуется строить представление для данных (например, при перенаправлении к другому | |
| 86 ресурсу или если нет данных), нужно, чтобы данному обработчику был возвращен | |
| 87 L<IMPL::Web::Application::ActionResult>, который будет просто передан далее. | |
| 88 | |
| 75 =head1 MEMBERS | 89 =head1 MEMBERS |
| 76 | 90 |
| 77 =head2 C<[get,set,list]views> | 91 =head2 C<[get,set,list]views> |
| 78 | 92 |
| 79 Список представлений, которые могут быть возвращены. | 93 Список представлений, которые могут быть возвращены. |
