}
$skipPermissions = CRM_Utils_Array::value('check_permissions', $params)? 0 :1;
-
list($entities, $options) = CRM_Contact_BAO_Query::apiQuery(
$newParams,
$returnProperties,
*/
function _civicrm_api3_custom_format_params($params, &$values, $extends, $entityId = NULL) {
$values['custom'] = array();
+ $checkCheckBoxField = FALSE;
+ $entity = $extends;
+ if(in_array($extends, array('Household', 'Individual', 'Organization'))) {
+ $entity = 'Contact';
+ }
+
+ $fields = civicrm_api($entity, 'getfields', array('version' => 3, 'action' => 'create'));
+ if(!$fields['is_error']) {
+ // not sure if fields could be error - maybe change to using civicrm_api3 wrapper later - this is conservative
+ $fields = $fields['values'];
+ $checkCheckBoxField = TRUE;
+ }
+
foreach ($params as $key => $value) {
list($customFieldID, $customValueID) = CRM_Core_BAO_CustomField::getKeyID($key, TRUE);
if ($customFieldID && (!IS_NULL($value))) {
+ if ($checkCheckBoxField && !empty($fields['custom_' . $customFieldID]) && $fields['custom_' . $customFieldID]['html_type'] == 'CheckBox') {
+ formatCheckBoxField($value, 'custom_' . $customFieldID, $entity);
+ }
CRM_Core_BAO_CustomField::formatCustomField($customFieldID, $values['custom'],
$value, $extends, $customValueID, $entityId, FALSE, FALSE
);
}
}
+/**
+ * we can't rely on downstream to add separators to checkboxes so we'll check here. We should look at pushing to BAO function
+ * and / or validate function but this is a safe place for now as it has massive test coverage & we can keep the change very specific
+ * note that this is specifically tested in the GRANT api test case so later refactoring should use that as a checking point
+ *
+ * We will only alter the value if we are sure that changing it will make it correct - if it appears wrong but does not appear to have a clear fix we
+ * don't touch - lots of very cautious code in here
+ *
+ * The resulting array should look like
+ * array(
+ * 'key' => 1,
+ * 'key1' => 1,
+ * );
+ *
+ * OR one or more keys wrapped in a CRM_Core_DAO::VALUE_SEPARATOR - either it accepted by the receiving function
+ *
+ * @todo - we are probably skipping handling disabled options as presumably getoptions is not giving us them. This should be non-regressive but might
+ * be fixed in future
+ *
+ * @param $checkboxFieldValue
+ * @param $customFieldLabel
+ * @param $entity
+ *
+ */
+function formatCheckBoxField(&$checkboxFieldValue, $customFieldLabel, $entity) {
+
+ if (is_string($checkboxFieldValue) && stristr($checkboxFieldValue, CRM_Core_DAO::VALUE_SEPARATOR)) {
+ // we can assume it's pre-formatted
+ return;
+ }
+ $options = civicrm_api($entity, 'getoptions', array('field' => $customFieldLabel, 'version' => 3));
+ if (!empty($options['is_error'])) {
+ //the check is precautionary - can probably be removed later
+ return;
+ }
+
+ $options = $options['values'];
+ $validValue = TRUE;
+ if (is_array($checkboxFieldValue)) {
+ foreach ($checkboxFieldValue as $key => $value) {
+ if (!array_key_exists($key, $options)) {
+ $validValue = FALSE;
+ }
+ }
+ if ($validValue) {
+ // we have been passed an array that is already in the 'odd' custom field format
+ return;
+ }
+ }
+
+ // so we either have an array that is not keyed by the value or we have a string that doesn't hold separators
+ // if the array only has one item we'll treat it like any other string
+ if (is_array($checkboxFieldValue) && count($checkboxFieldValue) == 1) {
+ $possibleValue = reset($checkboxFieldValue);
+ }
+ if (is_string($checkboxFieldValue)) {
+ $possibleValue = $checkboxFieldValue;
+ }
+ if (isset($possibleValue) && array_key_exists($possibleValue, $options)) {
+ $checkboxFieldValue = CRM_Core_DAO::VALUE_SEPARATOR . $possibleValue . CRM_Core_DAO::VALUE_SEPARATOR;
+ return;
+ }
+ elseif (is_array($checkboxFieldValue)) {
+ // so this time around we are considering the values in the array
+ $possibleValues = $checkboxFieldValue;
+ $formatValue = TRUE;
+ }
+ elseif (stristr($checkboxFieldValue, ',')) {
+ $formatValue = TRUE;
+ //lets see if we should separate it - we do this near the end so we
+ // ensure we have already checked that the comma is not part of a legitimate match
+ // and of course, we don't make any changes if we don't now have matches
+ $possibleValues = explode(',', $checkboxFieldValue);
+ }
+ else {
+ // run out of ideas as to what the format might be - if it's a string it doesn't match with or without the ','
+ return;
+ }
+
+ foreach ($possibleValues as $index => $possibleValue) {
+ if (array_key_exists($possibleValue, $options)) {
+ // do nothing - we will leave formatValue set to true unless another value is not found (which would cause us to ignore the whole value set)
+ }
+ elseif (array_key_exists(trim($possibleValue), $options)) {
+ $possibleValues[$index] = trim($possibleValue);
+ }
+ else {
+ $formatValue = FALSE;
+ }
+ }
+ if ($formatValue) {
+ $checkboxFieldValue = CRM_Core_DAO::VALUE_SEPARATOR . implode(CRM_Core_DAO::VALUE_SEPARATOR, $possibleValues) . CRM_Core_DAO::VALUE_SEPARATOR;
+ }
+}
+
/**
* @deprecated
* This function ensures that we have the right input parameters
if (strtotime($params[$fieldInfo['name']]) === FALSE) {
throw new Exception($fieldInfo['name'] . " is not a valid date: " . $params[$fieldInfo['name']]);
}
- $params[$fieldInfo['name']] = CRM_Utils_Date::processDate($params[$fieldInfo['name']]);
+ $format = ($fieldInfo['type'] == CRM_Utils_Type::T_DATE) ? 'Ymd000000' : 'YmdHis';
+ $params[$fieldInfo['name']] = CRM_Utils_Date::processDate($params[$fieldInfo['name']], NULL, FALSE, $format);
}
if ((CRM_Utils_Array::value('name', $fieldInfo) != $fieldName) && CRM_Utils_Array::value($fieldName, $params)) {
//If the unique field name differs from the db name & is set handle it here
function _civicrm_api3_resolve_contactID($contactIdExpr) {
//if value = 'user_contact_id' replace value with logged in user id
if ($contactIdExpr == "user_contact_id") {
- $session = &CRM_Core_Session::singleton();
- if (!is_numeric($session->get('userID'))) {
- return NULL;
- }
- return $session->get('userID');
- } elseif (preg_match('/^@user:(.*)$/', $contactIdExpr, $matches)) {
+ return CRM_Core_Session::getLoggedInContactID();
+ }
+ elseif (preg_match('/^@user:(.*)$/', $contactIdExpr, $matches)) {
$config = CRM_Core_Config::singleton();
$ufID = $config->userSystem->getUfId($matches[1]);
_civicrm_api3_api_match_pseudoconstant($params, $entity, $fieldName, $fieldInfo);
}
// Check our field length
- elseif (is_string($value) && !empty($fieldInfo['maxlength']) && strlen($value) > $fieldInfo['maxlength']) {
- throw new API_Exception("Value for $fieldName is " . strlen($value) . " characters - This field has a maxlength of {$fieldInfo['maxlength']} characters.",
+ elseif (is_string($value) && !empty($fieldInfo['maxlength']) && strlen(utf8_decode($value)) > $fieldInfo['maxlength']) {
+ throw new API_Exception("Value for $fieldName is " . strlen(utf8_decode($value)) . " characters - This field has a maxlength of {$fieldInfo['maxlength']} characters.",
2100, array('field' => $fieldName)
);
}