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