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>