Skip to content

Commit

Permalink
Api4 - Convert field values to correct data type
Browse files Browse the repository at this point in the history
  • Loading branch information
colemanw committed Jan 10, 2020
1 parent 95dfd04 commit ab2f8a0
Showing 1 changed file with 37 additions and 9 deletions.
46 changes: 37 additions & 9 deletions Civi/Api4/Event/Subscriber/PostSelectQuerySubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,7 @@ protected function postRun(array $results, Api4SelectQuery $query) {
return $results;
}

$fieldSpec = $query->getApiFieldSpec();
$this->unserializeFields($results, $query->getEntity(), $fieldSpec);
$this->formatFieldValues($results, $query->getApiFieldSpec());

// Group the selects to avoid queries for each field
$groupedSelects = $this->getNtoManyJoinSelects($query);
Expand Down Expand Up @@ -98,26 +97,55 @@ private function formatJoinResults(&$joinResults, $query, $alias) {
$fields[array_pop($name)] = $field->toArray();
}
if ($fields) {
$this->unserializeFields($joinResults, NULL, $fields);
$this->formatFieldValues($joinResults, $fields);
}
}

/**
* Unserialize values
* Unserialize values and convert to correct type
*
* @param array $results
* @param string $entity
* @param array $fields
*/
protected function unserializeFields(&$results, $entity, $fields = []) {
protected function formatFieldValues(&$results, $fields = []) {
foreach ($results as &$result) {
foreach ($result as $field => &$value) {
if (!empty($fields[$field]['serialize']) && is_string($value)) {
$serializationType = $fields[$field]['serialize'];
$value = \CRM_Core_DAO::unSerializeField($value, $serializationType);
$dataType = $fields[$field]['data_type'] ?? NULL;
if (!empty($fields[$field]['serialize'])) {
if (is_string($value)) {
$value = \CRM_Core_DAO::unSerializeField($value, $fields[$field]['serialize']);
foreach ($value as $key => $val) {
$value[$key] = $this->convertDataType($val, $dataType);
}
}
}
else {
$value = $this->convertDataType($value, $dataType);
}
}
}
}

/**
* @param mixed $value
* @param string $dataType
* @return mixed
*/
protected function convertDataType($value, $dataType) {
if (isset($value)) {
switch ($dataType) {
case 'Boolean':
return (bool) $value;

case 'Integer':
return (int) $value;

case 'Money':
case 'Float':
return (float) $value;
}
}
return $value;
}

/**
Expand Down

0 comments on commit ab2f8a0

Please sign in to comment.