From 2cdc12cce8bb1ea900152b80db7c31afc75af423 Mon Sep 17 00:00:00 2001 From: "deb.monish" Date: Mon, 3 Oct 2016 13:41:17 +0530 Subject: [PATCH] CRM-19294: Unable to upload files via a contribution page (backport 4.6 PR) --- CRM/Contribute/Form/ContributionBase.php | 24 ++++++++++++-- CRM/Core/BAO/CustomField.php | 11 ++----- CRM/Core/Page/File.php | 18 ++++++++--- CRM/Utils/File.php | 40 ++++++++++++++++++++++++ templates/CRM/UF/Form/Block.tpl | 18 +++++++++-- 5 files changed, 94 insertions(+), 17 deletions(-) diff --git a/CRM/Contribute/Form/ContributionBase.php b/CRM/Contribute/Form/ContributionBase.php index 5661011c3f..68a3c2ae69 100644 --- a/CRM/Contribute/Form/ContributionBase.php +++ b/CRM/Contribute/Form/ContributionBase.php @@ -715,13 +715,29 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form { CRM_Core_BAO_Address::checkContactSharedAddressFields($fields, $contactID); $addCaptcha = FALSE; + $viewOnlyFileValues = empty($profileContactType) ? array() : array($profileContactType => array()); + // fetch file preview when not submitted yet, like in online contribution Confirm and ThankYou page foreach ($fields as $key => $field) { if ($viewOnly && isset($field['data_type']) && $field['data_type'] == 'File' || ($viewOnly && $field['name'] == 'image_URL') ) { - // ignore file upload fields - continue; + //retrieve file value from submitted values on basis of $profileContactType + $fileValue = empty($profileContactType) ? CRM_Utils_Array::value($key, $this->_params) : CRM_Utils_Array::value(sprintf('%s[%s]', $profileContactType, $key), $this->_params); + + if ($fileValue) { + $path = CRM_Utils_Array::value('name', $fileValue); + $fileType = CRM_Utils_Array::value('type', $fileValue); + $fileValue = CRM_Utils_File::getFileURL($path, $fileType); + } + + // format custom file value fetched from submitted value + if ($profileContactType) { + $viewOnlyFileValues[$profileContactType][$key] = $fileValue; + } + else { + $viewOnlyFileValues[$key] = $fileValue; + } } if ($profileContactType) { @@ -771,6 +787,10 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form { $this->assign($name, $fields); + if (count($viewOnlyFileValues)) { + $this->assign('viewOnlyFileValues', $viewOnlyFileValues); + } + if ($addCaptcha && !$viewOnly) { $captcha = CRM_Utils_ReCAPTCHA::singleton(); $captcha->add($this); diff --git a/CRM/Core/BAO/CustomField.php b/CRM/Core/BAO/CustomField.php index 717459a10e..9c6beae7a5 100644 --- a/CRM/Core/BAO/CustomField.php +++ b/CRM/Core/BAO/CustomField.php @@ -1508,18 +1508,13 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField { 'id' ); list($path) = CRM_Core_BAO_File::path($fileID, $entityId, NULL, NULL); - list($imageWidth, $imageHeight) = getimagesize($path); - list($imageThumbWidth, $imageThumbHeight) = CRM_Contact_BAO_Contact::getThumbSize($imageWidth, $imageHeight); $url = CRM_Utils_System::url('civicrm/file', "reset=1&id=$fileID&eid=$contactID", $absolute, NULL, TRUE, TRUE ); - $result['file_url'] = " - - - "; - // for non image files + $result['file_url'] = CRM_Utils_File::getFileURL($path, $fileType, $url); } + // for non image files else { $uri = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_File', $fileID, @@ -1529,7 +1524,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField { "reset=1&id=$fileID&eid=$contactID", $absolute, NULL, TRUE, TRUE ); - $result['file_url'] = "{$uri}"; + $result['file_url'] = CRM_Utils_File::getFileURL($uri, $fileType, $url); } } return $result; diff --git a/CRM/Core/Page/File.php b/CRM/Core/Page/File.php index d8e6900fb0..39e4c2146d 100644 --- a/CRM/Core/Page/File.php +++ b/CRM/Core/Page/File.php @@ -35,13 +35,21 @@ class CRM_Core_Page_File extends CRM_Core_Page { public function run() { - $eid = CRM_Utils_Request::retrieve('eid', 'Positive', $this, TRUE); - $fid = CRM_Utils_Request::retrieve('fid', 'Positive', $this, FALSE); - $id = CRM_Utils_Request::retrieve('id', 'Positive', $this, TRUE); - $quest = CRM_Utils_Request::retrieve('quest', 'String', $this); + $fileName = CRM_Utils_Request::retrieve('filename', 'String', $this); + $path = CRM_Core_Config::singleton()->customFileUploadDir . $fileName; + $mimeType = CRM_Utils_Request::retrieve('mime-type', 'String', $this); $action = CRM_Utils_Request::retrieve('action', 'String', $this); - list($path, $mimeType) = CRM_Core_BAO_File::path($id, $eid, NULL, $quest); + // if we are not providing essential parameter needed for file preview then + if (empty($fileName) && empty($mimeType)) { + $eid = CRM_Utils_Request::retrieve('eid', 'Positive', $this, TRUE); + $fid = CRM_Utils_Request::retrieve('fid', 'Positive', $this, FALSE); + $id = CRM_Utils_Request::retrieve('id', 'Positive', $this, TRUE); + $quest = CRM_Utils_Request::retrieve('quest', 'String', $this); + + list($path, $mimeType) = CRM_Core_BAO_File::path($id, $eid, NULL, $quest); + } + if (!$path) { CRM_Core_Error::statusBounce('Could not retrieve the file'); } diff --git a/CRM/Utils/File.php b/CRM/Utils/File.php index 3eeddf4d36..48607588d1 100644 --- a/CRM/Utils/File.php +++ b/CRM/Utils/File.php @@ -749,4 +749,44 @@ HTACCESS; return TRUE; } + /** + * Return formatted file URL, like for image file return image url with image icon + * + * @param string $path + * Absoulte file path + * @param string $fileType + * @param string $url + * File preview link e.g. https://example.com/civicrm/file?reset=1&filename=image.png&mime-type=image/png + * + * @return string $url + */ + public static function getFileURL($path, $fileType, $url = NULL) { + if (empty($path) || empty($fileType)) { + return ''; + } + elseif (empty($url)) { + $fileName = basename($path); + $url = CRM_Utils_System::url('civicrm/file', "reset=1&filename={$fileName}&mime-type={$fileType}"); + } + switch ($fileType) { + case 'image/jpeg': + case 'image/pjpeg': + case 'image/gif': + case 'image/x-png': + case 'image/png': + list($imageWidth, $imageHeight) = getimagesize($path); + list($imageThumbWidth, $imageThumbHeight) = CRM_Contact_BAO_Contact::getThumbSize($imageWidth, $imageHeight); + $url = " + + "; + break; + + default: + $url = sprintf('%s', $url, basename($path)); + break; + } + + return $url; + } + } diff --git a/templates/CRM/UF/Form/Block.tpl b/templates/CRM/UF/Form/Block.tpl index 627c34923f..80c24bdf58 100644 --- a/templates/CRM/UF/Form/Block.tpl +++ b/templates/CRM/UF/Form/Block.tpl @@ -108,7 +108,11 @@ {else}
- {if $prefix}{$form.$prefix.$n.label}{else}{$form.$n.label}{/if} + {if $prefix} + {$form.$prefix.$n.label} + {else} + {$form.$n.label} + {/if}
{if $n|substr:0:3 eq 'im-'} @@ -131,8 +135,18 @@ {if $form.$phone_ext_field.html}  {$form.$phone_ext_field.html} {/if} + {elseif $field.html_type eq 'File' && ($viewOnlyFileValues.$n OR $viewOnlyFileValues.$prefix)} + {if $prefix} + {$viewOnlyFileValues.$prefix.$n} + {else} + {$viewOnlyFileValues.$n} + {/if} {else} - {if $prefix}{$form.$prefix.$n.html}{else}{$form.$n.html}{/if} + {if $prefix} + {$form.$prefix.$n.html} + {else} + {$form.$n.html} + {/if} {/if} {*CRM-4564*} -- 2.25.1