CRM-17984 - CRM_Core_BAO_CustomGroup - Extract whereListHas()
authorTim Otten <totten@civicrm.org>
Sat, 23 Apr 2016 00:19:07 +0000 (17:19 -0700)
committerTim Otten <totten@civicrm.org>
Sat, 23 Apr 2016 00:52:57 +0000 (17:52 -0700)
This seems to have been a rather fiddly bit of SQL that was duplicated in the past.

CRM/Core/BAO/CustomGroup.php

index fe42c04bf88ec5f1300b9732e82c16697744c71a..d56c7ed18bdda7608aab7b81fc4d49c2ed831c95 100644 (file)
@@ -441,7 +441,7 @@ LEFT JOIN civicrm_custom_field ON (civicrm_custom_field.custom_group_id = civicr
 
     if (!empty($subTypes)) {
       foreach ($subTypes as $key => $subType) {
-        $subTypeClauses[] = "civicrm_custom_group.extends_entity_column_value LIKE '%" . self::validateSubTypeByEntity($entityType, $subType) . "%'";
+        $subTypeClauses[] = self::whereListHas("civicrm_custom_group.extends_entity_column_value", self::validateSubTypeByEntity($entityType, $subType));
       }
       $subTypeClause = '(' .  implode(' OR ', $subTypeClauses) . ')';
       if (!$onlySubType) {
@@ -660,6 +660,22 @@ ORDER BY civicrm_custom_group.weight,
     return $subType;
   }
 
+  /**
+   * Suppose you have a SQL column, $column, which includes a delimited list, and you want
+   * a WHERE condition for rows that include $value. Use whereListHas().
+   *
+   * @param string $column
+   * @param string $value
+   * @param string $delimiter
+   * @return string
+   *   SQL condition.
+   */
+  static private function whereListHas($column, $value, $delimiter = CRM_Core_DAO::VALUE_SEPARATOR) {
+    $bareValue = trim($value, $delimiter); // ?
+    $escapedValue = CRM_Utils_Type::escape("%{$delimiter}{$bareValue}{$delimiter}%", 'String', FALSE);
+    return "($column LIKE \"$escapedValue\")";
+  }
+
   /**
    * Check whether the custom group has any data for the given entity.
    *