'label' => 'get',
];
+ public static $pseudoConstantSuffixes = ['name', 'abbr', 'label', 'color', 'description', 'icon'];
+
/**
* Massage values into the format the BAO expects for a write operation
*
- * @param $params
- * @param $entity
- * @param $fields
+ * @param array $params
+ * @param array $fields
* @throws \API_Exception
*/
- public static function formatWriteParams(&$params, $entity, $fields) {
+ public static function formatWriteParams(&$params, $fields) {
foreach ($fields as $name => $field) {
if (!empty($params[$name])) {
$value =& $params[$name];
if ($value === 'null') {
$value = 'Null';
}
- self::formatInputValue($value, $name, $field, $entity);
+ self::formatInputValue($value, $name, $field, 'create');
// Ensure we have an array for serialized fields
if (!empty($field['serialize'] && !is_array($value))) {
$value = (array) $value;
* @param $value
* @param string $fieldName
* @param array $fieldSpec
- * @param string $entity
- * Ex: 'Contact', 'Domain'
+ * @param string $action
* @throws \API_Exception
+ * @throws \CRM_Core_Exception
*/
- public static function formatInputValue(&$value, $fieldName, $fieldSpec, $entity) {
+ public static function formatInputValue(&$value, $fieldName, $fieldSpec, $action = 'get') {
// Evaluate pseudoconstant suffix
$suffix = strpos($fieldName, ':');
if ($suffix) {
- $options = self::getPseudoconstantList($fieldSpec['entity'], $fieldSpec['name'], substr($fieldName, $suffix + 1));
+ $options = self::getPseudoconstantList($fieldSpec['entity'], $fieldSpec['name'], substr($fieldName, $suffix + 1), $action);
$value = self::replacePseudoconstant($options, $value, TRUE);
+ return;
}
elseif (is_array($value)) {
foreach ($value as &$val) {
- self::formatInputValue($val, $fieldName, $fieldSpec, $entity);
+ self::formatInputValue($val, $fieldName, $fieldSpec, $action);
}
return;
}
- $fk = $fieldSpec['name'] == 'id' ? $entity : $fieldSpec['fk_entity'] ?? NULL;
+ $fk = $fieldSpec['name'] == 'id' ? $fieldSpec['entity'] : $fieldSpec['fk_entity'] ?? NULL;
if ($fk === 'Domain' && $value === 'current_domain') {
$value = \CRM_Core_Config::domainID();
*/
public static function getPseudoconstantList($entity, $fieldName, $valueType, $params = [], $action = 'get') {
$context = self::$pseudoConstantContexts[$valueType] ?? NULL;
- if (!$context) {
+ // For create actions, only unique identifiers can be used.
+ // For get actions any valid suffix is ok.
+ if (($action === 'create' && !$context) || !in_array($valueType, self::$pseudoConstantSuffixes, TRUE)) {
throw new \API_Exception('Illegal expression');
}
- $baoName = CoreUtil::getBAOFromApiName($entity);
+ $baoName = $context ? CoreUtil::getBAOFromApiName($entity) : NULL;
// Use BAO::buildOptions if possible
if ($baoName) {
$options = $baoName::buildOptions($fieldName, $context, $params);
}
- // Fallback for option lists that exist in the api but not the BAO - note: $valueType gets ignored here
+ // Fallback for option lists that exist in the api but not the BAO
if (!isset($options) || $options === FALSE) {
- $options = civicrm_api4($entity, 'getFields', ['action' => $action, 'loadOptions' => TRUE, 'where' => [['name', '=', $fieldName]]])[0]['options'] ?? NULL;
+ $options = civicrm_api4($entity, 'getFields', ['action' => $action, 'loadOptions' => ['id', $valueType], 'where' => [['name', '=', $fieldName]]])[0]['options'] ?? NULL;
+ $options = $options ? array_column($options, $valueType, 'id') : $options;
}
if (is_array($options)) {
return $options;
\Civi::$statics[__CLASS__][__FUNCTION__][$contactType][] = $field['name'];
// Include suffixed variants like prefix_id:label
if (!empty($field['pseudoconstant'])) {
- foreach (array_keys(self::$pseudoConstantContexts) as $suffix) {
+ foreach (self::$pseudoConstantSuffixes as $suffix) {
\Civi::$statics[__CLASS__][__FUNCTION__][$contactType][] = $field['name'] . ':' . $suffix;
}
}