X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCore%2FBAO%2FFile.php;h=3f0f0c3ccf590152d007ea90ca3a50f13ee5ef40;hb=5fb0ca0d95d05c3ade12f75226a748a357848511;hp=475f668c669d178d28b3e09a0d5aac0648fc3694;hpb=ac30252393b3b9d8162994f59bb63e2b89ddacdc;p=civicrm-core.git diff --git a/CRM/Core/BAO/File.php b/CRM/Core/BAO/File.php index 475f668c66..3f0f0c3ccf 100644 --- a/CRM/Core/BAO/File.php +++ b/CRM/Core/BAO/File.php @@ -1,515 +1,595 @@ entity_table = $entityTable; - } - $entityFileDAO->entity_id = $entityID; - $entityFileDAO->file_id = $fileID; - - if ($entityFileDAO->find(TRUE)) { - $fileDAO = new CRM_Core_DAO_File(); - $fileDAO->id = $fileID; - if ($fileDAO->find(TRUE)) { - $config = CRM_Core_Config::singleton(); - $path = $config->customFileUploadDir . $fileDAO->uri; - - if (file_exists($path) && is_readable($path)) { - return array($path, $fileDAO->mime_type); - } - } - } - - return array(NULL, NULL); - } - - - static function filePostProcess( - $data, - $fileTypeID, - $entityTable, - $entityID, - $entitySubtype, - $overwrite = TRUE, - $fileParams = NULL, - $uploadName = 'uploadFile', - $mimeType = null - ) { - if (!$mimeType) { - CRM_Core_Error::fatal(ts('Mime Type is now a required parameter')); - } - - $config = CRM_Core_Config::singleton(); - - $path = explode('/', $data); - $filename = $path[count($path) - 1]; - - // rename this file to go into the secure directory - if ($entitySubtype) { - $directoryName = $config->customFileUploadDir . $entitySubtype . DIRECTORY_SEPARATOR . $entityID; - } - else { - $directoryName = $config->customFileUploadDir; - } - - CRM_Utils_File::createDir($directoryName); - - if (!rename($data, $directoryName . DIRECTORY_SEPARATOR . $filename)) { - CRM_Core_Error::fatal(ts('Could not move custom file to custom upload directory')); - break; - } - - // to get id's - if ($overwrite && $fileTypeID) { - list($sql, $params) = self::sql($entityTable, $entityID, $fileTypeID); - } - else { - list($sql, $params) = self::sql($entityTable, $entityID, 0); - } - - $dao = CRM_Core_DAO::executeQuery($sql, $params); - $dao->fetch(); - - $fileDAO = new CRM_Core_DAO_File(); - $op = 'create'; - if (isset($dao->cfID) && $dao->cfID) { - $op = 'edit'; - $fileDAO->id = $dao->cfID; - unlink($directoryName . DIRECTORY_SEPARATOR . $dao->uri); - } - - if (!empty($fileParams)) { - $fileDAO->copyValues($fileParams); - } - - $fileDAO->uri = $filename; - $fileDAO->mime_type = $mimeType; - $fileDAO->file_type_id = $fileTypeID; - $fileDAO->upload_date = date('Ymdhis'); - $fileDAO->save(); - - // need to add/update civicrm_entity_file - $entityFileDAO = new CRM_Core_DAO_EntityFile(); - if (isset($dao->cefID) && $dao->cefID) { - $entityFileDAO->id = $dao->cefID; - } - $entityFileDAO->entity_table = $entityTable; - $entityFileDAO->entity_id = $entityID; - $entityFileDAO->file_id = $fileDAO->id; - $entityFileDAO->save(); - - //save static tags - if (!empty($fileParams['tag'])) { - CRM_Core_BAO_EntityTag::create($fileParams['tag'], 'civicrm_file', $entityFileDAO->id); - } - - //save free tags - if (isset($fileParams['attachment_taglist']) && !empty($fileParams['attachment_taglist'])) { - CRM_Core_Form_Tag::postProcess($fileParams['attachment_taglist'], $entityFileDAO->id, 'civicrm_file', CRM_Core_DAO::$_nullObject); - } - - // lets call the post hook here so attachments code can do the right stuff - CRM_Utils_Hook::post($op, 'File', $fileDAO->id, $fileDAO); - } - - /** - * A static function wrapper that deletes the various objects that are - * connected to a file object (i.e. file, entityFile and customValue - */ - public static function deleteFileReferences($fileID, $entityID, $fieldID) { - $fileDAO = new CRM_Core_DAO_File(); - $fileDAO->id = $fileID; - if (!$fileDAO->find(TRUE)) { - CRM_Core_Error::fatal(); - } - - // lets call a pre hook before the delete, so attachments hooks can get the info before things - // disappear - CRM_Utils_Hook::pre('delete', 'File', $fileID, $fileDAO); - - // get the table and column name - list($tableName, $columnName, $groupID) = CRM_Core_BAO_CustomField::getTableColumnGroup($fieldID); - - $entityFileDAO = new CRM_Core_DAO_EntityFile(); - $entityFileDAO->file_id = $fileID; - $entityFileDAO->entity_id = $entityID; - $entityFileDAO->entity_table = $tableName; - - if (!$entityFileDAO->find(TRUE)) { - CRM_Core_Error::fatal(); - } - - $entityFileDAO->delete(); - $fileDAO->delete(); - - // also set the value to null of the table and column - $query = "UPDATE $tableName SET $columnName = null WHERE $columnName = %1"; - $params = array(1 => array($fileID, 'Integer')); - CRM_Core_DAO::executeQuery($query, $params); - } - - /** - * The $useWhere is used so that the signature matches the parent class - */ - public function delete($useWhere = false) { - list($fileID, $entityID, $fieldID) = func_get_args(); - - self::deleteFileReferences($fileID, $entityID, $fieldID); - } - - /** - * delete all the files and associated object associated with this - * combination - */ - static function deleteEntityFile($entityTable, $entityID, $fileTypeID = NULL, $fileID = NULL) { - if (empty($entityTable) || empty($entityID)) { - return; - } - - $config = CRM_Core_Config::singleton(); - - list($sql, $params) = self::sql($entityTable, $entityID, $fileTypeID, $fileID); - $dao = CRM_Core_DAO::executeQuery($sql, $params); - - $cfIDs = array(); - $cefIDs = array(); - while ($dao->fetch()) { - $cfIDs[$dao->cfID] = $dao->uri; - $cefIDs[] = $dao->cefID; - } - - if (!empty($cefIDs)) { - $cefIDs = implode(',', $cefIDs); - $sql = "DELETE FROM civicrm_entity_file where id IN ( $cefIDs )"; - CRM_Core_DAO::executeQuery($sql); - } - - if (!empty($cfIDs)) { - // Delete file only if there no any entity using this file. - $deleteFiles = array(); - foreach ($cfIDs as $fId => $fUri) { - //delete tags from entity tag table - $tagParams = array( - 'entity_table' => 'civicrm_file', - 'entity_id' => $fId - ); - - CRM_Core_BAO_EntityTag::del($tagParams); - - if (!CRM_Core_DAO::getFieldValue('CRM_Core_DAO_EntityFile', $fId, 'id', 'file_id')) { - unlink($config->customFileUploadDir . DIRECTORY_SEPARATOR . $fUri); - $deleteFiles[$fId] = $fId; - } - } - - if (!empty($deleteFiles)) { - $deleteFiles = implode(',', $deleteFiles); - $sql = "DELETE FROM civicrm_file where id IN ( $deleteFiles )"; - CRM_Core_DAO::executeQuery($sql); - } - } - } - - /** - * get all the files and associated object associated with this - * combination - */ - static function getEntityFile($entityTable, $entityID, $addDeleteArgs = false) { - if (empty($entityTable) || !$entityID) { - $results = NULL; - return $results; - } - - $config = CRM_Core_Config::singleton(); - - list($sql, $params) = self::sql($entityTable, $entityID, NULL); - $dao = CRM_Core_DAO::executeQuery($sql, $params); - $results = array(); - while ($dao->fetch()) { - $result['fileID'] = $dao->cfID; - $result['entityID'] = $dao->cefID; - $result['mime_type'] = $dao->mime_type; - $result['fileName'] = $dao->uri; - $result['description'] = $dao->description; - $result['cleanName'] = CRM_Utils_File::cleanFileName($dao->uri); - $result['fullPath'] = $config->customFileUploadDir . DIRECTORY_SEPARATOR . $dao->uri; - $result['url'] = CRM_Utils_System::url('civicrm/file', "reset=1&id={$dao->cfID}&eid={$entityID}"); - $result['href'] = "{$result['cleanName']}"; - $result['tag'] = CRM_Core_BAO_EntityTag::getTag($dao->cfID, 'civicrm_file'); - if ($addDeleteArgs) { - $result['deleteURLArgs'] = self::deleteURLArgs($entityTable, $entityID, $dao->cfID); - } - $results[$dao->cfID] = $result; - } - - //fix tag names - $tags = CRM_Core_PseudoConstant::get('CRM_Core_DAO_EntityTag', 'tag_id', array('onlyActive' => FALSE)); - - foreach($results as &$values) { - if (!empty($values['tag'])) { - $tagNames = array(); - foreach( $values['tag'] as $tid ) { - $tagNames[] = $tags[$tid]; - } - $values['tag'] = implode(', ', $tagNames); - } else { - $values['tag'] = ''; - } - } - - $dao->free(); - return $results; - } - - static function sql($entityTable, $entityID, $fileTypeID = NULL, $fileID = NULL) { - $sql = " - SELECT CF.id as cfID, +/** + * BAO object for crm_log table + */ +class CRM_Core_BAO_File extends CRM_Core_DAO_File { + + static $_signableFields = array('entityTable', 'entityID', 'fileID'); + + /** + * @param $fileID + * @param $entityID + * @param null $entityTable + * + * @return array + */ + static function path($fileID, $entityID, $entityTable = NULL) { + $entityFileDAO = new CRM_Core_DAO_EntityFile(); + if ($entityTable) { + $entityFileDAO->entity_table = $entityTable; + } + $entityFileDAO->entity_id = $entityID; + $entityFileDAO->file_id = $fileID; + + if ($entityFileDAO->find(TRUE)) { + $fileDAO = new CRM_Core_DAO_File(); + $fileDAO->id = $fileID; + if ($fileDAO->find(TRUE)) { + $config = CRM_Core_Config::singleton(); + $path = $config->customFileUploadDir . $fileDAO->uri; + + if (file_exists($path) && is_readable($path)) { + return array($path, $fileDAO->mime_type); + } + } + } + + return array(NULL, NULL); + } + + + /** + * @param $data + * @param $fileTypeID + * @param $entityTable + * @param $entityID + * @param $entitySubtype + * @param bool $overwrite + * @param null|array $fileParams + * @param string $uploadName + * @param null $mimeType + * + * @throws Exception + */ + static function filePostProcess( + $data, + $fileTypeID, + $entityTable, + $entityID, + $entitySubtype, + $overwrite = TRUE, + $fileParams = NULL, + $uploadName = 'uploadFile', + $mimeType = NULL + ) { + if (!$mimeType) { + CRM_Core_Error::fatal(ts('Mime Type is now a required parameter')); + } + + $config = CRM_Core_Config::singleton(); + + $path = explode('/', $data); + $filename = $path[count($path) - 1]; + + // rename this file to go into the secure directory + if ($entitySubtype) { + $directoryName = $config->customFileUploadDir . $entitySubtype . DIRECTORY_SEPARATOR . $entityID; + } + else { + $directoryName = $config->customFileUploadDir; + } + + CRM_Utils_File::createDir($directoryName); + + if (!rename($data, $directoryName . DIRECTORY_SEPARATOR . $filename)) { + CRM_Core_Error::fatal(ts('Could not move custom file to custom upload directory')); + } + + // to get id's + if ($overwrite && $fileTypeID) { + list($sql, $params) = self::sql($entityTable, $entityID, $fileTypeID); + } + else { + list($sql, $params) = self::sql($entityTable, $entityID, 0); + } + + $dao = CRM_Core_DAO::executeQuery($sql, $params); + $dao->fetch(); + + $fileDAO = new CRM_Core_DAO_File(); + $op = 'create'; + if (isset($dao->cfID) && $dao->cfID) { + $op = 'edit'; + $fileDAO->id = $dao->cfID; + unlink($directoryName . DIRECTORY_SEPARATOR . $dao->uri); + } + + if (!empty($fileParams)) { + $fileDAO->copyValues($fileParams); + } + + $fileDAO->uri = $filename; + $fileDAO->mime_type = $mimeType; + $fileDAO->file_type_id = $fileTypeID; + $fileDAO->upload_date = date('Ymdhis'); + $fileDAO->save(); + + // need to add/update civicrm_entity_file + $entityFileDAO = new CRM_Core_DAO_EntityFile(); + if (isset($dao->cefID) && $dao->cefID) { + $entityFileDAO->id = $dao->cefID; + } + $entityFileDAO->entity_table = $entityTable; + $entityFileDAO->entity_id = $entityID; + $entityFileDAO->file_id = $fileDAO->id; + $entityFileDAO->save(); + + //save static tags + if (!empty($fileParams['tag'])) { + CRM_Core_BAO_EntityTag::create($fileParams['tag'], 'civicrm_file', $entityFileDAO->id); + } + + //save free tags + if (isset($fileParams['attachment_taglist']) && !empty($fileParams['attachment_taglist'])) { + CRM_Core_Form_Tag::postProcess($fileParams['attachment_taglist'], $entityFileDAO->id, 'civicrm_file', CRM_Core_DAO::$_nullObject); + } + + // lets call the post hook here so attachments code can do the right stuff + CRM_Utils_Hook::post($op, 'File', $fileDAO->id, $fileDAO); + } + + /** + * A static function wrapper that deletes the various objects that are + * connected to a file object (i.e. file, entityFile and customValue + */ + public static function deleteFileReferences($fileID, $entityID, $fieldID) { + $fileDAO = new CRM_Core_DAO_File(); + $fileDAO->id = $fileID; + if (!$fileDAO->find(TRUE)) { + CRM_Core_Error::fatal(); + } + + // lets call a pre hook before the delete, so attachments hooks can get the info before things + // disappear + CRM_Utils_Hook::pre('delete', 'File', $fileID, $fileDAO); + + // get the table and column name + list($tableName, $columnName, $groupID) = CRM_Core_BAO_CustomField::getTableColumnGroup($fieldID); + + $entityFileDAO = new CRM_Core_DAO_EntityFile(); + $entityFileDAO->file_id = $fileID; + $entityFileDAO->entity_id = $entityID; + $entityFileDAO->entity_table = $tableName; + + if (!$entityFileDAO->find(TRUE)) { + CRM_Core_Error::fatal(); + } + + $entityFileDAO->delete(); + $fileDAO->delete(); + + // also set the value to null of the table and column + $query = "UPDATE $tableName SET $columnName = null WHERE $columnName = %1"; + $params = array(1 => array($fileID, 'Integer')); + CRM_Core_DAO::executeQuery($query, $params); + } + + /** + * The $useWhere is used so that the signature matches the parent class + */ + public function delete($useWhere = FALSE) { + list($fileID, $entityID, $fieldID) = func_get_args(); + + self::deleteFileReferences($fileID, $entityID, $fieldID); + } + + /** + * delete all the files and associated object associated with this + * combination + */ + static function deleteEntityFile($entityTable, $entityID, $fileTypeID = NULL, $fileID = NULL) { + if (empty($entityTable) || empty($entityID)) { + return; + } + + $config = CRM_Core_Config::singleton(); + + list($sql, $params) = self::sql($entityTable, $entityID, $fileTypeID, $fileID); + $dao = CRM_Core_DAO::executeQuery($sql, $params); + + $cfIDs = array(); + $cefIDs = array(); + while ($dao->fetch()) { + $cfIDs[$dao->cfID] = $dao->uri; + $cefIDs[] = $dao->cefID; + } + + if (!empty($cefIDs)) { + $cefIDs = implode(',', $cefIDs); + $sql = "DELETE FROM civicrm_entity_file where id IN ( $cefIDs )"; + CRM_Core_DAO::executeQuery($sql); + } + + if (!empty($cfIDs)) { + // Delete file only if there no any entity using this file. + $deleteFiles = array(); + foreach ($cfIDs as $fId => $fUri) { + //delete tags from entity tag table + $tagParams = array( + 'entity_table' => 'civicrm_file', + 'entity_id' => $fId + ); + + CRM_Core_BAO_EntityTag::del($tagParams); + + if (!CRM_Core_DAO::getFieldValue('CRM_Core_DAO_EntityFile', $fId, 'id', 'file_id')) { + unlink($config->customFileUploadDir . DIRECTORY_SEPARATOR . $fUri); + $deleteFiles[$fId] = $fId; + } + } + + if (!empty($deleteFiles)) { + $deleteFiles = implode(',', $deleteFiles); + $sql = "DELETE FROM civicrm_file where id IN ( $deleteFiles )"; + CRM_Core_DAO::executeQuery($sql); + } + } + } + + /** + * get all the files and associated object associated with this + * combination + */ + static function getEntityFile($entityTable, $entityID, $addDeleteArgs = FALSE) { + if (empty($entityTable) || !$entityID) { + $results = NULL; + return $results; + } + + $config = CRM_Core_Config::singleton(); + + list($sql, $params) = self::sql($entityTable, $entityID, NULL); + $dao = CRM_Core_DAO::executeQuery($sql, $params); + $results = array(); + while ($dao->fetch()) { + $result['fileID'] = $dao->cfID; + $result['entityID'] = $dao->cefID; + $result['mime_type'] = $dao->mime_type; + $result['fileName'] = $dao->uri; + $result['description'] = $dao->description; + $result['cleanName'] = CRM_Utils_File::cleanFileName($dao->uri); + $result['fullPath'] = $config->customFileUploadDir . DIRECTORY_SEPARATOR . $dao->uri; + $result['url'] = CRM_Utils_System::url('civicrm/file', "reset=1&id={$dao->cfID}&eid={$dao->entity_id}"); + $result['href'] = "{$result['cleanName']}"; + $result['tag'] = CRM_Core_BAO_EntityTag::getTag($dao->cfID, 'civicrm_file'); + if ($addDeleteArgs) { + $result['deleteURLArgs'] = self::deleteURLArgs($dao->entity_table, $dao->entity_id, $dao->cfID); + } + $results[$dao->cfID] = $result; + } + + //fix tag names + $tags = CRM_Core_PseudoConstant::get('CRM_Core_DAO_EntityTag', 'tag_id', array('onlyActive' => FALSE)); + + foreach ($results as &$values) { + if (!empty($values['tag'])) { + $tagNames = array(); + foreach ($values['tag'] as $tid) { + $tagNames[] = $tags[$tid]; + } + $values['tag'] = implode(', ', $tagNames); + } + else { + $values['tag'] = ''; + } + } + + $dao->free(); + return $results; + } + + /** + * @param string $entityTable table-name or "*" (to reference files directly by file-id) + * @param int $entityID + * @param null $fileTypeID + * @param null $fileID + * + * @return array + */ + static function sql($entityTable, $entityID, $fileTypeID = NULL, $fileID = NULL) { + if ($entityTable == '*') { + // $entityID is the ID of a specific file + $sql = " +SELECT CF.id as cfID, + CF.uri as uri, + CF.mime_type as mime_type, + CF.description as description, + CEF.id as cefID, + CEF.entity_table as entity_table, + CEF.entity_id as entity_id +FROM civicrm_file AS CF +LEFT JOIN civicrm_entity_file AS CEF ON ( CEF.file_id = CF.id ) +WHERE CF.id = %2"; + + } else { + $sql = " +SELECT CF.id as cfID, CF.uri as uri, CF.mime_type as mime_type, CF.description as description, - CEF.id as cefID - FROM civicrm_file AS CF - LEFT JOIN civicrm_entity_file AS CEF ON ( CEF.file_id = CF.id ) - WHERE CEF.entity_table = %1 - AND CEF.entity_id = %2"; - - $params = array( - 1 => array($entityTable, 'String'), - 2 => array($entityID, 'Integer'), - ); - - if ($fileTypeID !== NULL) { - $sql .= " AND CF.file_type_id = %3"; - $params[3] = array($fileTypeID, 'Integer'); - } - - if ($fileID !== NULL) { - $sql .= " AND CF.id = %4"; - $params[4] = array($fileID, 'Integer'); - } - - return array($sql, $params); - } - - static function buildAttachment(&$form, $entityTable, $entityID = NULL, $numAttachments = NULL, $ajaxDelete = FALSE) { - - if (!$numAttachments) { - $numAttachments = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'max_attachments'); - } - // Assign maxAttachments count to template for help message - $form->assign('maxAttachments', $numAttachments); - - $config = CRM_Core_Config::singleton(); - // set default max file size as 2MB - $maxFileSize = $config->maxFileSize ? $config->maxFileSize : 2; - - $currentAttachmentInfo = self::getEntityFile($entityTable, $entityID, TRUE); - $totalAttachments = 0; - if ($currentAttachmentInfo) { - $totalAttachments = count($currentAttachmentInfo); - $form->add('checkbox', 'is_delete_attachment', ts('Delete All Attachment(s)')); - $form->assign('currentAttachmentInfo', $currentAttachmentInfo); - } - else { - $form->assign('currentAttachmentInfo', NULL); - } - - if ( $totalAttachments ) { - if ($totalAttachments >= $numAttachments) { - $numAttachments = 0; - } - else { - $numAttachments -= $totalAttachments; - } - } - - $form->assign('numAttachments', $numAttachments); - - $tags = CRM_Core_BAO_Tag::getTags('civicrm_file'); - - // get tagset info - $parentNames = CRM_Core_BAO_Tag::getTagSet('civicrm_file'); - - // add attachments - for ($i = 1; $i <= $numAttachments; $i++) { - $form->addElement('file', "attachFile_$i", ts('Attach File'), 'size=30 maxlength=60'); - $form->addUploadElement("attachFile_$i"); - $form->setMaxFileSize($maxFileSize * 1024 * 1024); - $form->addRule("attachFile_$i", - ts('File size should be less than %1 MByte(s)', - array(1 => $maxFileSize) - ), - 'maxfilesize', - $maxFileSize * 1024 * 1024 - ); - $form->addElement('text', "attachDesc_$i", ts('Description'), 'size=40 maxlength=255'); - - if (!empty($tags)) { - $form->add('select', "tag_$i", ts('Tags'), $tags, FALSE, - array('id' => "tags_$i", 'multiple' => 'multiple', 'class' => 'crm-select2') - ); - } - } - - // build tagset widget - CRM_Core_Form_Tag::buildQuickForm($form, $parentNames, 'civicrm_file', NULL, TRUE, TRUE, FALSE); - } - - /** - * Function to return a clean url string and the number of attachment for a - * given entityTable, entityID - * - * @param $entityTable string The entityTable to which the file is attached - * @param $entityID int The id of the object in the above entityTable - * @param $separator string The string separator where to implode the urls - * - * @return array An array with 2 elements. The string and the number of attachments - * @static - */ - static function attachmentInfo($entityTable, $entityID, $separator = '
') { - if (!$entityID) { - return NULL; - } - - $currentAttachments = self::getEntityFile($entityTable, $entityID); - if (!empty($currentAttachments)) { - $currentAttachmentURL = array(); - foreach ($currentAttachments as $fileID => $attach) { - $currentAttachmentURL[] = $attach['href']; - } - return implode($separator, $currentAttachmentURL); - } - return NULL; - } - - static function formatAttachment( - &$formValues, - &$params, - $entityTable, - $entityID = NULL - ) { - - // delete current attachments if applicable - if ($entityID && !empty($formValues['is_delete_attachment'])) { - CRM_Core_BAO_File::deleteEntityFile($entityTable, $entityID); - } - - $numAttachments = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'max_attachments'); - - $now = date('Ymdhis'); - - // setup all attachments - for ($i = 1; $i <= $numAttachments; $i++) { - $attachName = "attachFile_$i"; - $attachDesc = "attachDesc_$i"; - $attachTags = "tag_$i"; - $attachFreeTags = "attachment_taglist_$i"; - if (isset($formValues[$attachName]) && !empty($formValues[$attachName])) { - // add static tags if selects - $tagParams = array(); - if (!empty($formValues[$attachTags])) { - foreach ($formValues[$attachTags] as $tag) { - $tagParams[$tag] = 1; - } - } - - // we dont care if the file is empty or not - // CRM-7448 - $fileParams = array( - 'uri' => $formValues[$attachName]['name'], - 'type' => $formValues[$attachName]['type'], - 'location' => $formValues[$attachName]['name'], - 'description' => $formValues[$attachDesc], - 'upload_date' => $now, - 'tag' => $tagParams, - 'attachment_taglist' => CRM_Utils_Array::value($attachFreeTags, $formValues, array()) - ); - - $params[$attachName] = $fileParams; - } - } - } - - static function processAttachment(&$params, $entityTable, $entityID) { - $numAttachments = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'max_attachments'); - - for ($i = 1; $i <= $numAttachments; $i++) { - if ( - isset($params["attachFile_$i"]) && - is_array($params["attachFile_$i"]) - ) { - self::filePostProcess( - $params["attachFile_$i"]['location'], - NULL, - $entityTable, - $entityID, - NULL, - TRUE, - $params["attachFile_$i"], - "attachFile_$i", - $params["attachFile_$i"]['type'] - ); - } - } - } - - static function uploadNames() { - $numAttachments = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'max_attachments'); - - $names = array(); - for ($i = 1; $i <= $numAttachments; $i++) { - $names[] = "attachFile_{$i}"; - } - $names[] = 'uploadFile'; - return $names; - } - - /* - * Function to copy/attach an existing file to a different entity - * table and id. - */ - static function copyEntityFile($oldEntityTable, $oldEntityId, $newEntityTable, $newEntityId) { + CEF.id as cefID, + CEF.entity_table as entity_table, + CEF.entity_id as entity_id +FROM civicrm_file AS CF +LEFT JOIN civicrm_entity_file AS CEF ON ( CEF.file_id = CF.id ) +WHERE CEF.entity_table = %1 +AND CEF.entity_id = %2"; + } + + $params = array( + 1 => array($entityTable, 'String'), + 2 => array($entityID, 'Integer'), + ); + + if ($fileTypeID !== NULL) { + $sql .= " AND CF.file_type_id = %3"; + $params[3] = array($fileTypeID, 'Integer'); + } + + if ($fileID !== NULL) { + $sql .= " AND CF.id = %4"; + $params[4] = array($fileID, 'Integer'); + } + + return array($sql, $params); + } + + /** + * @param CRM_Core_Form $form + * @param string $entityTable + * @param null $entityID + * @param null $numAttachments + * @param bool $ajaxDelete + */ + static function buildAttachment(&$form, $entityTable, $entityID = NULL, $numAttachments = NULL, $ajaxDelete = FALSE) { + + if (!$numAttachments) { + $numAttachments = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'max_attachments'); + } + // Assign maxAttachments count to template for help message + $form->assign('maxAttachments', $numAttachments); + + $config = CRM_Core_Config::singleton(); + // set default max file size as 2MB + $maxFileSize = $config->maxFileSize ? $config->maxFileSize : 2; + + $currentAttachmentInfo = self::getEntityFile($entityTable, $entityID, TRUE); + $totalAttachments = 0; + if ($currentAttachmentInfo) { + $totalAttachments = count($currentAttachmentInfo); + $form->add('checkbox', 'is_delete_attachment', ts('Delete All Attachment(s)')); + $form->assign('currentAttachmentInfo', $currentAttachmentInfo); + } + else { + $form->assign('currentAttachmentInfo', NULL); + } + + if ($totalAttachments) { + if ($totalAttachments >= $numAttachments) { + $numAttachments = 0; + } + else { + $numAttachments -= $totalAttachments; + } + } + + $form->assign('numAttachments', $numAttachments); + + $tags = CRM_Core_BAO_Tag::getTags('civicrm_file'); + + // get tagset info + $parentNames = CRM_Core_BAO_Tag::getTagSet('civicrm_file'); + + // add attachments + for ($i = 1; $i <= $numAttachments; $i++) { + $form->addElement('file', "attachFile_$i", ts('Attach File'), 'size=30 maxlength=60'); + $form->addUploadElement("attachFile_$i"); + $form->setMaxFileSize($maxFileSize * 1024 * 1024); + $form->addRule("attachFile_$i", + ts('File size should be less than %1 MByte(s)', + array(1 => $maxFileSize) + ), + 'maxfilesize', + $maxFileSize * 1024 * 1024 + ); + $form->addElement('text', "attachDesc_$i", NULL, array( + 'size' => 40, + 'maxlength' => 255, + 'placeholder' => ts('Description') + )); + + if (!empty($tags)) { + $form->add('select', "tag_$i", ts('Tags'), $tags, FALSE, + array( + 'id' => "tags_$i", + 'multiple' => 'multiple', + 'class' => 'huge crm-select2', + 'placeholder' => ts('- none -') + ) + ); + } + CRM_Core_Form_Tag::buildQuickForm($form, $parentNames, 'civicrm_file', NULL, FALSE, TRUE, "file_taglist_$i"); + } + } + + /** + * Function to return a clean url string and the number of attachment for a + * given entityTable, entityID + * + * @param $entityTable string The entityTable to which the file is attached + * @param $entityID int The id of the object in the above entityTable + * @param $separator string The string separator where to implode the urls + * + * @return array An array with 2 elements. The string and the number of attachments + * @static + */ + static function attachmentInfo($entityTable, $entityID, $separator = '
') { + if (!$entityID) { + return NULL; + } + + $currentAttachments = self::getEntityFile($entityTable, $entityID); + if (!empty($currentAttachments)) { + $currentAttachmentURL = array(); + foreach ($currentAttachments as $fileID => $attach) { + $currentAttachmentURL[] = $attach['href']; + } + return implode($separator, $currentAttachmentURL); + } + return NULL; + } + + /** + * @param $formValues + * @param $params + * @param $entityTable + * @param null $entityID + */ + static function formatAttachment( + &$formValues, + &$params, + $entityTable, + $entityID = NULL + ) { + + // delete current attachments if applicable + if ($entityID && !empty($formValues['is_delete_attachment'])) { + CRM_Core_BAO_File::deleteEntityFile($entityTable, $entityID); + } + + $numAttachments = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'max_attachments'); + + $now = date('Ymdhis'); + + // setup all attachments + for ($i = 1; $i <= $numAttachments; $i++) { + $attachName = "attachFile_$i"; + $attachDesc = "attachDesc_$i"; + $attachTags = "tag_$i"; + $attachFreeTags = "file_taglist_$i"; + if (isset($formValues[$attachName]) && !empty($formValues[$attachName])) { + // add static tags if selects + $tagParams = array(); + if (!empty($formValues[$attachTags])) { + foreach ($formValues[$attachTags] as $tag) { + $tagParams[$tag] = 1; + } + } + + // we dont care if the file is empty or not + // CRM-7448 + $fileParams = array( + 'uri' => $formValues[$attachName]['name'], + 'type' => $formValues[$attachName]['type'], + 'location' => $formValues[$attachName]['name'], + 'description' => $formValues[$attachDesc], + 'upload_date' => $now, + 'tag' => $tagParams, + 'attachment_taglist' => CRM_Utils_Array::value($attachFreeTags, $formValues, array()) + ); + + $params[$attachName] = $fileParams; + } + } + } + + /** + * @param $params + * @param $entityTable + * @param $entityID + */ + static function processAttachment(&$params, $entityTable, $entityID) { + $numAttachments = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'max_attachments'); + + for ($i = 1; $i <= $numAttachments; $i++) { + if ( + isset($params["attachFile_$i"]) && + is_array($params["attachFile_$i"]) + ) { + self::filePostProcess( + $params["attachFile_$i"]['location'], + NULL, + $entityTable, + $entityID, + NULL, + TRUE, + $params["attachFile_$i"], + "attachFile_$i", + $params["attachFile_$i"]['type'] + ); + } + } + } + + /** + * @return array + */ + static function uploadNames() { + $numAttachments = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'max_attachments'); + + $names = array(); + for ($i = 1; $i <= $numAttachments; $i++) { + $names[] = "attachFile_{$i}"; + } + $names[] = 'uploadFile'; + return $names; + } + + /* + * Function to copy/attach an existing file to a different entity + * table and id. + */ + /** + * @param $oldEntityTable + * @param $oldEntityId + * @param $newEntityTable + * @param $newEntityId + */ + static function copyEntityFile($oldEntityTable, $oldEntityId, $newEntityTable, $newEntityId) { $oldEntityFile = new CRM_Core_DAO_EntityFile(); $oldEntityFile->entity_id = $oldEntityId; $oldEntityFile->entity_table = $oldEntityTable; @@ -524,10 +604,17 @@ } } + /** + * @param $entityTable + * @param $entityID + * @param $fileID + * + * @return string + */ static function deleteURLArgs($entityTable, $entityID, $fileID) { $params['entityTable'] = $entityTable; - $params['entityID'] = $entityID; - $params['fileID'] = $fileID; + $params['entityID'] = $entityID; + $params['fileID'] = $fileID; $signer = new CRM_Utils_Signer(CRM_Core_Key::privateKey(), self::$_signableFields); $params['_sgn'] = $signer->sign($params); @@ -540,16 +627,16 @@ * @static * @access public */ - static function deleteAttachment( ) { - $params = array( ); - $params['entityTable'] = CRM_Utils_Request::retrieve( 'entityTable', 'String' , CRM_Core_DAO::$_nullObject, TRUE); - $params['entityID'] = CRM_Utils_Request::retrieve( 'entityID' , 'Positive', CRM_Core_DAO::$_nullObject, TRUE); - $params['fileID'] = CRM_Utils_Request::retrieve( 'fileID' , 'Positive', CRM_Core_DAO::$_nullObject, TRUE); + static function deleteAttachment() { + $params = array(); + $params['entityTable'] = CRM_Utils_Request::retrieve('entityTable', 'String', CRM_Core_DAO::$_nullObject, TRUE); + $params['entityID'] = CRM_Utils_Request::retrieve('entityID', 'Positive', CRM_Core_DAO::$_nullObject, TRUE); + $params['fileID'] = CRM_Utils_Request::retrieve('fileID', 'Positive', CRM_Core_DAO::$_nullObject, TRUE); - $signature = CRM_Utils_Request::retrieve( '_sgn', 'String', CRM_Core_DAO::$_nullObject, TRUE); + $signature = CRM_Utils_Request::retrieve('_sgn', 'String', CRM_Core_DAO::$_nullObject, TRUE); $signer = new CRM_Utils_Signer(CRM_Core_Key::privateKey(), self::$_signableFields); - if (! $signer->validate($signature, $params)) { + if (!$signer->validate($signature, $params)) { CRM_Core_Error::fatal('Request signature is invalid'); } @@ -561,6 +648,7 @@ * function to display paper icon for a file attachment -- CRM-13624 * * @param $entityTable string The entityTable to which the file is attached. eg "civicrm_contact", "civicrm_note", "civicrm_activity" + * If you have the ID of a specific row in civicrm_file, use $entityTable='*' * @param $entityID int The id of the object in the above entityTable * * @return array|NULL list of HTML snippets; one HTML snippet for each attachment. If none found, then NULL @@ -568,23 +656,23 @@ * @static * @access public */ - static function paperIconAttachment( $entityTable, $entityID ) { - if (empty($entityTable) || !$entityID) { - $results = NULL; - return $results; - } - $currentAttachmentInfo = self::getEntityFile( $entityTable, $entityID ); - foreach($currentAttachmentInfo as $fileKey => $fileValue) { + static function paperIconAttachment($entityTable, $entityID) { + if (empty($entityTable) || !$entityID) { + $results = NULL; + return $results; + } + $currentAttachmentInfo = self::getEntityFile($entityTable, $entityID); + foreach ($currentAttachmentInfo as $fileKey => $fileValue) { $fileID = $fileValue['fileID']; $fileType = $fileValue['mime_type']; $eid = $entityID; - if($fileID) { + if ($fileID) { if ($fileType == 'image/jpeg' || - $fileType == 'image/pjpeg' || - $fileType == 'image/gif' || - $fileType == 'image/x-png' || - $fileType == 'image/png' - ) { + $fileType == 'image/pjpeg' || + $fileType == 'image/gif' || + $fileType == 'image/x-png' || + $fileType == 'image/png' + ) { $url = $fileValue['url']; $alt = $fileValue['cleanName']; $file_url[$fileID] = " @@ -600,13 +688,29 @@ } } } - if(empty($file_url)) { - $results = NULL; + if (empty($file_url)) { + $results = NULL; } else { - $results = $file_url; + $results = $file_url; } return $results; } + /** + * Get a reference to the file-search service (if one is available). + * + * @return CRM_Core_FileSearchInterface|NULL + */ + static function getSearchService() { + $fileSearches = array(); + CRM_Utils_Hook::fileSearches($fileSearches); + + // use the first available search + foreach ($fileSearches as $fileSearch) { + /** @var $fileSearch CRM_Core_FileSearchInterface */ + return $fileSearch; + } + return NULL; + } }