Skip to content
Snippets Groups Projects
Commit 50182f0e authored by eileen's avatar eileen
Browse files

[ref] Move copyCustomFields function from Event to Core_DAO for re-usablibilty

parent 0908f97c
Branches
Tags
No related merge requests found
......@@ -1679,6 +1679,61 @@ FROM civicrm_domain
return $newObject;
}
/**
* Method that copies custom fields values from an old event to a new one. Fixes bug CRM-19302,
* where if a custom field of File type was present, left both events using the same file,
* breaking download URL's for the old event.
*
* @todo the goal here is to clean this up so that it works for any entity. Copy Generic already DOES some custom field stuff
* so it's not clear why this is needed - best guess is the custom fields are not handled - this is ALSO the
* situation with the dedupe.
*
* @param int $oldEventID
* @param int $newCopyID
*/
public function copyCustomFields($oldEventID, $newCopyID) {
// Obtain custom values for old event
$customParams = $htmlType = [];
$customValues = CRM_Core_BAO_CustomValueTable::getEntityValues($oldEventID, 'Event');
// If custom values present, we copy them
if (!empty($customValues)) {
// Get Field ID's and identify File type attributes, to handle file copying.
$fieldIds = implode(', ', array_keys($customValues));
$sql = "SELECT id FROM civicrm_custom_field WHERE html_type = 'File' AND id IN ( {$fieldIds} )";
$result = CRM_Core_DAO::executeQuery($sql);
// Build array of File type fields
while ($result->fetch()) {
$htmlType[] = $result->id;
}
// Build params array of custom values
foreach ($customValues as $field => $value) {
if ($value !== NULL) {
// Handle File type attributes
if (in_array($field, $htmlType)) {
$fileValues = CRM_Core_BAO_File::path($value, $oldEventID);
$customParams["custom_{$field}_-1"] = [
'name' => CRM_Utils_File::duplicate($fileValues[0]),
'type' => $fileValues[1],
];
}
// Handle other types
else {
$customParams["custom_{$field}_-1"] = $value;
}
}
}
// Save Custom Fields for new Event
CRM_Core_BAO_CustomValueTable::postProcess($customParams, 'civicrm_event', $newCopyID, 'Event');
}
// copy activity attachments ( if any )
CRM_Core_BAO_File::copyEntityFile('civicrm_event', $oldEventID, 'civicrm_event', $newCopyID);
}
/**
* Cascade update through related entities.
*
......
......@@ -986,7 +986,7 @@ WHERE civicrm_event.is_active = 1
['entity_value' => $id, 'mapping_id' => $oldMapping->getId()],
['entity_value' => $copyEvent->id, 'mapping_id' => $copyMapping->getId()]
);
self::copyCustomFields($id, $copyEvent->id);
$copyEvent->copyCustomFields($id, $copyEvent->id);
$copyEvent->save();
......@@ -996,57 +996,6 @@ WHERE civicrm_event.is_active = 1
return $copyEvent;
}
/**
* Method that copies custom fields values from an old event to a new one. Fixes bug CRM-19302,
* where if a custom field of File type was present, left both events using the same file,
* breaking download URL's for the old event.
*
* @param int $oldEventID
* @param int $newCopyID
*/
public static function copyCustomFields($oldEventID, $newCopyID) {
// Obtain custom values for old event
$customParams = $htmlType = [];
$customValues = CRM_Core_BAO_CustomValueTable::getEntityValues($oldEventID, 'Event');
// If custom values present, we copy them
if (!empty($customValues)) {
// Get Field ID's and identify File type attributes, to handle file copying.
$fieldIds = implode(', ', array_keys($customValues));
$sql = "SELECT id FROM civicrm_custom_field WHERE html_type = 'File' AND id IN ( {$fieldIds} )";
$result = CRM_Core_DAO::executeQuery($sql);
// Build array of File type fields
while ($result->fetch()) {
$htmlType[] = $result->id;
}
// Build params array of custom values
foreach ($customValues as $field => $value) {
if ($value !== NULL) {
// Handle File type attributes
if (in_array($field, $htmlType)) {
$fileValues = CRM_Core_BAO_File::path($value, $oldEventID);
$customParams["custom_{$field}_-1"] = [
'name' => CRM_Utils_File::duplicate($fileValues[0]),
'type' => $fileValues[1],
];
}
// Handle other types
else {
$customParams["custom_{$field}_-1"] = $value;
}
}
}
// Save Custom Fields for new Event
CRM_Core_BAO_CustomValueTable::postProcess($customParams, 'civicrm_event', $newCopyID, 'Event');
}
// copy activity attachments ( if any )
CRM_Core_BAO_File::copyEntityFile('civicrm_event', $oldEventID, 'civicrm_event', $newCopyID);
}
/**
* This is sometimes called in a loop (during event search).
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment