* @package CiviCRM_APIv3
*/
-
/**
* Creates or updates an Activity.
*
* @param array $params
* Array per getfields documentation.
*
- * @return array API result array
+ * @return array
* API result array
*
* @throws \API_Exception
function civicrm_api3_activity_get($params) {
$options = _civicrm_api3_get_options_from_params($params, FALSE, 'Activity', 'get');
$sql = CRM_Utils_SQL_Select::fragment();
+ _civicrm_activity_get_handleSourceContactNameOrderBy($params, $options, $sql);
_civicrm_api3_activity_get_extraFilters($params, $sql);
return civicrm_api3_create_success($activities, $params, 'Activity', 'get');
}
+/**
+ * Handle source_contact_name as a sort parameter.
+ *
+ * This is passed from the activity selector - e.g search results or contact tab.
+ *
+ * It's a non-standard handling but this api already handles variations on handling source_contact
+ * as a filter & as a field so it's in keeping with that. Source contact has a one-one relationship
+ * with activity table.
+ *
+ * Test coverage in CRM_Activity_BAO_ActivtiyTest::testGetActivitiesforContactSummaryWithSortOptions
+ *
+ * @param array $params
+ * @param array $options
+ * @param CRM_Utils_SQL_Select $sql
+ */
+function _civicrm_activity_get_handleSourceContactNameOrderBy(&$params, &$options, $sql) {
+ $sourceContactID = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Source');
+ if (!empty($options['sort'])
+ && in_array($options['sort'], [
+ 'source_contact_name',
+ 'source_contact_name desc',
+ 'source_contact_name asc',
+ ])) {
+ $order = substr($options['sort'], -4) === 'desc' ? 'desc' : 'asc';
+ $sql->join(
+ 'source_contact',
+ "LEFT JOIN
+ civicrm_activity_contact ac ON (ac.activity_id = a.id AND record_type_id = #sourceContactID)
+ LEFT JOIN civicrm_contact c ON c.id = ac.contact_id",
+ ['sourceContactID' => $sourceContactID]
+ );
+ $sql->orderBy("c.display_name $order");
+ unset($options['sort'], $params['options']['sort']);
+ }
+}
+
/**
* Support filters beyond what basic_get can do.
*
$typeMap = [
$assigneeType => 'assignee',
$sourceType => 'source',
- $targetType => 'target'
+ $targetType => 'target',
];
$activityContactTypes = [$sourceType];
'activity_id',
'record_type_id',
'contact_id.display_name',
- 'contact_id'
+ 'contact_id.sort_name',
+ 'contact_id',
],
+ 'options' => ['limit' => 0],
'check_permissions' => !empty($params['check_permissions']),
];
if (count($activityContactTypes) < 3) {
if (in_array($recordType, ['target', 'assignee'])) {
$activities[$activityContact['activity_id']][$recordType . '_contact_id'][] = $contactID;
$activities[$activityContact['activity_id']][$recordType . '_contact_name'][$contactID] = isset($activityContact['contact_id.display_name']) ? $activityContact['contact_id.display_name'] : '';
+ $activities[$activityContact['activity_id']][$recordType . '_contact_sort_name'][$contactID] = isset($activityContact['contact_id.sort_name']) ? $activityContact['contact_id.sort_name'] : '';
}
else {
$activities[$activityContact['activity_id']]['source_contact_id'] = $contactID;
$activities[$activityContact['activity_id']]['source_contact_name'] = isset($activityContact['contact_id.display_name']) ? $activityContact['contact_id.display_name'] : '';
+ $activities[$activityContact['activity_id']]['source_contact_sort_name'] = isset($activityContact['contact_id.sort_name']) ? $activityContact['contact_id.sort_name'] : '';
}
}
}
-
/**
* Delete a specified Activity.
*
'id' => $row[$request['id_field']],
'label' => $row[$request['label_field']] ? $row[$request['label_field']] : ts('(no subject)'),
'description' => [
- CRM_Core_Pseudoconstant::getLabel('CRM_Activity_BAO_Activity', 'activity_type_id', $row['activity_type_id']),
+ CRM_Core_PseudoConstant::getLabel('CRM_Activity_BAO_Activity', 'activity_type_id', $row['activity_type_id']),
],
];
if (!empty($row['activity_date_time'])) {