/** * Store and return an array of all active custom fields. * * @param string $customDataType * Type of Custom Data; empty is a synonym for "all contact data types". * @param bool $showAll * If true returns all fields (includes disabled fields). * @param bool $inline * If true returns all inline fields (includes disabled fields). * @param int $customDataSubType * Custom Data sub type value. * @param int $customDataSubName * Custom Data sub name value. * @param bool $onlyParent * Return only top level custom data, for eg, only Participant and ignore subname and subtype. * @param bool $onlySubType * Return only custom data for subtype. * @param bool $checkPermission * If false, do not include permissioning clause. * * @return array * an array of active custom fields. * */ public static function &getFields($customDataType = 'Individual', $showAll = FALSE, $inline = FALSE, $customDataSubType = NULL, $customDataSubName = NULL, $onlyParent = FALSE, $onlySubType = FALSE, $checkPermission = TRUE) { if (empty($customDataType)) { $customDataType = array('Contact', 'Individual', 'Organization', 'Household'); } if ($customDataType && !is_array($customDataType)) { if (in_array($customDataType, CRM_Contact_BAO_ContactType::subTypes())) { // This is the case when getFieldsForImport() requires fields // limited strictly to a subtype. $customDataSubType = $customDataType; $customDataType = CRM_Contact_BAO_ContactType::getBasicType($customDataType); $onlySubType = TRUE; } if (in_array($customDataType, array_keys(CRM_Core_SelectValues::customGroupExtends()))) { // this makes the method flexible to support retrieving fields // for multiple extends value. $customDataType = array($customDataType); } } $customDataSubType = CRM_Utils_Array::explodePadded($customDataSubType); if (is_array($customDataType)) { $cacheKey = implode('_', $customDataType); } else { $cacheKey = $customDataType; } $cacheKey .= !empty($customDataSubType) ? '_' . implode('_', $customDataSubType) : '_0'; $cacheKey .= $customDataSubName ? "{$customDataSubName}_" : '_0'; $cacheKey .= $showAll ? '_1' : '_0'; $cacheKey .= $inline ? '_1_' : '_0_'; $cacheKey .= $onlyParent ? '_1_' : '_0_'; $cacheKey .= $onlySubType ? '_1_' : '_0_'; $cacheKey .= $checkPermission ? '_1_' : '_0_'; $cgTable = CRM_Core_DAO_CustomGroup::getTableName(); // also get the permission stuff here if ($checkPermission) { $permissionClause = CRM_Core_Permission::customGroupClause(CRM_Core_Permission::VIEW, "{$cgTable}."); } else { $permissionClause = '(1)'; } // lets md5 permission clause and take first 8 characters $cacheKey .= substr(md5($permissionClause), 0, 8); if (strlen($cacheKey) > 40) { $cacheKey = md5($cacheKey); } if (!self::$_importFields || CRM_Utils_Array::value($cacheKey, self::$_importFields) === NULL) { if (!self::$_importFields) { self::$_importFields = array(); } // check if we can retrieve from database cache $fields = CRM_Core_BAO_Cache::getItem('contact fields', "custom importableFields {$cacheKey}"); if ($fields === NULL) { $cfTable = self::getTableName(); $extends = ''; if (is_array($customDataType)) { $value = NULL; foreach ($customDataType as $dataType) { if (in_array($dataType, array_keys(CRM_Core_SelectValues::customGroupExtends()))) { if (in_array($dataType, array('Individual', 'Household', 'Organization'))) { $val = "'" . CRM_Utils_Type::escape($dataType, 'String') . "', 'Contact' "; } else { $val = "'" . CRM_Utils_Type::escape($dataType, 'String') . "'"; } $value = $value ? $value . ", {$val}" : $val; } } if ($value) { $extends = "AND {$cgTable}.extends IN ( {$value} ) "; } } if (!empty($customDataType) && empty($extends)) { // $customDataType specified a filter, but there is no corresponding SQL ($extends) self::$_importFields[$cacheKey] = array(); return self::$_importFields[$cacheKey]; } if ($onlyParent) { $extends .= " AND {$cgTable}.extends_entity_column_value IS NULL AND {$cgTable}.extends_entity_column_id IS NULL "; } $query = "SELECT {$cfTable}.id, {$cfTable}.label,\n {$cgTable}.title,\n {$cfTable}.data_type,\n {$cfTable}.html_type,\n {$cfTable}.default_value,\n {$cfTable}.options_per_line, {$cfTable}.text_length,\n {$cfTable}.custom_group_id,\n {$cfTable}.is_required,\n {$cgTable}.extends, {$cfTable}.is_search_range,\n {$cgTable}.extends_entity_column_value,\n {$cgTable}.extends_entity_column_id,\n {$cfTable}.is_view,\n {$cfTable}.option_group_id,\n {$cfTable}.date_format,\n {$cfTable}.time_format,\n {$cgTable}.is_multiple,\n og.name as option_group_name\n FROM {$cfTable}\n INNER JOIN {$cgTable}\n ON {$cfTable}.custom_group_id = {$cgTable}.id\n LEFT JOIN civicrm_option_group og\n ON {$cfTable}.option_group_id = og.id\n WHERE ( 1 ) "; if (!$showAll) { $query .= " AND {$cfTable}.is_active = 1 AND {$cgTable}.is_active = 1 "; } if ($inline) { $query .= " AND {$cgTable}.style = 'Inline' "; } //get the custom fields for specific type in //combination with fields those support any type. if (!empty($customDataSubType)) { $subtypeClause = array(); foreach ($customDataSubType as $subtype) { $subtype = CRM_Core_DAO::VALUE_SEPARATOR . $subtype . CRM_Core_DAO::VALUE_SEPARATOR; $subtypeClause[] = "{$cgTable}.extends_entity_column_value LIKE '%{$subtype}%'"; } if (!$onlySubType) { $subtypeClause[] = "{$cgTable}.extends_entity_column_value IS NULL"; } $query .= " AND ( " . implode(' OR ', $subtypeClause) . " )"; } if ($customDataSubName) { $query .= " AND ( {$cgTable}.extends_entity_column_id = {$customDataSubName} ) "; } // also get the permission stuff here if ($checkPermission) { $permissionClause = CRM_Core_Permission::customGroupClause(CRM_Core_Permission::VIEW, "{$cgTable}.", TRUE); } else { $permissionClause = '(1)'; } $query .= " {$extends} AND {$permissionClause}\n ORDER BY {$cgTable}.weight, {$cgTable}.title,\n {$cfTable}.weight, {$cfTable}.label"; $dao = CRM_Core_DAO::executeQuery($query); $fields = array(); while ($dao->fetch() != NULL) { $fields[$dao->id]['label'] = $dao->label; $fields[$dao->id]['groupTitle'] = $dao->title; $fields[$dao->id]['data_type'] = $dao->data_type; $fields[$dao->id]['html_type'] = $dao->html_type; $fields[$dao->id]['default_value'] = $dao->default_value; $fields[$dao->id]['text_length'] = $dao->text_length; $fields[$dao->id]['options_per_line'] = $dao->options_per_line; $fields[$dao->id]['custom_group_id'] = $dao->custom_group_id; $fields[$dao->id]['extends'] = $dao->extends; $fields[$dao->id]['is_search_range'] = $dao->is_search_range; $fields[$dao->id]['extends_entity_column_value'] = $dao->extends_entity_column_value; $fields[$dao->id]['extends_entity_column_id'] = $dao->extends_entity_column_id; $fields[$dao->id]['is_view'] = $dao->is_view; $fields[$dao->id]['is_multiple'] = $dao->is_multiple; $fields[$dao->id]['option_group_id'] = $dao->option_group_id; $fields[$dao->id]['date_format'] = $dao->date_format; $fields[$dao->id]['time_format'] = $dao->time_format; $fields[$dao->id]['is_required'] = $dao->is_required; self::getOptionsForField($fields[$dao->id], $dao->option_group_name); } CRM_Core_BAO_Cache::setItem($fields, 'contact fields', "custom importableFields {$cacheKey}"); } self::$_importFields[$cacheKey] = $fields; } return self::$_importFields[$cacheKey]; }
/** * Store and return an array of all active custom fields. * * @param string $customDataType type of Custom Data * @param boolean $showAll If true returns all fields (includes disabled fields) * @param boolean $inline If true returns all inline fields (includes disabled fields) * @param int $customDataSubType Custom Data sub type value * @param int $customDataSubName Custom Data sub name value * @param boolean $onlyParent return only top level custom data, for eg, only Participant and ignore subname and subtype * * @return array $fields - an array of active custom fields. * * @access public * @static */ public static function &getFields($customDataType = 'Individual', $showAll = false, $inline = false, $customDataSubType = null, $customDataSubName = null, $onlyParent = false) { $onlySubType = false; if ($customDataType && !is_array($customDataType)) { if (in_array($customDataType, CRM_Contact_BAO_ContactType::subTypes())) { // This is the case when getFieldsForImport() requires fields // limited strictly to a subtype. $customDataSubType = $customDataType; $customDataType = CRM_Contact_BAO_ContactType::getBasicType($customDataType); $onlySubType = true; } if (in_array($customDataType, array_keys(CRM_Core_SelectValues::customGroupExtends()))) { // this makes the method flexible to support retrieving fields // for multiple extends value. $customDataType = array($customDataType); } } if (is_array($customDataType)) { $cacheKey = implode('_', $customDataType); } else { $cacheKey = $customDataType; } $cacheKey .= $customDataSubType ? "{$customDataSubType}_" : "_0"; $cacheKey .= $customDataSubName ? "{$customDataSubName}_" : "_0"; $cacheKey .= $showAll ? "_1" : "_0"; $cacheKey .= $inline ? "_1_" : "_0_"; $cacheKey .= $onlyParent ? "_1_" : "_0_"; $cacheKey .= $onlySubType ? "_1_" : "_0_"; $cgTable = CRM_Core_DAO_CustomGroup::getTableName(); // also get the permission stuff here require_once 'CRM/Core/Permission.php'; $permissionClause = CRM_Core_Permission::customGroupClause(CRM_Core_Permission::VIEW, "{$cgTable}."); // lets md5 permission clause and take first 8 characters $cacheKey .= substr(md5($permissionClause), 0, 8); if (strlen($cacheKey) > 40) { $cacheKey = md5($cacheKey); } if (!self::$_importFields || CRM_Utils_Array::value($cacheKey, self::$_importFields) === null) { if (!self::$_importFields) { self::$_importFields = array(); } // check if we can retrieve from database cache require_once 'CRM/Core/BAO/Cache.php'; $fields =& CRM_Core_BAO_Cache::getItem('contact fields', "custom importableFields {$cacheKey}"); if ($fields === null) { $cfTable = self::getTableName(); $extends = ''; if (is_array($customDataType)) { $value = null; foreach ($customDataType as $dataType) { if (in_array($dataType, array_keys(CRM_Core_SelectValues::customGroupExtends()))) { if (in_array($dataType, array('Individual', 'Household', 'Organization'))) { $val = "'" . CRM_Utils_Type::escape($dataType, 'String') . "', 'Contact' "; } else { $val = "'" . CRM_Utils_Type::escape($dataType, 'String') . "'"; } $value = $value ? $value . ", {$val}" : $val; } } if ($value) { $extends = "AND {$cgTable}.extends IN ( {$value} ) "; } } if ($onlyParent) { $extends .= " AND {$cgTable}.extends_entity_column_value IS NULL AND {$cgTable}.extends_entity_column_id IS NULL "; } $query = "SELECT {$cfTable}.id, {$cfTable}.label,\n {$cgTable}.title,\n {$cfTable}.data_type, {$cfTable}.html_type,\n {$cfTable}.options_per_line,\n {$cgTable}.extends, {$cfTable}.is_search_range,\n {$cgTable}.extends_entity_column_value,\n {$cgTable}.extends_entity_column_id,\n {$cfTable}.is_view,\n {$cfTable}.option_group_id,\n {$cfTable}.date_format,\n {$cfTable}.time_format,\n {$cgTable}.is_multiple\n FROM {$cfTable}\n INNER JOIN {$cgTable}\n ON {$cfTable}.custom_group_id = {$cgTable}.id\n WHERE ( 1 ) "; if (!$showAll) { $query .= " AND {$cfTable}.is_active = 1 AND {$cgTable}.is_active = 1 "; } if ($inline) { $query .= " AND {$cgTable}.style = 'Inline' "; } //get the custom fields for specific type in //combination with fields those support any type. if ($customDataSubType) { $customDataSubType = CRM_Core_DAO::VALUE_SEPARATOR . $customDataSubType . CRM_Core_DAO::VALUE_SEPARATOR; $query .= " AND ( {$cgTable}.extends_entity_column_value LIKE '%{$customDataSubType}%'"; if (!$onlySubType) { $query .= " OR {$cgTable}.extends_entity_column_value IS NULL"; } $query .= " )"; } if ($customDataSubName) { $query .= " AND ( {$cgTable}.extends_entity_column_id = {$customDataSubName} ) "; } // also get the permission stuff here require_once 'CRM/Core/Permission.php'; $permissionClause = CRM_Core_Permission::customGroupClause(CRM_Core_Permission::VIEW, "{$cgTable}.", true); $query .= " {$extends} AND {$permissionClause}\n ORDER BY {$cgTable}.weight, {$cgTable}.title,\n {$cfTable}.weight, {$cfTable}.label"; $dao =& CRM_Core_DAO::executeQuery($query); $fields = array(); while ($dao->fetch() != null) { $fields[$dao->id]['label'] = $dao->label; $fields[$dao->id]['groupTitle'] = $dao->title; $fields[$dao->id]['data_type'] = $dao->data_type; $fields[$dao->id]['html_type'] = $dao->html_type; $fields[$dao->id]['options_per_line'] = $dao->options_per_line; $fields[$dao->id]['extends'] = $dao->extends; $fields[$dao->id]['is_search_range'] = $dao->is_search_range; $fields[$dao->id]['extends_entity_column_value'] = $dao->extends_entity_column_value; $fields[$dao->id]['extends_entity_column_id'] = $dao->extends_entity_column_id; $fields[$dao->id]['is_view'] = $dao->is_view; $fields[$dao->id]['is_multiple'] = $dao->is_multiple; $fields[$dao->id]['option_group_id'] = $dao->option_group_id; $fields[$dao->id]['date_format'] = $dao->date_format; $fields[$dao->id]['time_format'] = $dao->time_format; } CRM_Core_BAO_Cache::setItem($fields, 'contact fields', "custom importableFields {$cacheKey}"); } self::$_importFields[$cacheKey] = $fields; } return self::$_importFields[$cacheKey]; }
/** * Store and return an array of all active custom fields. * * @param string $contactType Contact type * @param boolean $showAll If true returns all fields (includes disabled fields) * * @return array $fields - an array of active custom fields. * * @access public * @static */ function &getFields($contactType = 'Individual', $showAll = false) { if (!$GLOBALS['_CRM_CORE_BAO_CUSTOMFIELD']['_importFields'] || !CRM_Utils_Array::value($contactType, $GLOBALS['_CRM_CORE_BAO_CUSTOMFIELD']['_importFields'])) { if (!$GLOBALS['_CRM_CORE_BAO_CUSTOMFIELD']['_importFields']) { $GLOBALS['_CRM_CORE_BAO_CUSTOMFIELD']['_importFields'] = array(); } $cfTable = CRM_Core_BAO_CustomField::getTableName(); $cgTable = CRM_Core_DAO_CustomGroup::getTableName(); $extends = ''; if ($contactType) { if (in_array($contactType, array('Individual', 'Household', 'Organization'))) { $value = "'" . CRM_Utils_Type::escape($contactType, 'String') . "', 'Contact' "; } else { $value = "'" . CRM_Utils_Type::escape($contactType, 'String') . "'"; } $extends = "AND {$cgTable}.extends IN ( {$value} ) "; } $query = "SELECT {$cfTable}.id, {$cfTable}.label,\n {$cgTable}.title,\n {$cfTable}.data_type, {$cfTable}.html_type,\n {$cfTable}.options_per_line,\n {$cgTable}.extends, {$cfTable}.is_search_range\n FROM {$cfTable}\n INNER JOIN {$cgTable}\n ON {$cfTable}.custom_group_id = {$cgTable}.id\n WHERE "; if (!$showAll) { $query .= "{$cfTable}.is_active = 1\n AND {$cgTable}.is_active = 1"; } else { $query .= " 1 "; } $query .= " {$extends}\n ORDER BY {$cgTable}.weight, {$cgTable}.title,\n {$cfTable}.weight, {$cfTable}.label"; $crmDAO =& new CRM_Core_DAO(); $crmDAO->query($query); $result = $crmDAO->getDatabaseResult(); $fields = array(); while (($row = $result->fetchRow()) != null) { $id = array_shift($row); $fields[$id] = $row; } $GLOBALS['_CRM_CORE_BAO_CUSTOMFIELD']['_importFields'][$contactType] = $fields; } // CRM_Core_Error::debug( 's', self::$_importFields ); return $GLOBALS['_CRM_CORE_BAO_CUSTOMFIELD']['_importFields'][$contactType]; }