RFE: Add file field type to DataForm wobject. Also added ability to have files submitted emailed as attachments when using the mail form mode.

This commit is contained in:
Roy Johnson 2006-11-28 07:56:30 +00:00
parent cfd09a5cb6
commit 0de492541b
5 changed files with 120 additions and 5 deletions

View file

@ -12,6 +12,10 @@
- Implemented codespace caching in WebGUI::International. This replaces the - Implemented codespace caching in WebGUI::International. This replaces the
in-memory cache by symbol table lookups into the code itself and saves in-memory cache by symbol table lookups into the code itself and saves
duplicating the i18n entries. duplicating the i18n entries.
- RFE: DataForm file upload patch. Thanks to mistoo for submitting the
original patch. Although I couldn't use the code in wG 7, it inspired the RFE.
Also added the feature requested in the thread to allow the files to be
emailed as attachments.
7.2.3 7.2.3
- fix: minor bug with new template vars in Auth::createAccount - fix: minor bug with new template vars in Auth::createAccount

View file

@ -21,8 +21,15 @@ my $quiet; # this line required
my $session = start(); # this line required my $session = start(); # this line required
addWikiAssets($session); addWikiAssets($session);
deleteOldFiles($session); deleteOldFiles($session);
addFileFieldsToDataForm($session);
finish($session); # this line required finish($session); # this line required
#-------------------------------------------------
sub addFileFieldsToDataForm {
my $session = shift;
print "\tAdding File Field Types to the Data Form Wobject\n" unless $quiet;
$session->db->write("alter table DataForm add column (mailAttachments int(11) default 0)");
}
#------------------------------------------------- #-------------------------------------------------
sub deleteOldFiles { sub deleteOldFiles {

View file

@ -166,6 +166,10 @@ sub definition {
defaultValue=>0, defaultValue=>0,
fieldType=>"yesNo" fieldType=>"yesNo"
}, },
mailAttachments=>{
defaultValue=>0,
fieldType=>'yesNo',
},
defaultView=>{ defaultView=>{
defaultValue=>0, defaultValue=>0,
fieldType=>"integer" fieldType=>"integer"
@ -179,6 +183,20 @@ sub definition {
return $class->SUPER::definition($session, $definition); return $class->SUPER::definition($session, $definition);
} }
#-------------------------------------------------------------------
sub deleteAttachedFiles {
my $self = shift;
my $fieldId = shift || '%';
my $storageIds = $self->session->db->buildArrayRef("select value from DataForm_entryData as a, DataForm_field as b where a.DataForm_fieldId = b.DataForm_fieldId and
b.type='file' and a.assetId=? and a.DataForm_fieldId=?",[$self->getId,$fieldId]);
foreach my $id (@$storageIds) {
my $file = WebGUI::Storage->get($self->session,$id);
$file->delete if defined $file;
$self->session->db->write("update DataForm_entryData set value='' where DataForm_fieldId=?",[$fieldId]);
}
}
#------------------------------------------------------------------- #-------------------------------------------------------------------
sub duplicate { sub duplicate {
my $self = shift; my $self = shift;
@ -208,6 +226,40 @@ sub duplicate {
return $newAsset; return $newAsset;
} }
#-------------------------------------------------------------------
sub getAttachedFiles {
my $self = shift;
my $properties = shift;
my ($returnType, @storageIds, @paths, $filename, $fileIcon, $fileUrl);
$returnType = $properties->{returnType};
push(@storageIds, $properties->{storageId}) if $properties->{storageId};
if ($returnType eq 'attachments') {
my $entryId = $properties->{entryId};
push(@storageIds, $self->session->db->buildArray("select value from DataForm_entryData as a, DataForm_field as b where a.DataForm_fieldId = b.DataForm_fieldId and
b.type='file' and a.DataForm_entryId=? and a.assetId=?",[$entryId,$self->getId]));
}
foreach my $storageId (@storageIds) {
my $storage = WebGUI::Storage->get($self->session, $storageId);
next unless defined $storage;
$filename = $storage->getFiles->[0];
$fileIcon = $storage->getFileIconUrl($filename);
$fileUrl = $storage->getUrl($filename);
push(@paths, $storage->getPath($filename));
}
if ($returnType eq 'link') {
return sprintf("<img src='%s' class='DataformRecordFileIcon' /><a href='%s' class='DataformRecordFileLink'>%s</a>",$fileIcon,$fileUrl,$filename);
}
use Data::Dumper;
$self->session->errorHandler->warn("<pre>".Dumper(\@paths)."</pre>");
return \@paths;
}
#------------------------------------------------------------------- #-------------------------------------------------------------------
sub getEditForm { sub getEditForm {
my $self = shift; my $self = shift;
@ -267,6 +319,13 @@ sub getEditForm {
-value=>$self->getValue("mailData") -value=>$self->getValue("mailData")
); );
$tabform->getTab("properties")->yesNo(
-name=>"mailAttachments",
-label=>$i18n->get("mail attachments"),
-hoverHelp=>$i18n->get("mail attachments description"),
-value=>$self->getValue("mailAttachments"),
);
$tabform->getTab("security")->group( $tabform->getTab("security")->group(
-name=>"groupToViewEntries", -name=>"groupToViewEntries",
-label=>$i18n->get('group to view entries'), -label=>$i18n->get('group to view entries'),
@ -325,14 +384,16 @@ sub getListTemplateVars {
where assetId=".$self->session->db->quote($self->getId)." order by submissionDate desc"); where assetId=".$self->session->db->quote($self->getId)." order by submissionDate desc");
while (my $record = $entries->hashRef) { while (my $record = $entries->hashRef) {
my @dataLoop; my @dataLoop;
my $dloop = $self->session->db->read("select b.name, b.label, b.isMailField, a.value from DataForm_entryData a left join DataForm_field b my $dloop = $self->session->db->read("select b.name, b.label, b.isMailField, b.type, a.value from DataForm_entryData a left join DataForm_field b
on a.DataForm_fieldId=b.DataForm_fieldId where a.DataForm_entryId=".$self->session->db->quote($record->{DataForm_entryId})." on a.DataForm_fieldId=b.DataForm_fieldId where a.DataForm_entryId=".$self->session->db->quote($record->{DataForm_entryId})."
order by b.sequenceNumber"); order by b.sequenceNumber");
while (my $data = $dloop->hashRef) { while (my $data = $dloop->hashRef) {
my $value = $data->{value};
$value = $self->getAttachedFiles({returnType=>'link',storageId=>$value}) if ($value && $data->{type} eq 'file');
push(@dataLoop,{ push(@dataLoop,{
"record.data.name"=>$data->{name}, "record.data.name"=>$data->{name},
"record.data.label"=>$data->{label}, "record.data.label"=>$data->{label},
"record.data.value"=>$data->{value}, "record.data.value"=>$value,
"record.data.isMailField"=>$data->{isMailField} "record.data.isMailField"=>$data->{isMailField}
}); });
} }
@ -454,6 +515,8 @@ sub getRecordTemplateVars {
my $value = $data{value}; my $value = $data{value};
$value = $self->session->datetime->epochToHuman($value,"%z") if ($data{type} eq "date"); $value = $self->session->datetime->epochToHuman($value,"%z") if ($data{type} eq "date");
$value = $self->session->datetime->epochToHuman($value,"%z %Z") if ($data{type} eq "dateTime"); $value = $self->session->datetime->epochToHuman($value,"%z %Z") if ($data{type} eq "dateTime");
my $subtext = $data{subtext};
$subtext = sprintf("<a href='%s'>%s</a>",$self->getUrl('func=deleteAttachedFile;fieldId='.$data{DataForm_fieldId}), $i18n->get("delete file")) if ($data{type} eq "file" && $value);
push(@fields, { push(@fields, {
"tab.field.form" => $self->_createField(\%data), "tab.field.form" => $self->_createField(\%data),
"tab.field.name" => $data{name}, "tab.field.name" => $data{name},
@ -464,7 +527,7 @@ sub getRecordTemplateVars {
"tab.field.isHidden" => $hidden, "tab.field.isHidden" => $hidden,
"tab.field.isDisplayed" => ($data{status} eq "visible" && !$hidden), "tab.field.isDisplayed" => ($data{status} eq "visible" && !$hidden),
"tab.field.isRequired" => ($data{status} eq "required" && !$hidden), "tab.field.isRequired" => ($data{status} eq "required" && !$hidden),
"tab.field.subtext" => $data{subtext}, "tab.field.subtext" => $subtext,
"tab.field.controls" => $self->_fieldAdminIcons($data{DataForm_fieldId},$data{DataForm_tabId},$data{isMailField}) "tab.field.controls" => $self->_fieldAdminIcons($data{DataForm_fieldId},$data{DataForm_tabId},$data{isMailField})
}); });
} }
@ -498,6 +561,9 @@ sub getRecordTemplateVars {
my $value = $data{value}; my $value = $data{value};
$value = $self->session->datetime->epochToHuman($value,"%z") if ($data{type} eq "date"); $value = $self->session->datetime->epochToHuman($value,"%z") if ($data{type} eq "date");
$value = $self->session->datetime->epochToHuman($value) if ($data{type} eq "dateTime"); $value = $self->session->datetime->epochToHuman($value) if ($data{type} eq "dateTime");
my $subtext = $data{subtext};
$subtext = sprintf("<a href='%s'>%s</a>",$self->getUrl('func=deleteAttachedFile;fieldId='.$data{DataForm_fieldId}), $i18n->get("delete file")) if ($data{type} eq "file" && $value);
my %fieldProperties = ( my %fieldProperties = (
"form" => $self->_createField(\%data), "form" => $self->_createField(\%data),
"name" => $data{name}, "name" => $data{name},
@ -509,7 +575,7 @@ sub getRecordTemplateVars {
"isHidden" => $hidden, "isHidden" => $hidden,
"isDisplayed" => ($data{status} eq "visible" && !$hidden), "isDisplayed" => ($data{status} eq "visible" && !$hidden),
"isRequired" => ($data{status} eq "required" && !$hidden), "isRequired" => ($data{status} eq "required" && !$hidden),
"subtext" => $data{subtext}, "subtext" => $subtext,
"controls" => $self->_fieldAdminIcons($data{DataForm_fieldId},$data{DataForm_tabId},$data{isMailField}) "controls" => $self->_fieldAdminIcons($data{DataForm_fieldId},$data{DataForm_tabId},$data{isMailField})
); );
push(@fields, { map {("field.".$_ => $fieldProperties{$_})} keys(%fieldProperties) }); push(@fields, { map {("field.".$_ => $fieldProperties{$_})} keys(%fieldProperties) });
@ -636,6 +702,7 @@ sub processPropertiesFromFormPost {
#------------------------------------------------------------------- #-------------------------------------------------------------------
sub purge { sub purge {
my $self = shift; my $self = shift;
$self->deleteAttachedFiles;
$self->session->db->write("delete from DataForm_field where assetId=".$self->session->db->quote($self->getId)); $self->session->db->write("delete from DataForm_field where assetId=".$self->session->db->quote($self->getId));
$self->session->db->write("delete from DataForm_entry where assetId=".$self->session->db->quote($self->getId)); $self->session->db->write("delete from DataForm_entry where assetId=".$self->session->db->quote($self->getId));
$self->session->db->write("delete from DataForm_entryData where assetId=".$self->session->db->quote($self->getId)); $self->session->db->write("delete from DataForm_entryData where assetId=".$self->session->db->quote($self->getId));
@ -647,6 +714,7 @@ sub purge {
sub sendEmail { sub sendEmail {
my $self = shift; my $self = shift;
my $var = shift; my $var = shift;
my $attachments;
my $message = $self->processTemplate($var,$self->get("emailTemplateId")); my $message = $self->processTemplate($var,$self->get("emailTemplateId"));
WebGUI::Macro::process($self->session,\$message); WebGUI::Macro::process($self->session,\$message);
my ($to, $subject, $from, $bcc, $cc); my ($to, $subject, $from, $bcc, $cc);
@ -663,10 +731,12 @@ sub sendEmail {
$subject = $row->{"field.value"}; $subject = $row->{"field.value"};
} }
} }
$attachments = $self->getAttachedFiles({returnType=>'attachments',entryId=>$var->{entryId}}) if $self->get("mailAttachments");
if ($to =~ /\@/) { if ($to =~ /\@/) {
my $mail = WebGUI::Mail::Send->create($self->session,{to=>$to, subject=>$subject, cc=>$cc, from=>$from, bcc=>$bcc}); my $mail = WebGUI::Mail::Send->create($self->session,{to=>$to, subject=>$subject, cc=>$cc, from=>$from, bcc=>$bcc});
$mail->addHtml($message); $mail->addHtml($message);
$mail->addFooter; $mail->addFooter;
map $mail->addAttachment($_), @{$attachments};
$mail->queue; $mail->queue;
} else { } else {
my ($userId) = $self->session->db->quickArray("select userId from users where username=".$self->session->db->quote($to)); my ($userId) = $self->session->db->quickArray("select userId from users where username=".$self->session->db->quote($to));
@ -688,12 +758,14 @@ sub sendEmail {
my $mail = WebGUI::Mail::Send->create($self->session,{to=>$cc, subject=>$subject, from=>$from}); my $mail = WebGUI::Mail::Send->create($self->session,{to=>$cc, subject=>$subject, from=>$from});
if ($cc) { if ($cc) {
$mail->addHtml($message); $mail->addHtml($message);
map $mail->addAttachment($_), @{$attachments};
$mail->addFooter; $mail->addFooter;
$mail->queue; $mail->queue;
} }
if ($bcc) { if ($bcc) {
WebGUI::Mail::Send->create($self->session, {to=>$bcc, subject=>$subject, from=>$from}); WebGUI::Mail::Send->create($self->session, {to=>$bcc, subject=>$subject, from=>$from});
$mail->addHtml($message); $mail->addHtml($message);
map $mail->addAttachment($_), @{$attachments};
$mail->addFooter; $mail->addFooter;
$mail->queue; $mail->queue;
} }
@ -736,12 +808,21 @@ sub www_deleteAllEntriesConfirm {
return $self->www_view; return $self->www_view;
} }
#-------------------------------------------------------------------
sub www_deleteAttachedFile {
my $self = shift;
my $fieldId = $self->session->form->process('fieldId');
return $self->session->privilege->insufficient() unless ($self->canEdit);
$self->deleteAttachedFiles($fieldId);
return $self->www_view;
}
#------------------------------------------------------------------- #-------------------------------------------------------------------
sub www_deleteEntry { sub www_deleteEntry {
my $self = shift; my $self = shift;
return $self->session->privilege->insufficient() unless $self->canEdit; return $self->session->privilege->insufficient() unless $self->canEdit;
my $entryId = $self->session->form->process("entryId"); my $entryId = $self->session->form->process("entryId");
$self->deleteAttachedFiles($entryId);
$self->deleteCollateral("DataForm_entry","DataForm_entryId",$entryId); $self->deleteCollateral("DataForm_entry","DataForm_entryId",$entryId);
$self->session->stow->set("mode","list"); $self->session->stow->set("mode","list");
return $self->www_view; return $self->www_view;
@ -840,7 +921,7 @@ sub www_editField {
-label=>$i18n->get(23), -label=>$i18n->get(23),
-hoverHelp=>$i18n->get('23 description'), -hoverHelp=>$i18n->get('23 description'),
-value=>$field{type} || "text", -value=>$field{type} || "text",
-types=>[qw(dateTime TimeField float zipcode text textarea HTMLArea url date email phone integer yesNo selectList radioList checkList selectBox)] -types=>[qw(dateTime TimeField float zipcode text textarea HTMLArea url date email phone integer yesNo selectList radioList checkList selectBox file)]
); );
$f->integer( $f->integer(
-name=>"width", -name=>"width",

View file

@ -46,6 +46,11 @@ our $HELP = {
description => '74 description', description => '74 description',
namespace => 'Asset_DataForm', namespace => 'Asset_DataForm',
}, },
{
title => 'mail attachments',
description => 'mail attachments description',
namespace => 'Asset_DataForm',
},
{ {
title => '744', title => '744',
description => '744 description', description => '744 description',

View file

@ -1,6 +1,24 @@
package WebGUI::i18n::English::Asset_DataForm; package WebGUI::i18n::English::Asset_DataForm;
our $I18N = { our $I18N = {
'delete file' => {
message => q|Delete Attached File|,
lastUpdated => 0,
context => 'label for link displayed to delete the contents of a file field on a form entry.',
},
'mail attachments' => {
message => q|Mail Attachments?|,
lastUpdated => 0,
context => 'label for wobject property',
},
'mail attachments description' => {
message => q|Must be used in conjuction with 'Mail Data'. Setting to yes will cause all files submitted via the file field type to be mailed as attachments.|,
lastUpdated => 0,
context => 'description of wobject property',
},
'group to view entries' => { 'group to view entries' => {
message => q|Group To View DataForm Entries|, message => q|Group To View DataForm Entries|,
lastUpdated => 1057208065 lastUpdated => 1057208065