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 Список представлений, которые могут быть возвращены. |