From ee79771f2a0f8a3713aaa2c07444910f0ec2c549 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Sat, 7 Jan 2023 15:36:27 -0500 Subject: [PATCH] Afform - Show file field values for existing entities --- .../Api4/Action/Afform/AbstractProcessor.php | 47 ++++++++++++++++--- ext/afform/core/ang/af/fields/File.html | 8 ++++ 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php b/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php index ff7105d45f..a2ed2c1b5f 100644 --- a/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php +++ b/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php @@ -118,10 +118,9 @@ abstract class AbstractProcessor extends \Civi\Api4\Generic\AbstractAction { if (!$ids) { return; } - $result = $api4($entity['type'], 'get', [ + $result = $this->apiGet($api4, $entity['type'], $entity['fields'], [ 'where' => [['id', 'IN', $ids]], - 'select' => array_keys($entity['fields']), - ])->indexBy($idField); + ]); foreach ($ids as $index => $id) { $this->_entityIds[$entity['name']][$index] = [ $idField => isset($result[$id]) ? $id : NULL, @@ -131,12 +130,11 @@ abstract class AbstractProcessor extends \Civi\Api4\Generic\AbstractAction { $data = ['fields' => $result[$id]]; foreach ($entity['joins'] ?? [] as $joinEntity => $join) { $joinIdField = CoreUtil::getIdFieldName($joinEntity); - $data['joins'][$joinEntity] = (array) $api4($joinEntity, 'get', [ + $data['joins'][$joinEntity] = array_values($this->apiGet($api4, $joinEntity, $join['fields'], [ 'where' => self::getJoinWhereClause($this->_formDataModel, $entity['name'], $joinEntity, $id), 'limit' => !empty($join['af-repeat']) ? $join['max'] ?? 0 : 1, - 'select' => array_unique(array_merge([$joinIdField], array_keys($join['fields']))), 'orderBy' => self::getEntityField($joinEntity, 'is_primary') ? ['is_primary' => 'DESC'] : [], - ]); + ])); $this->_entityIds[$entity['name']][$index]['_joins'][$joinEntity] = \CRM_Utils_Array::filterColumns($data['joins'][$joinEntity], [$joinIdField]); } $this->_entityValues[$entity['name']][$index] = $data; @@ -144,6 +142,43 @@ abstract class AbstractProcessor extends \Civi\Api4\Generic\AbstractAction { } } + /** + * Delegated by loadEntity to call API.get and fill in additioal info + * + * @param $api4 + * @param $entityName + * @param $entityFields + * @param $params + * @return array + */ + private function apiGet($api4, $entityName, $entityFields, $params) { + $idField = CoreUtil::getIdFieldName($entityName); + $params['select'] = array_unique(array_merge([$idField], array_keys($entityFields))); + $result = (array) $api4($entityName, 'get', $params)->indexBy($idField); + // Check for file fields + $fieldInfo = civicrm_api4($entityName, 'getFields', [ + 'checkPermissions' => FALSE, + 'action' => 'create', + 'select' => ['name', 'fk_entity'], + 'where' => [['name', 'IN', array_keys($entityFields)]], + ])->indexBy('name'); + // Fill additional info about file fields + foreach ($fieldInfo as $fieldName => $fieldDefn) { + if ($fieldDefn['fk_entity'] === 'File') { + foreach ($result as &$item) { + if (!empty($item[$fieldName])) { + // Fall back on APIv3 until we have an attachment API for v4. + $fileInfo = \CRM_Utils_Array::filterColumns(civicrm_api3('Attachment', 'get', [ + 'id' => $item[$fieldName], + ])['values'], ['name', 'icon']); + $item[$fieldName] = \CRM_Utils_Array::first($fileInfo); + } + } + } + } + return $result; + } + private function validateBySavedSearch($entity, array $ids) { $idField = CoreUtil::getIdFieldName($entity['type']); $fetched = civicrm_api4($entity['type'], 'autocomplete', [ diff --git a/ext/afform/core/ang/af/fields/File.html b/ext/afform/core/ang/af/fields/File.html index c02d56d8bb..4a4e4cc5d1 100644 --- a/ext/afform/core/ang/af/fields/File.html +++ b/ext/afform/core/ang/af/fields/File.html @@ -1,4 +1,12 @@ + + + {{ dataProvider.getFieldData()[$ctrl.fieldName].name }} + + + + -- 2.25.1