[Jifty-commit] r1920 - jifty/trunk/lib/Jifty

jifty-commit at lists.jifty.org jifty-commit at lists.jifty.org
Sat Sep 2 20:39:24 EDT 2006


Author: nelhage
Date: Sat Sep  2 20:39:23 2006
New Revision: 1920

Modified:
   jifty/trunk/lib/Jifty/Action.pm
   jifty/trunk/lib/Jifty/Web.pm

Log:
Stickiness fix

Modified: jifty/trunk/lib/Jifty/Action.pm
==============================================================================
--- jifty/trunk/lib/Jifty/Action.pm	(original)
+++ jifty/trunk/lib/Jifty/Action.pm	Sat Sep  2 20:39:23 2006
@@ -34,7 +34,7 @@
 
 use base qw/Jifty::Object Class::Accessor::Fast Class::Data::Inheritable/;
 
-__PACKAGE__->mk_accessors(qw(moniker argument_values order result sticky_on_success sticky_on_failure));
+__PACKAGE__->mk_accessors(qw(moniker argument_values values_from_request order result sticky_on_success sticky_on_failure));
 __PACKAGE__->mk_classdata(qw/PARAMS/);
 
 =head1 COMMON METHODS
@@ -82,6 +82,15 @@
 L<sticky|Jifty::Manual::Glossary/sticky> when the action succeeds.  Defaults
 to false.
 
+=begin private
+
+=item request_arguments
+
+A hashref of arguments passed in as part of the
+L<Jifty::Request>. Internal use only.
+
+=end private
+
 =back
 
 =cut
@@ -92,6 +101,7 @@
     my %args = (
         order      => undef,
         arguments  => {},
+        request_arguments => {},
         sticky_on_success => 0,
         sticky_on_failure => 1,
         current_user => undef,
@@ -110,7 +120,15 @@
         $self->log->debug("Generating moniker auto-".Jifty->web->serial);
     }
     $self->order($args{'order'});
-    $self->argument_values( { %{ $args{'arguments'} } } );
+
+    $self->argument_values( { %{ $args{'request_arguments' } }, %{ $args{'arguments'} } } );
+
+    # Keep track of whether arguments came from the request, or were
+    # programmatically set elsewhere
+    $self->values_from_request({});
+    $self->values_from_request->{$_} = 1 for keys %{ $args{'request_arguments' } };
+    $self->values_from_request->{$_} = 0 for keys %{ $args{'arguments' } };
+    
     $self->result(Jifty->web->response->result($self->moniker) || Jifty::Result->new);
     $self->result->action_class(ref($self));
 
@@ -278,7 +296,10 @@
     my $self = shift;
     my $arg = shift;
 
-    $self->argument_values->{$arg} = shift if @_;
+    if(@_) {
+        $self->values_from_request->{$arg} = 0;
+        $self->argument_values->{$arg} = shift;
+    }
     return $self->argument_values->{$arg};
 }
 
@@ -346,30 +367,41 @@
                  render_mode => 'update',
                  @_);
 
-
-    my $arg_name = $args{'argument'}. '!!' .$args{'render_mode'};
+    my $field = $args{'argument'};
+    
+    my $arg_name = $field. '!!' .$args{'render_mode'};
 
     if ( not exists $self->{_private_form_fields_hash}{$arg_name} ) {
 
-        my $field_info = $self->arguments->{$args{'argument'}};
+        my $field_info = $self->arguments->{$field};
 
         my $sticky = 0;
-        $sticky = 1 if $self->sticky_on_failure and (!Jifty->web->response->result($self->moniker) or $self->result->failure);
-        $sticky = 1 if $self->sticky_on_success and (Jifty->web->response->result($self->moniker) and $self->result->success);
+        # Check stickiness iff the values came from the request
+        if($self->values_from_request->{$field} && Jifty->web->response->result($self->moniker)) {
+            $sticky = 1 if $self->sticky_on_failure and $self->result->failure;
+            $sticky = 1 if $self->sticky_on_success and $self->result->success;
+        }
 
         # $sticky can be overrided per-parameter
         $sticky = $field_info->{sticky} if defined $field_info->{sticky};
 
         if ($field_info) {
             # form_fields overrides stickiness of what the user last entered.
+            my $default_value;
+            $default_value = $field_info->{'default_value'}
+              if exists $field_info->{'default_value'};
+            $default_value = $self->argument_value($field)
+              if $self->has_argument($field) && !$self->values_from_request->{$field};
+            
             $self->{_private_form_fields_hash}{$arg_name}
                 = Jifty::Web::Form::Field->new(
                 %$field_info,
-                action       => $self,
-                name         => $args{'argument'},
-                sticky       => $sticky,
-                sticky_value => $self->argument_value($args{'argument'}),
-                render_mode  => $args{'render_mode'},
+                action        => $self,
+                name          => $field,
+                sticky        => $sticky,
+                sticky_value  => $self->argument_value($field),
+                default_value => $default_value,
+                render_mode   => $args{'render_mode'},
                 %args
                 );
 

Modified: jifty/trunk/lib/Jifty/Web.pm
==============================================================================
--- jifty/trunk/lib/Jifty/Web.pm	(original)
+++ jifty/trunk/lib/Jifty/Web.pm	Sat Sep  2 20:39:23 2006
@@ -416,8 +416,6 @@
     );
 
 
-    my %arguments = %{ $args{arguments} };
-
     if ( $args{'moniker'} ) {
         my $action_in_request = $self->request->action( $args{moniker} );
 
@@ -425,7 +423,7 @@
     # from the request; we read from the request to implement "sticky fields".
     #
         if ( $action_in_request and $action_in_request->arguments ) {
-            %arguments = ( %{ $action_in_request->arguments }, %arguments );
+            $args{'request_arguments'} = $action_in_request->arguments;
         }
     }
 
@@ -447,7 +445,7 @@
 
     my $action;
     # XXX TODO bullet proof
-    eval { $action = $class->new( %args, arguments => {%arguments} ); };
+    eval { $action = $class->new(%args) };
     if ($@) {
         my $err = $@;
         $self->log->fatal($err);


More information about the Jifty-commit mailing list