}
}
+ /**
+ * Get the title of an option group by name.
+ *
+ * @param string $name
+ * The name value for the option group table.
+ *
+ * @return string
+ * The relevant title.
+ */
+ public static function getTitleByName($name) {
+ $groups = self::getTitlesByNames();
+ return $groups[$name];
+ }
+
+ /**
+ * Get a cached mapping of all group titles indexed by their unique name.
+ *
+ * We tend to only have a limited number of option groups so memory caching
+ * makes more sense than multiple look-ups.
+ *
+ * @return array
+ * Array of all group titles by name.
+ * e.g
+ * array('activity_status' => 'Activity Status', 'msg_mode' => 'Message Mode'....)
+ */
+ public static function getTitlesByNames() {
+ if (!isset(\Civi::$statics[__CLASS__]) || !isset(\Civi::$statics[__CLASS__]['titles_by_name'])) {
+ $dao = CRM_Core_DAO::executeQuery("SELECT name, title FROM civicrm_option_group");
+ while ($dao->fetch()) {
+ \Civi::$statics[__CLASS__]['titles_by_name'][$dao->name] = $dao->title;
+ }
+ }
+ return \Civi::$statics[__CLASS__]['titles_by_name'];
+ }
+
+ /**
+ * Set the given values to active, and set all other values to inactive.
+ *
+ * @param string $optionGroupName
+ * e.g "languages"
+ * @param array<string> $activeValues
+ * e.g. array("en_CA","fr_CA")
+ */
+ public static function setActiveValues($optionGroupName, $activeValues) {
+ $params = array(
+ 1 => array($optionGroupName, 'String'),
+ );
+
+ // convert activeValues into placeholders / params in the query
+ $placeholders = array();
+ $i = count($params) + 1;
+ foreach ($activeValues as $value) {
+ $placeholders[] = "%{$i}";
+ $params[$i] = array($value, 'String');
+ $i++;
+ }
+ $placeholders = implode(', ', $placeholders);
+
+ CRM_Core_DAO::executeQuery("
+UPDATE civicrm_option_value cov
+ LEFT JOIN civicrm_option_group cog ON cov.option_group_id = cog.id
+SET cov.is_active = CASE WHEN cov.name IN ({$placeholders}) THEN 1 ELSE 0 END
+WHERE cog.name = %1",
+ $params
+ );
+ }
+
}