/** * Process the form. * * * @return void */ public function postProcess() { // get the submitted form values. $params = $this->controller->exportValues('Group'); $params['overrideFKConstraint'] = 0; if ($this->_action & CRM_Core_Action::UPDATE) { $params['id'] = $this->_id; if ($this->_defaults['extends'][0] != $params['extends'][0]) { $params['overrideFKConstraint'] = 1; } if (!empty($this->_subtypes)) { $subtypesToBeRemoved = array_diff($this->_subtypes, array_intersect($this->_subtypes, $params['extends'][1])); CRM_Contact_BAO_ContactType::deleteCustomRowsOfSubtype($this->_id, $subtypesToBeRemoved); } } elseif ($this->_action & CRM_Core_Action::ADD) { //new custom set , so lets set the created_id $session = CRM_Core_Session::singleton(); $params['created_id'] = $session->get('userID'); $params['created_date'] = date('YmdHis'); } $group = CRM_Core_BAO_CustomGroup::create($params); // reset the cache CRM_Core_BAO_Cache::deleteGroup('contact fields'); if ($this->_action & CRM_Core_Action::UPDATE) { CRM_Core_Session::setStatus(ts('Your custom field set \'%1 \' has been saved.', array(1 => $group->title)), ts('Saved'), 'success'); } else { // Jump directly to adding a field if popups are disabled $action = CRM_Core_Resources::singleton()->ajaxPopupsEnabled ? '' : '/add'; $url = CRM_Utils_System::url("civicrm/admin/custom/group/field{$action}", 'reset=1&new=1&gid=' . $group->id . '&action=' . ($action ? 'add' : 'browse')); CRM_Core_Session::setStatus(ts("Your custom field set '%1' has been added. You can add custom fields now.", array(1 => $group->title)), ts('Saved'), 'success'); $session = CRM_Core_Session::singleton(); $session->replaceUserContext($url); } // prompt Drupal Views users to update $db_prefix in settings.php, if necessary global $db_prefix; $config = CRM_Core_Config::singleton(); if (is_array($db_prefix) && $config->userSystem->is_drupal && module_exists('views')) { // get table_name for each custom group $tables = array(); $sql = "SELECT table_name FROM civicrm_custom_group WHERE is_active = 1"; $result = CRM_Core_DAO::executeQuery($sql); while ($result->fetch()) { $tables[$result->table_name] = $result->table_name; } // find out which tables are missing from the $db_prefix array $missingTableNames = array_diff_key($tables, $db_prefix); if (!empty($missingTableNames)) { CRM_Core_Session::setStatus(ts("To ensure that all of your custom data groups are available to Views, you may need to add the following key(s) to the db_prefix array in your settings.php file: '%1'.", array(1 => implode(', ', $missingTableNames))), ts('Note'), 'info'); } } }
/** * Unit test to ensure that removing any subtype from CustomGroup's * extend_for setting, won't delete any custom data of contact * * Success expected */ public function testCRM19133() { $customGroupName = md5(microtime()); $subtypesToPreserve = array($this->student, $this->parent); // Create custom group that extends student and parent subtype $apiParams = array('title' => $customGroupName, 'extends' => array('Individual', $subtypesToPreserve), 'is_active' => TRUE); $result = civicrm_api3('customGroup', 'create', $apiParams); $customGroupId = $result['id']; // Create desired custom field $apiParams = array('debug' => 1, 'custom_group_id' => $result['id'], 'label' => $customGroupName, 'html_type' => 'Text', 'data_type' => 'String', 'is_active' => TRUE); $result = civicrm_api3('custom_field', 'create', $apiParams); $customFieldId = $result['id']; // Create contact of subtype parent and student $params = array('first_name' => 'Anne', 'last_name' => 'Grant', 'contact_type' => 'Individual', 'contact_sub_type' => array($this->student, $this->parent)); $contact = CRM_Contact_BAO_Contact::add($params); // Record custom value for desired customGroup $this->callAPISuccess('CustomValue', 'create', array('entity_id' => $contact->id, 'custom_' . $customFieldId => 'value 1')); // Subtype to be removed from customGroup setting $subtypesToBeRemoved = array($this->student); CRM_Contact_BAO_ContactType::deleteCustomRowsOfSubtype($customGroupId, $subtypesToBeRemoved, $subtypesToPreserve); // Check with correct value to assert that custom data is not deleted $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customFieldId => 'value 1')); $this->assertEquals(1, $result['count']); $this->assertEquals($contact->id, $result['id']); //Check with incorrect custom value that our previous assertion was correct $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customFieldId => 'wrong value')); $this->assertEquals(0, $result['count']); }