From e4fe163bab34b9684abed9938779e0ffba8a95d9 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Wed, 30 Nov 2022 17:21:01 -0500 Subject: [PATCH] SearchKit - Fix crashy-ness when an Afform contains a deleted search --- .../Search/AfformSearchMetadataInjector.php | 51 ++++++++++--------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/ext/search_kit/Civi/Search/AfformSearchMetadataInjector.php b/ext/search_kit/Civi/Search/AfformSearchMetadataInjector.php index 8ca3e331dc..1dfeeda978 100644 --- a/ext/search_kit/Civi/Search/AfformSearchMetadataInjector.php +++ b/ext/search_kit/Civi/Search/AfformSearchMetadataInjector.php @@ -45,32 +45,35 @@ class AfformSearchMetadataInjector { $searchDisplayGet = \Civi\Api4\SearchDisplay::getDefault(FALSE) ->setSavedSearch($searchName); } - $display = $searchDisplayGet - ->addSelect('settings', 'saved_search_id.api_entity', 'saved_search_id.api_params') - ->execute()->first(); - if ($display) { - pq($component)->attr('settings', htmlspecialchars(\CRM_Utils_JS::encode($display['settings'] ?? []), ENT_COMPAT)); - pq($component)->attr('api-entity', htmlspecialchars($display['saved_search_id.api_entity'], ENT_COMPAT)); - pq($component)->attr('search', htmlspecialchars(\CRM_Utils_JS::encode($searchName), ENT_COMPAT)); - pq($component)->attr('display', htmlspecialchars(\CRM_Utils_JS::encode($displayName), ENT_COMPAT)); + try { + $display = $searchDisplayGet + ->addSelect('settings', 'saved_search_id.api_entity', 'saved_search_id.api_params') + ->execute()->single(); + } + catch (\CRM_Core_Exception $e) { + return; + } + pq($component)->attr('settings', htmlspecialchars(\CRM_Utils_JS::encode($display['settings'] ?? []), ENT_COMPAT)); + pq($component)->attr('api-entity', htmlspecialchars($display['saved_search_id.api_entity'], ENT_COMPAT)); + pq($component)->attr('search', htmlspecialchars(\CRM_Utils_JS::encode($searchName), ENT_COMPAT)); + pq($component)->attr('display', htmlspecialchars(\CRM_Utils_JS::encode($displayName), ENT_COMPAT)); - // Add entity names to the fieldset so that afform can populate field metadata - $fieldset = pq($component)->parents('[af-fieldset]'); - if ($fieldset->length) { - $entityList = [$display['saved_search_id.api_entity']]; - foreach ($display['saved_search_id.api_params']['join'] ?? [] as $join) { - $entityList[] = $join[0]; - if (is_string($join[2] ?? NULL)) { - $entityList[] = $join[2] . ' AS ' . (explode(' AS ', $join[0])[1]); - } + // Add entity names to the fieldset so that afform can populate field metadata + $fieldset = pq($component)->parents('[af-fieldset]'); + if ($fieldset->length) { + $entityList = [$display['saved_search_id.api_entity']]; + foreach ($display['saved_search_id.api_params']['join'] ?? [] as $join) { + $entityList[] = $join[0]; + if (is_string($join[2] ?? NULL)) { + $entityList[] = $join[2] . ' AS ' . (explode(' AS ', $join[0])[1]); } - $fieldset->attr('api-entities', htmlspecialchars(\CRM_Utils_JS::encode($entityList), ENT_COMPAT)); - // Add field metadata for aggregate fields because they are not in the schema. - // Normal entity fields will be handled by AfformMetadataInjector - foreach (Meta::getCalcFields($display['saved_search_id.api_entity'], $display['saved_search_id.api_params']) as $fieldInfo) { - foreach (pq("af-field[name='{$fieldInfo['name']}']", $doc) as $afField) { - \Civi\Afform\AfformMetadataInjector::setFieldMetadata($afField, $fieldInfo); - } + } + $fieldset->attr('api-entities', htmlspecialchars(\CRM_Utils_JS::encode($entityList), ENT_COMPAT)); + // Add field metadata for aggregate fields because they are not in the schema. + // Normal entity fields will be handled by AfformMetadataInjector + foreach (Meta::getCalcFields($display['saved_search_id.api_entity'], $display['saved_search_id.api_params']) as $fieldInfo) { + foreach (pq("af-field[name='{$fieldInfo['name']}']", $doc) as $afField) { + \Civi\Afform\AfformMetadataInjector::setFieldMetadata($afField, $fieldInfo); } } } -- 2.25.1