* @var null
* @deprecated
*/
- static $_nullObject = NULL;
+ public static $_nullObject = NULL;
/**
* @var array
* @deprecated
*/
- static $_nullArray = [];
+ public static $_nullArray = [];
- static $_dbColumnValueCache = NULL;
+ public static $_dbColumnValueCache = NULL;
const NOT_NULL = 1, IS_NULL = 2,
DB_DAO_NOTNULL = 128,
VALUE_SEPARATOR = "\ 1",
* test objects - this prevents world regions, countries etc from being added / deleted
* @var array
*/
- static $_testEntitiesToSkip = [];
+ public static $_testEntitiesToSkip = [];
/**
* The factory class for this application.
* @var object
*/
- static $_factory = NULL;
+ public static $_factory = NULL;
- static $_checkedSqlFunctionsExist = FALSE;
+ public static $_checkedSqlFunctionsExist = FALSE;
/**
* https://issues.civicrm.org/jira/browse/CRM-17748
* internal variable for DAO to hold per-query settings
+ * @var array
*/
protected $_options = [];
if (!array_key_exists($tableName, $show)) {
$query = "SHOW CREATE TABLE $tableName";
- $dao = CRM_Core_DAO::executeQuery($query);
+ $dao = CRM_Core_DAO::executeQuery($query, [], TRUE, NULL, FALSE, FALSE);
if (!$dao->fetch()) {
CRM_Core_Error::fatal();
foreach ($tables as $tableName) {
if (!array_key_exists($tableName, $show)) {
$query = "SHOW CREATE TABLE $tableName";
- $dao = CRM_Core_DAO::executeQuery($query);
+ $dao = CRM_Core_DAO::executeQuery($query, [], TRUE, NULL, FALSE, FALSE);
if (!$dao->fetch()) {
CRM_Core_Error::fatal();
* @return CRM_Core_DAO
* Object that points to an unbuffered result set
*/
- static public function executeUnbufferedQuery(
+ public static function executeUnbufferedQuery(
$query,
$params = [],
$abort = TRUE,
* Fields that you want to block from.
* getting copied
*
- * @return CRM_Core_DAO
- * the newly created copy of the object
+ * @return CRM_Core_DAO|bool
+ * the newly created copy of the object. False if none created.
*/
- public static function ©Generic($daoName, $criteria, $newData = NULL, $fieldsFix = NULL, $blockCopyOfDependencies = NULL) {
+ public static function copyGeneric($daoName, $criteria, $newData = NULL, $fieldsFix = NULL, $blockCopyOfDependencies = NULL) {
$object = new $daoName();
+ $newObject = FALSE;
if (!$newData) {
$object->id = $criteria['id'];
}
}
}
$newObject->save();
- if (!empty($newData['custom'])) {
- CRM_Core_BAO_CustomValueTable::store($newData['custom'], $newObject::getTableName(), $newObject->id);
- }
+ $newObject->copyCustomFields($object->id, $newObject->id);
CRM_Utils_Hook::post('create', CRM_Core_DAO_AllCoreTables::getBriefName($daoName), $newObject->id, $newObject);
}
return $newObject;
}
+ /**
+ * Method that copies custom fields values from an old entity 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
+ * but it seems to be bypassed & perhaps less good than this (or this just duplicates it...)
+ *
+ * @param int $entityID
+ * @param int $newEntityID
+ */
+ public function copyCustomFields($entityID, $newEntityID) {
+ $entity = CRM_Core_DAO_AllCoreTables::getBriefName(get_class($this));
+ $tableName = CRM_Core_DAO_AllCoreTables::getTableForClass(get_class($this));
+ // Obtain custom values for old event
+ $customParams = $htmlType = [];
+ $customValues = CRM_Core_BAO_CustomValueTable::getEntityValues($entityID, $entity);
+
+ // 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, $entityID);
+ $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, $tableName, $newEntityID, $entity);
+ }
+
+ // copy activity attachments ( if any )
+ CRM_Core_BAO_File::copyEntityFile($tableName, $entityID, $tableName, $newEntityID);
+ }
+
/**
* Cascade update through related entities.
*
$object = new $daoName();
$object->id = CRM_Utils_Array::value('id', $params);
- $deletions = []; // array(array(0 => $daoName, 1 => $daoParams))
+ // array(array(0 => $daoName, 1 => $daoParams))
+ $deletions = [];
if ($object->find(TRUE)) {
$fields = $object->fields();
// to make this test process pass - line below makes pass for now
&& $dbName != 'member_of_contact_id'
) {
- $deletions[] = [$FKClassName, ['id' => $object->$dbName]]; // x
+ // x
+ $deletions[] = [$FKClassName, ['id' => $object->$dbName]];
}
}
}
}
}
-
/**
* Update the fields array to also hold keys for pseudoconstant fields that relate to contained fields.
*
return (sprintf('%s ' . $operator . ' "%s" AND "%s"', $fieldName, CRM_Core_DAO::escapeString($criteria[0]), CRM_Core_DAO::escapeString($criteria[1])));
}
else {
- return NULL; // not yet implemented (tests required to implement)
+ // not yet implemented (tests required to implement)
+ return NULL;
}
break;
return (sprintf('%s %s "%s"', $fieldName, $operator, CRM_Core_DAO::escapeString($criteria)));
}
else {
- return NULL; // not yet implemented (tests required to implement)
+ // not yet implemented (tests required to implement)
+ return NULL;
}
}
}
/**
* Transform an array to a serialized string for database storage.
*
- * @param array|NULL $value
- * @param $serializationType
- * @return string|NULL
+ * @param array|null $value
+ * @param int $serializationType
+ * @return string|null
+ *
* @throws \Exception
*/
public static function serializeField($value, $serializationType) {