Пример #1
0
 /**
  * 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];
 }
Пример #2
0
 /**
  * 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];
 }
Пример #3
0
 /**
  * @param $entityType
  * @param $path
  * @param string $cidToken
  *
  * @return array
  */
 public static function &getActiveGroups($entityType, $path, $cidToken = '%%cid%%')
 {
     // for Group's
     $customGroupDAO = new CRM_Core_DAO_CustomGroup();
     // get 'Tab' and 'Tab with table' groups
     $customGroupDAO->whereAdd("style IN ('Tab', 'Tab with table')");
     $customGroupDAO->whereAdd("is_active = 1");
     // add whereAdd for entity type
     self::_addWhereAdd($customGroupDAO, $entityType, $cidToken);
     $groups = array();
     $permissionClause = CRM_Core_Permission::customGroupClause(CRM_Core_Permission::VIEW, NULL, TRUE);
     $customGroupDAO->whereAdd($permissionClause);
     // order by weight
     $customGroupDAO->orderBy('weight');
     $customGroupDAO->find();
     // process each group with menu tab
     while ($customGroupDAO->fetch()) {
         $group = array();
         $group['id'] = $customGroupDAO->id;
         $group['path'] = $path;
         $group['title'] = "{$customGroupDAO->title}";
         $group['query'] = "reset=1&gid={$customGroupDAO->id}&cid={$cidToken}";
         $group['extra'] = array('gid' => $customGroupDAO->id);
         $group['table_name'] = $customGroupDAO->table_name;
         $group['is_multiple'] = $customGroupDAO->is_multiple;
         $groups[] = $group;
     }
     return $groups;
 }
Пример #4
0
 /**
  * @param int $activityTypeID
  * @param null $dateFormat
  *
  * @return mixed
  */
 public function getActivityTypeCustomSQL($activityTypeID, $dateFormat = NULL)
 {
     static $cache = array();
     if (is_null($activityTypeID)) {
         $activityTypeID = 0;
     }
     if (!isset($cache[$activityTypeID])) {
         $query = "\nSELECT cg.title           as groupTitle,\n       cg.table_name      as tableName ,\n       cf.column_name     as columnName,\n       cf.label           as label     ,\n       cg.id              as groupID   ,\n       cf.id              as fieldID   ,\n       cf.data_type       as dataType  ,\n       cf.html_type       as htmlType  ,\n       cf.option_group_id as optionGroupID\nFROM   civicrm_custom_group cg,\n       civicrm_custom_field cf\nWHERE  cf.custom_group_id = cg.id\nAND    cg.extends = 'Activity'\nAND " . CRM_Core_Permission::customGroupClause(CRM_Core_Permission::VIEW, 'cg.');
         if ($activityTypeID) {
             $query .= "AND ( cg.extends_entity_column_value IS NULL OR cg.extends_entity_column_value LIKE '%" . CRM_Core_DAO::VALUE_SEPARATOR . "%1" . CRM_Core_DAO::VALUE_SEPARATOR . "%' )";
         } else {
             $query .= "AND cg.extends_entity_column_value IS NULL";
         }
         $query .= "ORDER BY cg.weight, cf.weight";
         $params = array(1 => array($activityTypeID, 'Integer'));
         $dao = CRM_Core_DAO::executeQuery($query, $params);
         $result = $options = $sql = $groupTitle = array();
         while ($dao->fetch()) {
             if (!array_key_exists($dao->tableName, $result)) {
                 $result[$dao->tableName] = array();
                 $sql[$dao->tableName] = array();
             }
             $result[$dao->tableName][$dao->columnName] = array('label' => $dao->label, 'type' => $dao->dataType, 'fieldID' => $dao->fieldID);
             $options[$dao->fieldID] = array();
             $options[$dao->fieldID]['attributes'] = array('label' => $dao->label, 'data_type' => $dao->dataType, 'html_type' => $dao->htmlType);
             // since we want to add ISO date format.
             if ($dateFormat && $dao->htmlType == 'Select Date') {
                 $options[$dao->fieldID]['attributes']['format'] = $dateFormat;
             }
             if ($dao->optionGroupID) {
                 $query = "\nSELECT label, value\n  FROM civicrm_option_value\n WHERE option_group_id = {$dao->optionGroupID}\n";
                 $option = CRM_Core_DAO::executeQuery($query);
                 while ($option->fetch()) {
                     $dataType = $dao->dataType;
                     if ($dataType == 'Int' || $dataType == 'Float') {
                         $num = round($option->value, 2);
                         $options[$dao->fieldID]["{$num}"] = $option->label;
                     } else {
                         $options[$dao->fieldID][$option->value] = $option->label;
                     }
                 }
             }
             $sql[$dao->tableName][] = $dao->columnName;
             $groupTitle[$dao->tableName] = $dao->groupTitle;
         }
         foreach ($sql as $tableName => $values) {
             $columnNames = implode(',', $values);
             $sql[$tableName] = "\nSELECT '{$groupTitle[$tableName]}' as groupTitle, {$columnNames}\nFROM   {$tableName}\nWHERE  entity_id = %1\n";
         }
         $cache[$activityTypeID] = array($result, $options, $sql);
     }
     return $cache[$activityTypeID];
 }