* @param array $params
*/
protected function assignTestFK($fieldName, $fieldDef, $params) {
- $required = CRM_Utils_Array::value('required', $fieldDef);
- $FKClassName = CRM_Utils_Array::value('FKClassName', $fieldDef);
+ $required = $fieldDef['required'] ?? NULL;
+ $FKClassName = $fieldDef['FKClassName'] ?? NULL;
$dbName = $fieldDef['name'];
$daoName = str_replace('_BAO_', '_DAO_', get_class($this));
}
else {
$this->$dbName = $dbName . '_' . $counter;
- $maxlength = CRM_Utils_Array::value('maxlength', $fieldDef);
+ $maxlength = $fieldDef['maxlength'] ?? NULL;
if ($maxlength > 0 && strlen($this->$dbName) > $maxlength) {
$this->$dbName = substr($this->$dbName, 0, $fieldDef['maxlength']);
}
*/
public function save($hook = TRUE) {
if (!empty($this->id)) {
- $this->update();
+ if ($hook) {
+ $preEvent = new \Civi\Core\DAO\Event\PreUpdate($this);
+ \Civi::dispatcher()->dispatch("civi.dao.preUpdate", $preEvent);
+ }
+
+ $result = $this->update();
if ($hook) {
- $event = new \Civi\Core\DAO\Event\PostUpdate($this);
- \Civi::service('dispatcher')->dispatch("civi.dao.postUpdate", $event);
+ $event = new \Civi\Core\DAO\Event\PostUpdate($this, $result);
+ \Civi::dispatcher()->dispatch("civi.dao.postUpdate", $event);
}
$this->clearDbColumnValueCache();
}
else {
- $this->insert();
+ if ($hook) {
+ $preEvent = new \Civi\Core\DAO\Event\PreUpdate($this);
+ \Civi::dispatcher()->dispatch("civi.dao.preInsert", $preEvent);
+ }
+
+ $result = $this->insert();
if ($hook) {
- $event = new \Civi\Core\DAO\Event\PostUpdate($this);
- \Civi::service('dispatcher')->dispatch("civi.dao.postInsert", $event);
+ $event = new \Civi\Core\DAO\Event\PostUpdate($this, $result);
+ \Civi::dispatcher()->dispatch("civi.dao.postInsert", $event);
}
}
$this->free();
*/
public function delete($useWhere = FALSE) {
$preEvent = new \Civi\Core\DAO\Event\PreDelete($this);
- \Civi::service('dispatcher')->dispatch("civi.dao.preDelete", $preEvent);
+ \Civi::dispatcher()->dispatch("civi.dao.preDelete", $preEvent);
$result = parent::delete($useWhere);
$event = new \Civi\Core\DAO\Event\PostDelete($this, $result);
- \Civi::service('dispatcher')->dispatch("civi.dao.postDelete", $event);
+ \Civi::dispatcher()->dispatch("civi.dao.postDelete", $event);
$this->free();
$this->clearDbColumnValueCache();
* that belong to this object and initialize the object with said values
*
* @param array $params
- * (reference ) associative array of name/value pairs.
- * @param bool $serializeArrays
- * Should arrays that are passed in be serialised according to the metadata.
- * Eventually this should be always true / gone, but in the interests of caution
- * it is being grandfathered in. In general an array is not valid on the DAO
- * but there may be instances where this function is called & then some handling
- * takes place on the would-be array.
+ * Array of name/value pairs to save.
*
* @return bool
* Did we copy all null values into the object
*/
- public function copyValues(&$params, $serializeArrays = FALSE) {
- $fields = $this->fields();
+ public function copyValues($params) {
$allNull = TRUE;
- foreach ($fields as $name => $value) {
- $dbName = $value['name'];
+ foreach ($this->fields() as $uniqueName => $field) {
+ $dbName = $field['name'];
if (array_key_exists($dbName, $params)) {
- $pValue = $params[$dbName];
+ $value = $params[$dbName];
$exists = TRUE;
}
- elseif (array_key_exists($name, $params)) {
- $pValue = $params[$name];
+ elseif (array_key_exists($uniqueName, $params)) {
+ $value = $params[$uniqueName];
$exists = TRUE;
}
else {
// if there is no value then make the variable NULL
if ($exists) {
- if ($pValue === '') {
+ if ($value === '') {
$this->$dbName = 'null';
}
- elseif ($serializeArrays && is_array($pValue) && !empty($value['serialize'])) {
- $this->$dbName = CRM_Core_DAO::serializeField($pValue, $value['serialize']);
+ elseif (is_array($value) && !empty($field['serialize'])) {
+ $this->$dbName = CRM_Core_DAO::serializeField($value, $field['serialize']);
$allNull = FALSE;
}
else {
- if (!$serializeArrays && is_array($pValue) && !empty($value['serialize'])) {
- Civi::log()->warning(ts('use copyParams to serialize arrays (' . __CLASS__ . '.' . $name . ')'), ['civi.tag' => 'deprecated']);
- }
- $maxLength = CRM_Utils_Array::value('maxlength', $value);
- if (!is_array($pValue) && $maxLength && mb_strlen($pValue) > $maxLength
- && empty($value['pseudoconstant'])
- ) {
- Civi::log()->warning(ts('A string for field $dbName has been truncated. The original string was %1', [CRM_Utils_Type::escape($pValue, 'String')]));
+ $maxLength = $field['maxlength'] ?? NULL;
+ if (!is_array($value) && $maxLength && mb_strlen($value) > $maxLength && empty($field['pseudoconstant'])) {
+ Civi::log()->warning(ts('A string for field $dbName has been truncated. The original string was %1', [CRM_Utils_Type::escape($value, 'String')]));
// The string is too long - what to do what to do? Well losing data is generally bad so lets' truncate
- $pValue = CRM_Utils_String::ellipsify($pValue, $maxLength);
+ $value = CRM_Utils_String::ellipsify($value, $maxLength);
}
- $this->$dbName = $pValue;
+ $this->$dbName = $value;
$allNull = FALSE;
}
}
public static function makeAttribute($field) {
if ($field) {
if (CRM_Utils_Array::value('type', $field) == CRM_Utils_Type::T_STRING) {
- $maxLength = CRM_Utils_Array::value('maxlength', $field);
- $size = CRM_Utils_Array::value('size', $field);
+ $maxLength = $field['maxlength'] ?? NULL;
+ $size = $field['size'] ?? NULL;
if ($maxLength || $size) {
$attributes = [];
if ($maxLength) {
}
}
elseif (CRM_Utils_Array::value('type', $field) == CRM_Utils_Type::T_TEXT) {
- $rows = CRM_Utils_Array::value('rows', $field);
+ $rows = $field['rows'] ?? NULL;
if (!isset($rows)) {
$rows = 2;
}
- $cols = CRM_Utils_Array::value('cols', $field);
+ $cols = $field['cols'] ?? NULL;
if (!isset($cols)) {
$cols = 80;
}
$object = new $class();
$fields = $object->fields();
if ($fieldName != NULL) {
- $field = CRM_Utils_Array::value($fieldName, $fields);
+ $field = $fields[$fieldName] ?? NULL;
return self::makeAttribute($field);
}
else {
return NULL;
}
+ /**
+ * Create or update a record from supplied params.
+ *
+ * If 'id' is supplied, an existing record will be updated
+ * Otherwise a new record will be created.
+ *
+ * @param array $record
+ * @return CRM_Core_DAO
+ * @throws CRM_Core_Exception
+ */
+ public static function writeRecord(array $record) {
+ $hook = empty($record['id']) ? 'create' : 'edit';
+ $className = CRM_Core_DAO_AllCoreTables::getCanonicalClassName(static::class);
+ if ($className === 'CRM_Core_DAO') {
+ throw new CRM_Core_Exception('Function writeRecord must be called on a subclass of CRM_Core_DAO');
+ }
+ $entityName = CRM_Core_DAO_AllCoreTables::getBriefName($className);
+
+ \CRM_Utils_Hook::pre($hook, $entityName, $record['id'] ?? NULL, $record);
+ $instance = new $className();
+ $instance->copyValues($record);
+ $instance->save();
+ \CRM_Utils_Hook::post($hook, $entityName, $instance->id, $instance);
+
+ return $instance;
+ }
+
+ /**
+ * Delete a record from supplied params.
+ *
+ * @param array $record
+ * 'id' is required.
+ * @return CRM_Core_DAO
+ * @throws CRM_Core_Exception
+ */
+ public static function deleteRecord(array $record) {
+ $className = CRM_Core_DAO_AllCoreTables::getCanonicalClassName(static::class);
+ if ($className === 'CRM_Core_DAO') {
+ throw new CRM_Core_Exception('Function deleteRecord must be called on a subclass of CRM_Core_DAO');
+ }
+ $entityName = CRM_Core_DAO_AllCoreTables::getBriefName($className);
+ if (empty($record['id'])) {
+ throw new CRM_Core_Exception("Cannot delete {$entityName} with no id.");
+ }
+
+ CRM_Utils_Hook::pre('delete', $entityName, $record['id'], $record);
+ $instance = new $className();
+ $instance->id = $record['id'];
+ if (!$instance->delete()) {
+ throw new CRM_Core_Exception("Could not delete {$entityName} id {$record['id']}");
+ }
+ CRM_Utils_Hook::post('delete', $entityName, $record['id'], $instance);
+
+ return $instance;
+ }
+
/**
* Check if there is a record with the same name in the db.
*
}
if ($object->find(TRUE)) {
- return ($daoID && $object->id == $daoID) ? TRUE : FALSE;
+ return $daoID && $object->id == $daoID;
}
else {
return TRUE;
$show[$tableName] = $dao->Create_Table;
}
- return preg_match("/\b$constraint\b/i", $show[$tableName]) ? TRUE : FALSE;
+ return (bool) preg_match("/\b$constraint\b/i", $show[$tableName]);
}
/**
$show[$tableName] = $dao->Create_Table;
}
- $result = preg_match("/\bCONSTRAINT\b\s/i", $show[$tableName]) ? TRUE : FALSE;
+ $result = (bool) preg_match("/\bCONSTRAINT\b\s/i", $show[$tableName]);
if ($result == TRUE) {
continue;
}
}
$constraint = "`FK_{$tableName}_{$columnName}`";
$pattern = "/\bCONSTRAINT\b\s+%s\s+\bFOREIGN\s+KEY\b\s/i";
- return preg_match(sprintf($pattern, $constraint), $show[$tableName]) ? TRUE : FALSE;
+ return (bool) preg_match(sprintf($pattern, $constraint), $show[$tableName]);
}
/**
$params = [1 => [$tableName, 'String']];
$dao = CRM_Core_DAO::executeQuery($query, $params);
- $result = $dao->fetch() ? TRUE : FALSE;
- return $result;
+ return (bool) $dao->fetch();
}
/**
FROM civicrm_domain
";
$dbVersion = CRM_Core_DAO::singleValueQuery($query);
- return trim($version) == trim($dbVersion) ? TRUE : FALSE;
+ return trim($version) == trim($dbVersion);
}
/**
* @param bool $force
* Skip use of the cache.
*
- * @return string|null
+ * @return string|int|null
* Value of $returnColumn in the retrieved record
*
* @throws \CRM_Core_Exception
$fields = $object->fields();
foreach ($fields as $fieldName => $fieldDef) {
$dbName = $fieldDef['name'];
- $FKClassName = CRM_Utils_Array::value('FKClassName', $fieldDef);
- $required = CRM_Utils_Array::value('required', $fieldDef);
+ $FKClassName = $fieldDef['FKClassName'] ?? NULL;
- if (CRM_Utils_Array::value($dbName, $params) !== NULL && !is_array($params[$dbName])) {
+ if (isset($params[$dbName]) && !is_array($params[$dbName])) {
$object->$dbName = $params[$dbName];
}
$config->backtrace = TRUE;
$object = new $daoName();
- $object->id = CRM_Utils_Array::value('id', $params);
+ $object->id = $params['id'] ?? NULL;
// array(array(0 => $daoName, 1 => $daoParams))
$deletions = [];
$dbName = $value['name'];
- $FKClassName = CRM_Utils_Array::value('FKClassName', $value);
- $required = CRM_Utils_Array::value('required', $value);
+ $FKClassName = $value['FKClassName'] ?? NULL;
+ $required = $value['required'] ?? NULL;
if ($FKClassName != NULL
&& $object->$dbName
&& !in_array($FKClassName, CRM_Core_DAO::$_testEntitiesToSkip)
$fields = civicrm_api3('CustomField', 'get', [
'return' => ['column_name', 'custom_group_id.table_name'],
'data_type' => 'ContactReference',
+ 'options' => ['limit' => 0],
])['values'];
foreach ($fields as $field) {
$cidRefs[$field['custom_group_id.table_name']][] = $field['column_name'];
throw new Exception('Cannot call getOptionLabels on CRM_Core_DAO');
}
foreach ($fields as $field) {
- $name = CRM_Utils_Array::value('name', $field);
+ $name = $field['name'] ?? NULL;
if ($name && isset($this->$name)) {
$label = CRM_Core_PseudoConstant::getLabel(get_class($this), $name, $this->$name);
if ($label !== FALSE) {
// Support "unique names" as well as sql names
$fieldKey = $fieldName;
if (empty($fields[$fieldKey])) {
- $fieldKey = CRM_Utils_Array::value($fieldName, $fieldKeys);
+ $fieldKey = $fieldKeys[$fieldName] ?? NULL;
}
// If neither worked then this field doesn't exist. Return false.
if (empty($fields[$fieldKey])) {