diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt
index 9a0166116..4f6685fce 100644
--- a/docs/changelog/7.x.x.txt
+++ b/docs/changelog/7.x.x.txt
@@ -12,6 +12,10 @@
- Implemented codespace caching in WebGUI::International. This replaces the
in-memory cache by symbol table lookups into the code itself and saves
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
- fix: minor bug with new template vars in Auth::createAccount
diff --git a/docs/upgrades/upgrade_7.2.3-7.3.0.pl b/docs/upgrades/upgrade_7.2.3-7.3.0.pl
index e1da24188..aca692361 100644
--- a/docs/upgrades/upgrade_7.2.3-7.3.0.pl
+++ b/docs/upgrades/upgrade_7.2.3-7.3.0.pl
@@ -21,8 +21,15 @@ my $quiet; # this line required
my $session = start(); # this line required
addWikiAssets($session);
deleteOldFiles($session);
+addFileFieldsToDataForm($session);
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 {
diff --git a/lib/WebGUI/Asset/Wobject/DataForm.pm b/lib/WebGUI/Asset/Wobject/DataForm.pm
index e517f0cce..6f2639412 100644
--- a/lib/WebGUI/Asset/Wobject/DataForm.pm
+++ b/lib/WebGUI/Asset/Wobject/DataForm.pm
@@ -166,6 +166,10 @@ sub definition {
defaultValue=>0,
fieldType=>"yesNo"
},
+ mailAttachments=>{
+ defaultValue=>0,
+ fieldType=>'yesNo',
+ },
defaultView=>{
defaultValue=>0,
fieldType=>"integer"
@@ -179,6 +183,20 @@ sub 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 {
my $self = shift;
@@ -208,6 +226,40 @@ sub duplicate {
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("%s",$fileIcon,$fileUrl,$filename);
+ }
+ use Data::Dumper;
+ $self->session->errorHandler->warn("
".Dumper(\@paths).""); + return \@paths; +} + #------------------------------------------------------------------- sub getEditForm { my $self = shift; @@ -267,6 +319,13 @@ sub getEditForm { -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( -name=>"groupToViewEntries", -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"); while (my $record = $entries->hashRef) { 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})." order by b.sequenceNumber"); while (my $data = $dloop->hashRef) { + my $value = $data->{value}; + $value = $self->getAttachedFiles({returnType=>'link',storageId=>$value}) if ($value && $data->{type} eq 'file'); push(@dataLoop,{ "record.data.name"=>$data->{name}, "record.data.label"=>$data->{label}, - "record.data.value"=>$data->{value}, + "record.data.value"=>$value, "record.data.isMailField"=>$data->{isMailField} }); } @@ -454,6 +515,8 @@ sub getRecordTemplateVars { my $value = $data{value}; $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"); + my $subtext = $data{subtext}; + $subtext = sprintf("%s",$self->getUrl('func=deleteAttachedFile;fieldId='.$data{DataForm_fieldId}), $i18n->get("delete file")) if ($data{type} eq "file" && $value); push(@fields, { "tab.field.form" => $self->_createField(\%data), "tab.field.name" => $data{name}, @@ -464,7 +527,7 @@ sub getRecordTemplateVars { "tab.field.isHidden" => $hidden, "tab.field.isDisplayed" => ($data{status} eq "visible" && !$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}) }); } @@ -498,6 +561,9 @@ sub getRecordTemplateVars { my $value = $data{value}; $value = $self->session->datetime->epochToHuman($value,"%z") if ($data{type} eq "date"); $value = $self->session->datetime->epochToHuman($value) if ($data{type} eq "dateTime"); + my $subtext = $data{subtext}; + $subtext = sprintf("%s",$self->getUrl('func=deleteAttachedFile;fieldId='.$data{DataForm_fieldId}), $i18n->get("delete file")) if ($data{type} eq "file" && $value); + my %fieldProperties = ( "form" => $self->_createField(\%data), "name" => $data{name}, @@ -509,7 +575,7 @@ sub getRecordTemplateVars { "isHidden" => $hidden, "isDisplayed" => ($data{status} eq "visible" && !$hidden), "isRequired" => ($data{status} eq "required" && !$hidden), - "subtext" => $data{subtext}, + "subtext" => $subtext, "controls" => $self->_fieldAdminIcons($data{DataForm_fieldId},$data{DataForm_tabId},$data{isMailField}) ); push(@fields, { map {("field.".$_ => $fieldProperties{$_})} keys(%fieldProperties) }); @@ -636,6 +702,7 @@ sub processPropertiesFromFormPost { #------------------------------------------------------------------- sub purge { 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_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)); @@ -647,6 +714,7 @@ sub purge { sub sendEmail { my $self = shift; my $var = shift; + my $attachments; my $message = $self->processTemplate($var,$self->get("emailTemplateId")); WebGUI::Macro::process($self->session,\$message); my ($to, $subject, $from, $bcc, $cc); @@ -663,10 +731,12 @@ sub sendEmail { $subject = $row->{"field.value"}; } } + $attachments = $self->getAttachedFiles({returnType=>'attachments',entryId=>$var->{entryId}}) if $self->get("mailAttachments"); if ($to =~ /\@/) { my $mail = WebGUI::Mail::Send->create($self->session,{to=>$to, subject=>$subject, cc=>$cc, from=>$from, bcc=>$bcc}); $mail->addHtml($message); $mail->addFooter; + map $mail->addAttachment($_), @{$attachments}; $mail->queue; } else { 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}); if ($cc) { $mail->addHtml($message); + map $mail->addAttachment($_), @{$attachments}; $mail->addFooter; $mail->queue; } if ($bcc) { WebGUI::Mail::Send->create($self->session, {to=>$bcc, subject=>$subject, from=>$from}); $mail->addHtml($message); + map $mail->addAttachment($_), @{$attachments}; $mail->addFooter; $mail->queue; } @@ -736,12 +808,21 @@ sub www_deleteAllEntriesConfirm { 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 { my $self = shift; return $self->session->privilege->insufficient() unless $self->canEdit; my $entryId = $self->session->form->process("entryId"); + $self->deleteAttachedFiles($entryId); $self->deleteCollateral("DataForm_entry","DataForm_entryId",$entryId); $self->session->stow->set("mode","list"); return $self->www_view; @@ -840,7 +921,7 @@ sub www_editField { -label=>$i18n->get(23), -hoverHelp=>$i18n->get('23 description'), -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( -name=>"width", diff --git a/lib/WebGUI/Help/Asset_DataForm.pm b/lib/WebGUI/Help/Asset_DataForm.pm index 615b8bedb..6a8e31cd8 100644 --- a/lib/WebGUI/Help/Asset_DataForm.pm +++ b/lib/WebGUI/Help/Asset_DataForm.pm @@ -46,6 +46,11 @@ our $HELP = { description => '74 description', namespace => 'Asset_DataForm', }, + { + title => 'mail attachments', + description => 'mail attachments description', + namespace => 'Asset_DataForm', + }, { title => '744', description => '744 description', diff --git a/lib/WebGUI/i18n/English/Asset_DataForm.pm b/lib/WebGUI/i18n/English/Asset_DataForm.pm index f203f2220..4b7d49033 100644 --- a/lib/WebGUI/i18n/English/Asset_DataForm.pm +++ b/lib/WebGUI/i18n/English/Asset_DataForm.pm @@ -1,6 +1,24 @@ package WebGUI::i18n::English::Asset_DataForm; 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' => { message => q|Group To View DataForm Entries|, lastUpdated => 1057208065