Merge pull request #18746 from eileenmcnaughton/aip
[civicrm-core.git] / CRM / Contact / BAO / SavedSearch.php
index c5cd15e6e4df8ad4519324e6bdd94138464caae1..afd7a762f37273ba57645f5f04cc70d046e34e83 100644 (file)
@@ -54,9 +54,9 @@ class CRM_Contact_BAO_SavedSearch extends CRM_Contact_DAO_SavedSearch {
    * @param array $defaults
    *   (reference ) an assoc array to hold the flattened values.
    *
-   * @return CRM_Contact_BAO_SavedSearch
+   * @return CRM_Contact_DAO_SavedSearch
    */
-  public static function retrieve(&$params, &$defaults) {
+  public static function retrieve($params, &$defaults = []) {
     $savedSearch = new CRM_Contact_DAO_SavedSearch();
     $savedSearch->copyValues($params);
     if ($savedSearch->find(TRUE)) {
@@ -335,18 +335,28 @@ LEFT JOIN civicrm_email ON (contact_a.id = civicrm_email.contact_id AND civicrm_
   }
 
   /**
-   * Create a smart group from normalised values.
+   * Create or update SavedSearch record.
    *
    * @param array $params
    *
    * @return \CRM_Contact_DAO_SavedSearch
    */
   public static function create(&$params) {
-    $savedSearch = new CRM_Contact_DAO_SavedSearch();
-    $savedSearch->copyValues($params);
-    $savedSearch->save();
+    // Auto-create unique name from label if supplied
+    if (empty($params['id']) && empty($params['name']) && !empty($params['label'])) {
+      $name = CRM_Utils_String::munge($params['label']);
+      $existing = Civi\Api4\SavedSearch::get(FALSE)
+        ->addWhere('name', 'LIKE', $name . '%')
+        ->addSelect('name')
+        ->execute()->column('name');
+      $suffix = '';
+      while (in_array($name . $suffix, $existing)) {
+        $suffix = '_' . (1 + str_replace('_', '', $suffix));
+      }
+      $params['name'] = $name . $suffix;
+    }
 
-    return $savedSearch;
+    return self::writeRecord($params);
   }
 
   /**
@@ -422,4 +432,33 @@ LEFT JOIN civicrm_email ON (contact_a.id = civicrm_email.contact_id AND civicrm_
     }
   }
 
+  /**
+   * Generate a url to the appropriate search form for a given savedSearch
+   *
+   * @param int $id
+   *   Saved search id
+   * @return string
+   */
+  public static function getEditSearchUrl($id) {
+    $savedSearch = self::retrieve(['id' => $id]);
+    // APIv4 search
+    if (!empty($savedSearch->api_entity)) {
+      $groupName = self::getName($id);
+      return CRM_Utils_System::url('civicrm/search', NULL, FALSE, "/load/Group/$groupName");
+    }
+    // Classic search builder
+    if (!empty($savedSearch->mapping_id)) {
+      $path = 'civicrm/contact/search/builder';
+    }
+    // Classic custom search
+    elseif (!empty($savedSearch->search_custom_id)) {
+      $path = 'civicrm/contact/search/custom';
+    }
+    // Classic advanced search
+    else {
+      $path = 'civicrm/contact/search/advanced';
+    }
+    return CRM_Utils_System::url($path, ['reset' => 1, 'ssID' => $id]);
+  }
+
 }