package FriendsPhotos; use base 'CGI::Application'; use strict; use lib ('../../lib','/usr/share/perl5'); use CGI::Application::ValidateRM; use CGI::Uploader; sub setup { my $self = shift; $self->start_mode('add_form'); $self->run_modes([qw/ add_form add_process edit_form edit_process /]); my $uploader_args = $self->param('uploader_args') || die "must pass uploader PARAM"; my $u = CGI::Uploader->new(%$uploader_args); $self->param('uploader',$u); } sub add_form { my $self = shift; my $t = $self->load_tmpl('photo-add.html'); return $t->output; }; sub add_process { my $self = shift; my $q = $self->query; my $query_hash = $q->Vars; my $dbh = $self->param('dbh'); my $u = $self->param('uploader'); my ($results, $err_page) = $self->check_rm('add_form', { required => [qw/full_name photo/], msgs => { prefix => 'err_' }, }); return $err_page if $err_page; my $valid = $results->valid; my $friend; eval { $dbh->{RaiseError} = 1; $valid->{friend_id} = $dbh->selectrow_array("SELECT nextval('friend_id_seq')"); $friend = $u->store_uploads($valid); require SQL::Abstract; my $sql = SQL::Abstract->new; my($stmt, @bind) = $sql->insert('address_book',$friend); $dbh->do($stmt,{},@bind); }; if ($@) { return "failure: $@"; } else { my $new_q = CGI->new({ success => 1, rm => 'edit_form', friend_id => $friend->{friend_id} } ); $self->header_type('redirect'); $self->header_props( -url=> $ENV{SCRIPT_NAME}.'?'.$new_q->query_string ); } } sub edit_form { my $self = shift; my $msgs = shift; my $q = $self->query; my $dbh = $self->param('dbh'); my $friend_id = $q->param('friend_id'); die "no friend_id found" unless $friend_id; my $t = $self->load_tmpl('photo-edit.html',die_on_bad_params=>0,); $t->param($msgs) if $msgs; $t->param(msg => $q->param('msg')); my $friend = $dbh->selectrow_hashref("SELECT * FROM address_book WHERE friend_id = ?",{},$friend_id); if ($friend->{photo_id}) { my $u = $self->param('uploader'); my $href = $u->fk_meta( table => 'address_book', where => { friend_id => $friend_id }, prefixes => [qw/photo photo_thumbnail/]); $t->param($href); } require HTML::FillInForm; my $fif = HTML::FillInForm->new(); return $fif->fill(scalarref=>\$t->output,fdat=>$friend); } sub edit_process { my $self = shift; my ($results, $err_page) = $self->check_rm('edit_form', { require_some => { photo_or_photo_id => [qw/photo photo_id/], }, required => [qw/full_name friend_id/], msgs => { prefix => 'err_' }, }); return $err_page if $err_page; my $dbh = $self->param('dbh'); my $q = $self->query; my $u = $self->param('uploader'); my $friend = $results->valid; eval { $dbh->{RaiseError} = 1; my @fk_names = $u->delete_checked_uploads; map { $friend->{$_} = undef } @fk_names; delete $friend->{photo_delete}; $friend = $u->store_uploads($friend); require SQL::Abstract; my $sql = SQL::Abstract->new(); my ($stmt,@bind) = $sql->update('address_book',$friend, { friend_id => $friend->{friend_id} }); $dbh->do($stmt,{},@bind); }; if ($@) { return "Failure: $@"; } else { my $new_q = CGI->new({ success => 1, rm => 'edit_form', friend_id => $friend->{friend_id} } ); $self->header_type('redirect'); $self->header_props( -url=> $ENV{SCRIPT_NAME}.'?'.$new_q->query_string ); } } 1;