Bivio::Biz::Model::QuerySearchBaseForm
# Copyright (c) 2003-2009 bivio Software, Inc. All Rights Reserved.
# $Id$
package Bivio::Biz::Model::QuerySearchBaseForm;
use strict;
use Bivio::Base 'Biz.FormModel';
sub OMIT_DEFAULT_VALUES_FROM_QUERY {
# Returns true if the query values are to be omitted if they match
# the default_value. Subclasses may override this to change the behavior.
return 1;
}
sub execute_empty {
my($self) = @_;
foreach my $field (@{_get_visible_fields($self)}) {
_load_query_value($self, $field);
}
return;
}
sub execute_ok {
my($self) = @_;
foreach my $field (@{_get_visible_fields($self)}) {
$self->internal_put_field($field => $self->get_default_value($field))
unless defined($self->unsafe_get($field));
}
return _redirect($self, $self->get_current_query_for_list);
}
sub execute_other {
my($self) = shift;
return _redirect($self)
if $self->unsafe_get('reset_button');
return $self->SUPER::execute_other(@_);
}
sub get_current_query_for_list {
my($self) = @_;
return {
map({
my($v) = $self->unsafe_get($_);
my($t) = $self->get_field_info($_, 'type');
my($dv) = $self->get_default_value($_);
my($name) = $self->get_field_info($_, 'form_name');
!$self->OMIT_DEFAULT_VALUES_FROM_QUERY || !$t->is_equal($dv, $v)
? ($name => $t->to_literal($v)) : ();
} @{_get_visible_fields($self)}),
};
}
sub internal_initialize {
my($self) = @_;
return $self->merge_initialize_info($self->SUPER::internal_initialize, {
visible => [
{
name => 'reset_button',
type => 'FormButton',
constraint => 'NONE',
},
],
});
}
sub _get_visible_fields {
my($self) = @_;
return [
grep(! ($self->get_field_info($_, 'type')
&& $self->get_field_info($_, 'type')
->isa('Bivio::Type::FormButton')),
@{$self->get_info('visible_field_names')}),
];
}
sub _load_query_value {
my($self, $field) = @_;
my($query) = $self->get_request->get('query');
my($v, $e);
my($value) = $query->{$self->get_field_info($field, 'form_name')};
if (defined($value)) {
($v, $e) = $self->get_field_type($field)->from_literal($value);
if ($e) {
$self->internal_put_error($field => $e);
return;
}
}
else {
$v = $self->get_default_value($field);
}
$self->internal_put_field($field => $v);
return;
}
sub _redirect {
# CLIENT_REDIRECT to avoid browser seeing redirect loop.
my($self, $query) = @_;
my($req) = $self->req;
return {
method => 'client_redirect',
task_id => 'CLIENT_REDIRECT',
query => {
b_use('Action.ClientRedirect')->QUERY_TAG => $req->format_uri(
$req->get('task_id'), $query || {}),
},
};
}
1;