3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.3 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2013 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2013
39 class CRM_Core_BAO_UFGroup
extends CRM_Core_DAO_UFGroup
{
40 CONST PUBLIC_VISIBILITY
= 1,
42 LISTINGS_VISIBILITY
= 4;
45 * cache the match clause used in this transaction
49 static $_matchFields = NULL;
52 * Takes a bunch of params that are needed to match certain criteria and
53 * retrieves the relevant objects. Typically the valid params are only
54 * contact_id. We'll tweak this function to be more full featured over a period
55 * of time. This is the inverse function of create. It also stores all the retrieved
56 * values in the default array
58 * @param array $params (reference) an assoc array of name/value pairs
59 * @param array $defaults (reference) an assoc array to hold the flattened values
61 * @return object CRM_Core_DAO_UFGroup object
65 static function retrieve(&$params, &$defaults) {
66 return CRM_Core_DAO
::commonRetrieve('CRM_Core_DAO_UFGroup', $params, $defaults);
70 * Retrieve the first non-generic contact type
72 * @param int $id id of uf_group
74 * @return string contact type
76 static function getContactType($id) {
78 $validTypes = array_filter(array_keys(CRM_Core_SelectValues
::contactType()));
79 $validSubTypes = CRM_Contact_BAO_ContactType
::subTypeInfo();
81 $typesParts = explode(CRM_Core_DAO
::VALUE_SEPARATOR
, CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_UFGroup', $id, 'group_type'));
82 $types = explode(',', $typesParts[0]);
85 foreach ($types as $type) {
86 if (in_array($type, $validTypes)) {
89 elseif (array_key_exists($type, $validSubTypes)) {
90 $cType = CRM_Utils_Array
::value('parent', $validSubTypes[$type]);
100 * Get the form title.
102 * @param int $id id of uf_form
104 * @return string title
110 public static function getTitle($id) {
111 return CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_UFGroup', $id, 'title');
115 * update the is_active flag in the db
117 * @param int $id id of the database record
118 * @param boolean $is_active value we want to set the is_active field
120 * @return Object CRM_Core_DAO_UFGroup object on success, null otherwise
124 static function setIsActive($id, $is_active) {
125 return CRM_Core_DAO
::setFieldValue('CRM_Core_DAO_UFGroup', $id, 'is_active', $is_active);
129 * get all the registration fields
131 * @param int $action what action are we doing
132 * @param int $mode mode
134 * @return array the fields that are needed for registration
138 static function getRegistrationFields($action, $mode, $ctype = NULL) {
139 if ($mode & CRM_Profile_Form
::MODE_REGISTER
) {
140 $ufGroups = CRM_Core_BAO_UFGroup
::getModuleUFGroup('User Registration');
143 $ufGroups = CRM_Core_BAO_UFGroup
::getModuleUFGroup('Profile');
146 if (!is_array($ufGroups)) {
152 foreach ($ufGroups as $id => $title) {
154 $fieldType = CRM_Core_BAO_UFField
::getProfileType($id);
155 if (($fieldType != 'Contact') &&
156 ($fieldType != $ctype) &&
157 !CRM_Contact_BAO_ContactType
::isExtendsContactType($fieldType, $ctype)
161 if (CRM_Contact_BAO_ContactType
::isaSubType($fieldType)) {
162 $profileSubType = $fieldType;
166 $subset = self
::getFields($id, TRUE, $action,
167 NULL, NULL, FALSE, NULL, TRUE, $ctype
170 // we do not allow duplicates. the first field is the winner
171 foreach ($subset as $name => $field) {
172 if (!CRM_Utils_Array
::value($name, $fields)) {
173 $fields[$name] = $field;
182 * get all the listing fields
184 * @param int $action what action are we doing
185 * @param int $visibility visibility of fields we are interested in
186 * @param bool $considerSelector whether to consider the in_selector parameter
187 * @param array $ufGroupIds
188 * @param boolean $searchable
190 * @return array the fields that are listings related
194 static function getListingFields(
197 $considerSelector = FALSE,
201 $skipPermission = FALSE,
202 $permissionType = CRM_Core_Permission
::SEARCH
205 $subset = self
::getFields($ufGroupIds, FALSE, $action,
206 $visibility, $searchable,
212 if ($considerSelector) {
213 // drop the fields not meant for the selector
214 foreach ($subset as $name => $field) {
215 if (!$field['in_selector']) {
216 unset($subset[$name]);
223 $ufGroups = CRM_Core_PseudoConstant
::get('CRM_Core_DAO_UFField', 'uf_group_id');
226 foreach ($ufGroups as $id => $title) {
227 $subset = self
::getFields($id, FALSE, $action,
228 $visibility, $searchable,
234 if ($considerSelector) {
235 // drop the fields not meant for the selector
236 foreach ($subset as $name => $field) {
237 if (!$field['in_selector'])unset($subset[$name]);
240 $fields = array_merge($fields, $subset);
247 * Get all the fields that belong to the group with the name title,
248 * and format for use with buildProfile. This is the SQL analog of
251 * @param mix $id the id of the UF group or ids of ufgroup
252 * @param int $register are we interested in registration fields
253 * @param int $action what action are we doing
254 * @param int $visibility visibility of fields we are interested in
256 * @param boolean $showall
257 * @param string $restrict should we restrict based on a specified profile type
259 * @return array the fields that belong to this ufgroup(s)
263 static function getFields(
271 $skipPermission = FALSE,
273 $permissionType = CRM_Core_Permission
::CREATE
,
274 $orderBy = 'field_name',
275 $orderProfiles = NULL
277 if (!is_array($id)) {
278 $id = CRM_Utils_Type
::escape($id, 'Positive');
279 $profileIds = array($id);
285 $gids = implode(',', $profileIds);
288 $query = "SELECT g.* from civicrm_uf_group g, civicrm_uf_join j
289 WHERE g.id IN ( {$gids} )
290 AND j.uf_group_id IN ( {$gids} )
293 $params = array(1 => array($restrict, 'String'));
296 $query = "SELECT g.* from civicrm_uf_group g WHERE g.id IN ( {$gids} ) ";
300 $query .= " AND g.is_active = 1";
303 // add permissioning for profiles only if not registration
304 if (!$skipPermission) {
305 $permissionClause = CRM_Core_Permission
::ufGroupClause($permissionType, 'g.');
306 $query .= " AND $permissionClause ";
309 if ($orderProfiles AND count($profileIds) > 1) {
310 $query .= " ORDER BY FIELD( g.id, {$gids} )";
312 $group = CRM_Core_DAO
::executeQuery($query, $params);
316 while ($group->fetch()) {
318 $query = self
::createUFFieldQuery($group->id
, $searchable, $showAll, $visibility, $orderBy);
319 $field = CRM_Core_DAO
::executeQuery($query);
321 $profileType = CRM_Core_BAO_UFField
::getProfileType($group->id
);
322 $contactActivityProfile = CRM_Core_BAO_UFField
::checkContactActivityProfileType($group->id
);
323 $importableFields = self
::getImportableFields($showAll, $profileType, $contactActivityProfile);
324 list($customFields, $addressCustomFields) = self
::getCustomFields($ctype);
326 while ($field->fetch()) {
327 list($name, $formattedField) = self
::formatUFField($group, $field, $customFields, $addressCustomFields, $importableFields, $permissionType);
328 if ($formattedField !== NULL) {
329 $fields[$name] = $formattedField;
335 if (empty($fields) && !$validGroup) {
336 CRM_Core_Error
::fatal(ts('The requested Profile (gid=%1) is disabled OR it is not configured to be used for \'Profile\' listings in its Settings OR there is no Profile with that ID OR you do not have permission to access this profile. Please contact the site administrator if you need assistance.',
337 array(1 => implode(',', $profileIds))
341 self
::reformatProfileFields($fields);
348 * Format a list of UFFields for use with buildProfile. This is the in-memory analog
351 * @param array $groupArr (mimic CRM_UF_DAO_UFGroup)
352 * @param array $fieldArrs list of fields (each mimics CRM_UF_DAO_UFField)
353 * @param bool $visibility visibility of fields we are interested in
354 * @param bool $searchable
355 * @param bool $showall
359 public static function formatUFFields(
366 $permissionType = CRM_Core_Permission
::CREATE
368 // $group = new CRM_Core_DAO_UFGroup();
369 // $group->copyValues($groupArr); // no... converts string('') to string('null')
370 $group = (object) $groupArr;
372 // Refactoring note: The $fieldArrs here may be slightly different than the $ufFields
373 // used by calculateGroupType, but I don't think the missing fields matter, and -- if
374 // they did -- the obvious fix would produce mutual recursion.
375 $ufGroupType = self
::_calculateGroupType($fieldArrs);
376 $profileType = CRM_Core_BAO_UFField
::calculateProfileType(implode(',',$ufGroupType));
377 $contactActivityProfile = CRM_Core_BAO_UFField
::checkContactActivityProfileTypeByGroupType(implode(',',$ufGroupType));
378 $importableFields = self
::getImportableFields($showAll, $profileType, $contactActivityProfile);
379 list($customFields, $addressCustomFields) = self
::getCustomFields($ctype);
381 $formattedFields = array();
382 foreach ($fieldArrs as $fieldArr) {
383 $field = (object) $fieldArr;
384 if (!self
::filterUFField($field, $searchable, $showAll, $visibility)) {
388 list($name, $formattedField) = self
::formatUFField($group, $field, $customFields, $addressCustomFields, $importableFields, $permissionType);
389 if ($formattedField !== NULL) {
390 $formattedFields[$name] = $formattedField;
393 return $formattedFields;
397 * Prepare a field for rendering with CRM_Core_BAO_UFGroup::buildProfile.
399 * @param CRM_Core_DAO_UFGroup|CRM_Core_DAO $group
400 * @param CRM_Core_DAO_UFField|CRM_Core_DAO $field
401 * @param array $addressCustomFields
402 * @param array $importableFields
403 * @param array $customFields
404 * @param int $permissionType eg CRM_Core_Permission::CREATE
407 protected static function formatUFField(
411 $addressCustomFields,
413 $permissionType = CRM_Core_Permission
::CREATE
415 $name = $field->field_name
;
416 $title = $field->label
;
418 $addressCustom = FALSE;
419 if (in_array($permissionType, array(
420 CRM_Core_Permission
::CREATE
,
421 CRM_Core_Permission
::EDIT
,
423 in_array($field->field_name
, array_keys($addressCustomFields))
425 $addressCustom = TRUE;
426 $name = "address_{$name}";
429 if (!empty($field->location_type_id
)) {
430 $name .= "-{$field->location_type_id}";
433 $locationFields = self
::getLocationFields();
434 if (in_array($field->field_name
, $locationFields) ||
$addressCustom) {
439 if (isset($field->phone_type_id
)) {
440 $name .= "-{$field->phone_type_id}";
443 // No lie: this is bizarre; why do we need to mix so many UFGroup properties into UFFields?
444 // I guess to make field self sufficient with all the required data and avoid additional calls
445 $formattedField = array(
447 'groupTitle' => $group->title
,
448 'groupName' => $group->name
,
449 'groupHelpPre' => empty($group->help_pre
) ?
'' : $group->help_pre
,
450 'groupHelpPost' => empty($group->help_post
) ?
'' : $group->help_post
,
452 'where' => CRM_Utils_Array
::value('where', CRM_Utils_Array
::value($field->field_name
, $importableFields)),
453 'attributes' => CRM_Core_DAO
::makeAttribute(CRM_Utils_Array
::value($field->field_name
, $importableFields)),
454 'is_required' => $field->is_required
,
455 'is_view' => $field->is_view
,
456 'help_pre' => $field->help_pre
,
457 'help_post' => $field->help_post
,
458 'visibility' => $field->visibility
,
459 'in_selector' => $field->in_selector
,
460 'rule' => CRM_Utils_Array
::value('rule', CRM_Utils_Array
::value($field->field_name
, $importableFields)),
461 'location_type_id' => isset($field->location_type_id
) ?
$field->location_type_id
: NULL,
462 'phone_type_id' => isset($field->phone_type_id
) ?
$field->phone_type_id
: NULL,
463 'group_id' => $group->id
,
464 'add_to_group_id' => isset($group->add_to_group_id
) ?
$group->add_to_group_id
: NULL,
465 'add_captcha' => isset($group->add_captcha
) ?
$group->add_captcha
: NULL,
466 'field_type' => $field->field_type
,
467 'field_id' => $field->id
,
468 'pseudoconstant' => CRM_Utils_Array
::value(
470 CRM_Utils_Array
::value($field->field_name
, $importableFields)
472 // obsolete this when we remove the name / dbName discrepancy with gender/suffix/prefix
473 'dbName' => CRM_Utils_Array
::value(
475 CRM_Utils_Array
::value($field->field_name
, $importableFields)
480 //adding custom field property
481 if (substr($field->field_name
, 0, 6) == 'custom' ||
482 substr($field->field_name
, 0, 14) === 'address_custom'
484 // if field is not present in customFields, that means the user
485 // DOES NOT HAVE permission to access that field
486 if (array_key_exists($field->field_name
, $customFields)) {
487 $formattedField['is_search_range'] = $customFields[$field->field_name
]['is_search_range'];
489 $formattedField['options_per_line'] = $customFields[$field->field_name
]['options_per_line'];
490 $formattedField['data_type'] = $customFields[$field->field_name
]['data_type'];
491 $formattedField['html_type'] = $customFields[$field->field_name
]['html_type'];
493 if (CRM_Utils_Array
::value('html_type', $formattedField) == 'Select Date') {
494 $formattedField['date_format'] = $customFields[$field->field_name
]['date_format'];
495 $formattedField['time_format'] = $customFields[$field->field_name
]['time_format'];
498 $formattedField['is_multi_summary'] = $field->is_multi_summary
;
499 return array($name, $formattedField);
502 $formattedField = NULL;
503 return array($name, $formattedField);
506 return array($name, $formattedField);
510 * Create a query to find all visible UFFields in a UFGroup
512 * This is the SQL-variant of checkUFFieldDisplayable().
514 * @param int $groupId
515 * @param bool $searchable
516 * @param bool $showAll
517 * @param int $visibility
518 * @param string $orderBy comma-delimited list of SQL columns
521 protected static function createUFFieldQuery($groupId, $searchable, $showAll, $visibility, $orderBy) {
522 $where = " WHERE uf_group_id = {$groupId}";
525 $where .= " AND is_searchable = 1";
529 $where .= " AND is_active = 1";
534 if ($visibility & self
::PUBLIC_VISIBILITY
) {
535 $clause[] = 'visibility = "Public Pages"';
537 if ($visibility & self
::ADMIN_VISIBILITY
) {
538 $clause[] = 'visibility = "User and User Admin Only"';
540 if ($visibility & self
::LISTINGS_VISIBILITY
) {
541 $clause[] = 'visibility = "Public Pages and Listings"';
543 if (!empty($clause)) {
544 $where .= ' AND ( ' . implode(' OR ', $clause) . ' ) ';
548 $query = "SELECT * FROM civicrm_uf_field $where ORDER BY weight";
550 $query .= ", " . $orderBy;
557 * Create a query to find all visible UFFields in a UFGroup
559 * This is the PHP in-memory variant of createUFFieldQuery().
561 * @param CRM_Core_DAO_UFField|CRM_Core_DAO $field
562 * @param bool $searchable
563 * @param bool $showAll
564 * @param int $visibility
565 * @return bool TRUE if field is displayable
567 protected static function filterUFField($field, $searchable, $showAll, $visibility) {
568 if ($searchable && $field->is_searchable
!= 1) {
572 if (!$showAll && $field->is_active
!= 1) {
577 $allowedVisibilities = array();
578 if ($visibility & self
::PUBLIC_VISIBILITY
) {
579 $allowedVisibilities[] = 'Public Pages';
581 if ($visibility & self
::ADMIN_VISIBILITY
) {
582 $allowedVisibilities[] = 'User and User Admin Only';
584 if ($visibility & self
::LISTINGS_VISIBILITY
) {
585 $allowedVisibilities[] = 'Public Pages and Listings';
587 // !empty($allowedVisibilities) seems silly to me, but it is equivalent to the pre-existing SQL
588 if (!empty($allowedVisibilities) && !in_array($field->visibility
, $allowedVisibilities)) {
596 protected static function getImportableFields($showAll, $profileType, $contactActivityProfile) {
598 $importableFields = CRM_Contact_BAO_Contact
::importableFields('All', FALSE, FALSE, FALSE, TRUE, TRUE);
601 $importableFields = CRM_Contact_BAO_Contact
::importableFields('All', FALSE, TRUE, FALSE, TRUE, TRUE);
604 if ($profileType == 'Activity' ||
$contactActivityProfile) {
605 $componentFields = CRM_Activity_BAO_Activity
::getProfileFields();
608 $componentFields = CRM_Core_Component
::getQueryFields();
611 $importableFields = array_merge($importableFields, $componentFields);
613 $importableFields['group']['title'] = ts('Group(s)');
614 $importableFields['group']['where'] = NULL;
615 $importableFields['tag']['title'] = ts('Tag(s)');
616 $importableFields['tag']['where'] = NULL;
617 return $importableFields;
620 public static function getLocationFields() {
621 static $locationFields = array(
623 'supplemental_address_1',
624 'supplemental_address_2',
627 'postal_code_suffix',
640 return $locationFields;
643 protected static function getCustomFields($ctype) {
644 static $customFieldCache = array();
645 if (!isset($customFieldCache[$ctype])) {
646 $customFields = CRM_Core_BAO_CustomField
::getFieldsForImport($ctype, FALSE, FALSE, FALSE, TRUE, TRUE);
648 // hack to add custom data for components
649 $components = array('Contribution', 'Participant', 'Membership', 'Activity');
650 foreach ($components as $value) {
651 $customFields = array_merge($customFields, CRM_Core_BAO_CustomField
::getFieldsForImport($value));
653 $addressCustomFields = CRM_Core_BAO_CustomField
::getFieldsForImport('Address');
654 $customFields = array_merge($customFields, $addressCustomFields);
655 $customFieldCache[$ctype] = array($customFields, $addressCustomFields);
657 return $customFieldCache[$ctype];
661 * check the data validity
663 * @param int $userID the user id that we are actually editing
664 * @param string $title the title of the group we are interested in
665 * @pram boolean $register is this the registrtion form
666 * @param int $action the action of the form
668 * @return boolean true if form is valid
672 static function isValid($userID, $title, $register = FALSE, $action = NULL) {
674 $controller = new CRM_Core_Controller_Simple('CRM_Profile_Form_Dynamic',
675 ts('Dynamic Form Creator'),
678 $controller->set('id', $userID);
679 $controller->set('register', 1);
680 $controller->process();
681 return $controller->validate();
684 // make sure we have a valid group
685 $group = new CRM_Core_DAO_UFGroup();
687 $group->title
= $title;
689 if ($group->find(TRUE) && $userID) {
690 $controller = new CRM_Core_Controller_Simple('CRM_Profile_Form_Dynamic', ts('Dynamic Form Creator'), $action);
691 $controller->set('gid', $group->id
);
692 $controller->set('id', $userID);
693 $controller->set('register', 0);
694 $controller->process();
695 return $controller->validate();
702 * get the html for the form that represents this particular group
704 * @param int $userID the user id that we are actually editing
705 * @param string $title the title of the group we are interested in
706 * @param int $action the action of the form
707 * @param boolean $register is this the registration form
708 * @param boolean $reset should we reset the form?
709 * @param int $profileID do we have the profile ID?
711 * @return string the html for the form on success, otherwise empty string
715 static function getEditHTML($userID,
721 $doNotProcess = FALSE,
726 $controller = new CRM_Core_Controller_Simple('CRM_Profile_Form_Dynamic',
727 ts('Dynamic Form Creator'),
730 if ($reset ||
$doNotProcess) {
731 // hack to make sure we do not process this form
732 $oldQFDefault = CRM_Utils_Array
::value('_qf_default',
735 unset($_POST['_qf_default']);
736 unset($_REQUEST['_qf_default']);
738 $controller->reset();
742 $controller->set('id', $userID);
743 $controller->set('register', 1);
744 $controller->set('skipPermission', 1);
745 $controller->set('ctype', $ctype);
746 $controller->process();
747 if ($doNotProcess ||
!empty($_POST)) {
748 $controller->validate();
750 $controller->setEmbedded(TRUE);
752 //CRM-5839 - though we want to process form, get the control back.
753 $controller->setSkipRedirection(($doNotProcess) ?
FALSE : TRUE);
757 // we are done processing so restore the POST/REQUEST vars
758 if (($reset ||
$doNotProcess) && $oldQFDefault) {
759 $_POST['_qf_default'] = $_REQUEST['_qf_default'] = $oldQFDefault;
762 $template = CRM_Core_Smarty
::singleton();
764 // Hide CRM error messages if they are displayed using drupal form_set_error.
765 if (!empty($_POST)) {
766 $template->assign('suppressForm', TRUE);
769 return trim($template->fetch('CRM/Profile/Form/Dynamic.tpl'));
773 // make sure we have a valid group
774 $group = new CRM_Core_DAO_UFGroup();
776 $group->title
= $title;
778 if ($group->find(TRUE)) {
779 $profileID = $group->id
;
784 // make sure profileID and ctype match if ctype exists
786 $profileType = CRM_Core_BAO_UFField
::getProfileType($profileID);
787 if (CRM_Contact_BAO_ContactType
::isaSubType($profileType)) {
788 $profileType = CRM_Contact_BAO_ContactType
::getBasicType($profileType);
791 if (($profileType != 'Contact') && ($profileType != $ctype)) {
796 $controller = new CRM_Core_Controller_Simple('CRM_Profile_Form_Dynamic',
797 ts('Dynamic Form Creator'),
801 $controller->reset();
803 $controller->set('gid', $profileID);
804 $controller->set('id', $userID);
805 $controller->set('register', 0);
806 $controller->set('skipPermission', 1);
808 $controller->set('ctype', $ctype);
810 $controller->process();
811 $controller->setEmbedded(TRUE);
813 //CRM-5846 - give the control back to drupal.
814 $controller->setSkipRedirection(($doNotProcess) ?
FALSE : TRUE);
817 $template = CRM_Core_Smarty
::singleton();
819 // Hide CRM error messages if they are displayed using drupal form_set_error.
820 if (!empty($_POST) && CRM_Core_Config
::singleton()->userFramework
== 'Drupal') {
821 if (arg(0) == 'user' ||
(arg(0) == 'admin' && arg(1) == 'people')) {
822 $template->assign('suppressForm', TRUE);
826 $templateFile = "CRM/Profile/Form/{$profileID}/Dynamic.tpl";
827 if (!$template->template_exists($templateFile)) {
828 $templateFile = 'CRM/Profile/Form/Dynamic.tpl';
830 return trim($template->fetch($templateFile));
833 $userEmail = CRM_Contact_BAO_Contact_Location
::getEmailDetails($userID);
835 // if post not empty then only proceed
836 if (!empty($_POST)) {
838 $config = CRM_Core_Config
::singleton();
839 $email = CRM_Utils_Array
::value('mail', $_POST);
841 if (CRM_Utils_Rule
::email($email) && ($email != $userEmail[1])) {
842 CRM_Core_BAO_UFMatch
::updateContactEmail($userID, $email);
851 * searches for a contact in the db with similar attributes
853 * @param array $params the list of values to be used in the where clause
854 * @param int $id the current contact id (hence excluded from matching)
855 * @param boolean $flatten should we flatten the input params
857 * @return contact_id if found, null otherwise
861 public static function findContact(&$params, $id = NULL, $contactType = 'Individual') {
862 $dedupeParams = CRM_Dedupe_Finder
::formatParams($params, $contactType);
863 $dedupeParams['check_permission'] = CRM_Utils_Array
::value('check_permission', $params, TRUE);
864 $ids = CRM_Dedupe_Finder
::dupesByParams($dedupeParams, $contactType, 'Supervised', array($id));
866 return implode(',', $ids);
874 * Given a contact id and a field set, return the values from the db
877 * @param int $id the contact id
878 * @param array $fields the profile fields of interest
879 * @param array $values the values for the above fields
880 * @param boolean $searchable searchable or not
881 * @param array $componentWhere component condition
882 * @param boolean $absolute return urls in absolute form (useful when sending an email)
888 public static function getValues($cid, &$fields, &$values,
889 $searchable = TRUE, $componentWhere = NULL,
890 $absolute = FALSE, $additionalWhereClause = NULL
892 if (empty($cid) && empty($componentWhere)) {
896 // get the contact details (hier)
897 $returnProperties = CRM_Contact_BAO_Contact
::makeHierReturnProperties($fields);
898 $params = $cid ?
array(array('contact_id', '=', $cid, 0, 0)) : array();
900 // add conditions specified by components. eg partcipant_id etc
901 if (!empty($componentWhere)) {
902 $params = array_merge($params, $componentWhere);
905 $query = new CRM_Contact_BAO_Query($params, $returnProperties, $fields);
906 $options = &$query->_options
;
908 $details = $query->searchQuery( 0, 0, NULL, FALSE, FALSE,
909 FALSE, FALSE, FALSE, $additionalWhereClause);
910 if (!$details->fetch()) {
914 $config = CRM_Core_Config
::singleton();
916 $locationTypes = CRM_Core_PseudoConstant
::get('CRM_Core_DAO_Address', 'location_type_id');
917 $imProviders = CRM_Core_PseudoConstant
::get('CRM_Core_DAO_IM', 'provider_id');
918 $websiteTypes = CRM_Core_PseudoConstant
::get('CRM_Core_DAO_Website', 'website_type_id');
920 $multipleFields = array('url');
921 $nullIndex = $nullValueIndex = ' ';
923 //start of code to set the default values
924 foreach ($fields as $name => $field) {
927 $name = 'contact_id';
930 // skip fields that should not be displayed separately
931 if (CRM_Utils_Array
::value('skipDisplay', $field)) {
935 $index = $field['title'];
936 //handle for the label not set for the field
937 if (empty($field['title'])) {
939 $nullIndex .= $nullIndex;
942 //handle the case to avoid re-write where the profile field labels are the same
943 if (CRM_Utils_Array
::value($index, $values)) {
944 $index .= $nullValueIndex;
945 $nullValueIndex .= $nullValueIndex;
947 $params[$index] = $values[$index] = '';
948 $customFieldName = NULL;
950 if (isset($details->$name) ||
$name == 'group' ||
$name == 'tag') {
951 // to handle gender / suffix / prefix
952 if (in_array($name, array(
953 'gender', 'individual_prefix', 'individual_suffix'))) {
954 $values[$index] = $details->$name;
955 $name = $name . '_id';
956 $params[$index] = $details->$name;
958 elseif (in_array($name, CRM_Contact_BAO_Contact
::$_greetingTypes)) {
959 $dname = $name . '_display';
960 $values[$index] = $details->$dname;
961 $name = $name . '_id';
962 $params[$index] = $details->$name;
964 elseif (in_array($name, array(
965 'state_province', 'country', 'county'))) {
966 $values[$index] = $details->$name;
967 $idx = $name . '_id';
968 $params[$index] = $details->$idx;
970 elseif ($name === 'preferred_communication_method') {
971 $communicationFields = CRM_Core_PseudoConstant
::get('CRM_Contact_DAO_Contact', 'preferred_communication_method');
973 $pref = explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $details->$name);
975 foreach ($pref as $k) {
977 $compref[] = $communicationFields[$k];
980 $params[$index] = $details->$name;
981 $values[$index] = implode(',', $compref);
983 elseif ($name === 'preferred_language') {
984 $params[$index] = $details->$name;
985 $values[$index] = CRM_Core_PseudoConstant
::getLabel('CRM_Contact_DAO_Contact', 'preferred_language', $details->$name);
987 elseif ($name == 'group') {
988 $groups = CRM_Contact_BAO_GroupContact
::getContactGroup($cid, 'Added', NULL, FALSE, TRUE);
989 $title = $ids = array();
991 foreach ($groups as $g) {
992 // CRM-8362: User and User Admin visibility groups should be included in display if user has
993 // VIEW permission on that group
994 $groupPerm = CRM_Contact_BAO_Group
::checkPermission($g['group_id'], $g['title']);
996 if ($g['visibility'] != 'User and User Admin Only' ||
997 CRM_Utils_Array
::key(CRM_Core_Permission
::VIEW
, $groupPerm)
999 $title[] = $g['title'];
1000 if ($g['visibility'] == 'Public Pages') {
1001 $ids[] = $g['group_id'];
1005 $values[$index] = implode(', ', $title);
1006 $params[$index] = implode(',', $ids);
1008 elseif ($name == 'tag') {
1009 $entityTags = CRM_Core_BAO_EntityTag
::getTag($cid);
1010 $allTags = CRM_Core_PseudoConstant
::get('CRM_Core_DAO_EntityTag', 'tag_id', array('onlyActive' => FALSE));
1012 foreach ($entityTags as $tagId) {
1013 $title[] = $allTags[$tagId];
1015 $values[$index] = implode(', ', $title);
1016 $params[$index] = implode(',', $entityTags);
1018 elseif ($name == 'activity_status_id') {
1019 $activityStatus = CRM_Core_PseudoConstant
::activityStatus();
1020 $values[$index] = $activityStatus[$details->$name];
1021 $params[$index] = $details->$name;
1023 elseif ($name == 'activity_date_time') {
1024 $values[$index] = CRM_Utils_Date
::customFormat($details->$name);
1025 $params[$index] = $details->$name;
1027 elseif ($name == 'contact_sub_type') {
1028 $contactSubTypeNames = explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $details->$name);
1029 if (!empty($contactSubTypeNames)) {
1030 $contactSubTypeLabels = array();
1031 // get all contact subtypes
1032 $allContactSubTypes = CRM_Contact_BAO_ContactType
::subTypeInfo();
1033 // build contact subtype labels array
1034 foreach( $contactSubTypeNames as $cstName ) {
1036 $contactSubTypeLabels[] = $allContactSubTypes[$cstName]['label'];
1039 $values[$index] = implode(',', $contactSubTypeLabels);
1042 $params[$index] = $details->$name;
1045 if (substr($name, 0, 7) === 'do_not_' ||
substr($name, 0, 3) === 'is_') {
1046 if ($details->$name) {
1047 $values[$index] = '[ x ]';
1051 if ($cfID = CRM_Core_BAO_CustomField
::getKeyID($name)) {
1052 $htmlType = $field['html_type'];
1054 // field_type is only set when we are retrieving profile values
1055 // when sending email, we call the same function to get custom field
1056 // values etc, i.e. emulating a profile
1057 $fieldType = CRM_Utils_Array
::value('field_type', $field);
1059 if ($htmlType == 'File') {
1062 $fieldType == 'Activity' &&
1063 CRM_Utils_Array
::value(2, $componentWhere[0])
1065 $entityId = $componentWhere[0][2];
1068 $fileURL = CRM_Core_BAO_CustomField
::getFileURL($entityId,
1073 $params[$index] = $values[$index] = $fileURL['file_url'];
1077 if (isset($dao) && property_exists($dao, 'data_type') &&
1078 ($dao->data_type
== 'Int' ||
1079 $dao->data_type
== 'Boolean'
1082 $customVal = (int )($details->{$name});
1084 elseif (isset($dao) && property_exists($dao, 'data_type')
1085 && $dao->data_type
== 'Float'
1087 $customVal = (float )($details->{$name});
1089 elseif (!CRM_Utils_System
::isNull(explode(CRM_Core_DAO
::VALUE_SEPARATOR
,
1092 $customVal = $details->{$name};
1096 if (CRM_Utils_System
::isNull($customVal)) {
1100 $params[$index] = $customVal;
1101 $values[$index] = CRM_Core_BAO_CustomField
::getDisplayValue($customVal,
1105 if ($htmlType == 'Autocomplete-Select') {
1106 $params[$index] = $values[$index];
1108 if (CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_CustomField',
1109 $cfID, 'is_search_range'
1111 $customFieldName = "{$name}_from";
1115 elseif ($name == 'image_URL') {
1116 list($width, $height) = getimagesize($details->$name);
1117 list($thumbWidth, $thumbHeight) = CRM_Contact_BAO_Contact
::getThumbSize($width, $height);
1119 $image_URL = '<img src="' . $details->$name . '" height= ' . $thumbHeight . ' width= ' . $thumbWidth . ' />';
1120 $values[$index] = "<a href='#' onclick='contactImagePopUp(\"{$details->$name}\", {$width}, {$height});'>{$image_URL}</a>";
1122 elseif (in_array($name, array(
1123 'birth_date', 'deceased_date', 'membership_start_date', 'membership_end_date', 'join_date'))) {
1124 $values[$index] = CRM_Utils_Date
::customFormat($details->$name);
1125 $params[$index] = CRM_Utils_Date
::isoToMysql($details->$name);
1129 if ($index == 'Campaign') {
1130 $dao = 'CRM_Campaign_DAO_Campaign';
1132 elseif ($index == 'Contribution Page') {
1133 $dao = 'CRM_Contribute_DAO_ContributionPage';
1136 $value = CRM_Core_DAO
::getFieldValue($dao, $details->$name, 'title');
1139 $value = $details->$name;
1141 $values[$index] = $value;
1146 elseif (strpos($name, '-') !== FALSE) {
1147 list($fieldName, $id, $type) = CRM_Utils_System
::explode('-', $name, 3);
1149 if (!in_array($fieldName, $multipleFields)) {
1150 if ($id == 'Primary') {
1152 // not sure why we'd every use Primary location type id
1153 // we need to fix the source if we are using it
1154 // $locationTypeName = CRM_Contact_BAO_Contact::getPrimaryLocationType( $cid );
1155 $locationTypeName = 1;
1158 $locationTypeName = CRM_Utils_Array
::value($id, $locationTypes);
1161 if (!$locationTypeName) {
1165 $detailName = "{$locationTypeName}-{$fieldName}";
1166 $detailName = str_replace(' ', '_', $detailName);
1168 if (in_array($fieldName, array(
1169 'phone', 'im', 'email', 'openid'))) {
1171 $detailName .= "-{$type}";
1175 if (in_array($fieldName, array(
1176 'state_province', 'country', 'county'))) {
1177 $values[$index] = $details->$detailName;
1178 $idx = $detailName . '_id';
1179 $params[$index] = $details->$idx;
1181 elseif ($fieldName == 'im') {
1182 $providerId = $detailName . '-provider_id';
1183 $providerName = $imProviders[$details->$providerId];
1184 if ($providerName) {
1185 $values[$index] = $details->$detailName . " (" . $providerName . ")";
1188 $values[$index] = $details->$detailName;
1190 $params[$index] = $details->$detailName;
1192 elseif ($fieldName == 'phone') {
1193 $phoneExtField = str_replace('phone', 'phone_ext', $detailName);
1194 if (isset($details->$phoneExtField)) {
1195 $values[$index] = $details->$detailName . " (" . $details->$phoneExtField . ")";
1198 $values[$index] = $details->$detailName;
1200 $params[$index] = $details->$detailName;
1203 $values[$index] = $params[$index] = $details->$detailName;
1207 $detailName = "website-{$id}-{$fieldName}";
1208 $url = CRM_Utils_System
::fixURL($details->$detailName);
1209 if ($details->$detailName) {
1210 $websiteTypeId = "website-{$id}-website_type_id";
1211 $websiteType = $websiteTypes[$details->$websiteTypeId];
1212 $values[$index] = "<a href=\"$url\">{$details->$detailName} ( {$websiteType} )</a>";
1215 $values[$index] = '';
1220 if ((CRM_Utils_Array
::value('visibility', $field) == 'Public Pages and Listings') &&
1221 CRM_Core_Permission
::check('profile listings and forms')
1224 if (CRM_Utils_System
::isNull($params[$index])) {
1225 $params[$index] = $values[$index];
1227 if (!isset($params[$index])) {
1230 if (!$customFieldName) {
1231 $fieldName = $field['name'];
1234 $fieldName = $customFieldName;
1238 if (CRM_Core_BAO_CustomField
::getKeyID($field['name'])) {
1239 $htmlType = $field['html_type'];
1240 if ($htmlType == 'Link') {
1241 $url = $params[$index];
1243 elseif (in_array($htmlType, array(
1244 'CheckBox', 'Multi-Select', 'AdvMulti-Select',
1245 'Multi-Select State/Province', 'Multi-Select Country',
1247 $valSeperator = CRM_Core_DAO
::VALUE_SEPARATOR
;
1248 $selectedOptions = explode($valSeperator, $params[$index]);
1250 foreach ($selectedOptions as $key => $multiOption) {
1252 $url[] = CRM_Utils_System
::url('civicrm/profile',
1253 'reset=1&force=1&gid=' . $field['group_id'] . '&' .
1254 urlencode($fieldName) .
1256 urlencode($multiOption)
1262 $url = CRM_Utils_System
::url('civicrm/profile',
1263 'reset=1&force=1&gid=' . $field['group_id'] . '&' .
1264 urlencode($fieldName) .
1266 urlencode($params[$index])
1271 $url = CRM_Utils_System
::url('civicrm/profile',
1272 'reset=1&force=1&gid=' . $field['group_id'] . '&' .
1273 urlencode($fieldName) .
1275 urlencode($params[$index])
1280 !empty($values[$index]) &&
1284 if (is_array($url) && !empty($url)) {
1286 $eachMultiValue = explode(', ', $values[$index]);
1287 foreach ($eachMultiValue as $key => $valueLabel) {
1288 $links[] = '<a href="' . $url[$key] . '">' . $valueLabel . '</a>';
1290 $values[$index] = implode(', ', $links);
1293 $values[$index] = '<a href="' . $url . '">' . $values[$index] . '</a>';
1301 * Check if profile Group used by any module.
1303 * @param int $id profile Id
1311 public static function usedByModule($id) {
1312 //check whether this group is used by any module(check uf join records)
1314 FROM civicrm_uf_join
1315 WHERE civicrm_uf_join.uf_group_id=$id";
1317 $dao = new CRM_Core_DAO();
1319 if ($dao->fetch()) {
1328 * Delete the profile Group.
1330 * @param int $id profile Id
1338 public static function del($id) {
1339 //check whether this group contains any profile fields
1340 $profileField = new CRM_Core_DAO_UFField();
1341 $profileField->uf_group_id
= $id;
1342 $profileField->find();
1343 while ($profileField->fetch()) {
1344 CRM_Core_BAO_UFField
::del($profileField->id
);
1347 //delete records from uf join table
1348 $ufJoin = new CRM_Core_DAO_UFJoin();
1349 $ufJoin->uf_group_id
= $id;
1352 //delete profile group
1353 $group = new CRM_Core_DAO_UFGroup();
1360 * function to add the UF Group
1362 * @param array $params reference array contains the values submitted by the form
1363 * @param array $ids reference array contains the id
1370 static function add(&$params, $ids = array()) {
1371 $fields = array('is_active', 'add_captcha', 'is_map', 'is_update_dupe', 'is_edit_link', 'is_uf_link', 'is_cms_user');
1372 foreach ($fields as $field) {
1373 $params[$field] = CRM_Utils_Array
::value($field, $params, FALSE);
1376 $params['limit_listings_group_id'] = CRM_Utils_Array
::value('group', $params);
1377 $params['add_to_group_id'] = CRM_Utils_Array
::value('add_contact_to_group', $params);
1379 $ufGroup = new CRM_Core_DAO_UFGroup();
1380 $ufGroup->copyValues($params);
1382 $ufGroupID = CRM_Utils_Array
::value('ufgroup', $ids, CRM_Utils_Array
::value('id', $params));
1384 $ufGroup->name
= CRM_Utils_String
::munge($ufGroup->title
, '_', 56);
1386 $ufGroup->id
= $ufGroupID;
1391 $ufGroup->name
= $ufGroup->name
. "_{$ufGroup->id}";
1399 * Function to make uf join entries for an uf group
1401 * @param array $params (reference) an assoc array of name/value pairs
1402 * @param int $ufGroupId ufgroup id
1408 static function createUFJoin(&$params, $ufGroupId) {
1409 $groupTypes = CRM_Utils_Array
::value('uf_group_type', $params);
1411 // get ufjoin records for uf group
1412 $ufGroupRecord = CRM_Core_BAO_UFGroup
::getUFJoinRecord($ufGroupId);
1414 // get the list of all ufgroup types
1415 $allUFGroupType = CRM_Core_SelectValues
::ufGroupTypes();
1417 // this fix is done to prevent warning generated by array_key_exits incase of empty array is given as input
1418 if (!is_array($groupTypes)) {
1419 $groupTypes = array();
1422 // this fix is done to prevent warning generated by array_key_exits incase of empty array is given as input
1423 if (!is_array($ufGroupRecord)) {
1424 $ufGroupRecord = array();
1427 // check which values has to be inserted/deleted for contact
1428 $menuRebuild = FALSE;
1429 foreach ($allUFGroupType as $key => $value) {
1430 $joinParams = array();
1431 $joinParams['uf_group_id'] = $ufGroupId;
1432 $joinParams['module'] = $key;
1433 if ($key == 'User Account') {
1434 $menuRebuild = TRUE;
1436 if (array_key_exists($key, $groupTypes) && !in_array($key, $ufGroupRecord)) {
1437 // insert a new record
1438 CRM_Core_BAO_UFGroup
::addUFJoin($joinParams);
1440 elseif (!array_key_exists($key, $groupTypes) && in_array($key, $ufGroupRecord)) {
1441 // delete a record for existing ufgroup
1442 CRM_Core_BAO_UFGroup
::delUFJoin($joinParams);
1448 UPDATE civicrm_uf_join
1450 WHERE uf_group_id = %2
1451 AND ( entity_id IS NULL OR entity_id <= 0 )
1453 $p = array(1 => array($params['weight'], 'Integer'),
1454 2 => array($ufGroupId, 'Integer'),
1456 CRM_Core_DAO
::executeQuery($query, $p);
1458 // do a menu rebuild if we are on drupal, so it gets all the new menu entries
1460 $config = CRM_Core_Config
::singleton();
1462 $config->userSystem
->is_drupal
1469 * Function to get the UF Join records for an ufgroup id
1471 * @params int $ufGroupId uf group id
1472 * @params int $displayName if set return display name in array
1473 * @params int $status if set return module other than default modules (User Account/User registration/Profile)
1475 * @return array $ufGroupJoinRecords
1480 public static function getUFJoinRecord($ufGroupId = NULL, $displayName = NULL, $status = NULL) {
1482 $UFGroupType = array();
1483 $UFGroupType = CRM_Core_SelectValues
::ufGroupTypes();
1487 $dao = new CRM_Core_DAO_UFJoin();
1490 $dao->uf_group_id
= $ufGroupId;
1496 while ($dao->fetch()) {
1497 if (!$displayName) {
1498 $ufJoin[$dao->id
] = $dao->module
;
1501 if (isset($UFGroupType[$dao->module
])) {
1502 // skip the default modules
1504 $ufJoin[$dao->id
] = $UFGroupType[$dao->module
];
1506 // added for CRM-1475
1508 elseif (!CRM_Utils_Array
::key($dao->module
, $ufJoin)) {
1509 $ufJoin[$dao->id
] = $dao->module
;
1517 * Function takes an associative array and creates a ufjoin record for ufgroup
1519 * @param array $params (reference) an assoc array of name/value pairs
1521 * @return object CRM_Core_BAO_UFJoin object
1525 static function addUFJoin(&$params) {
1526 $ufJoin = new CRM_Core_DAO_UFJoin();
1527 $ufJoin->copyValues($params);
1533 * Function to delete the uf join record for an uf group
1535 * @param array $params (reference) an assoc array of name/value pairs
1541 static function delUFJoin(&$params) {
1542 $ufJoin = new CRM_Core_DAO_UFJoin();
1543 $ufJoin->copyValues($params);
1548 * Function to get the weight for ufjoin record
1550 * @param int $ufGroupId if $ufGroupId get update weight or add weight
1552 * @return int weight of the UFGroup
1556 static function getWeight($ufGroupId = NULL) {
1557 //calculate the weight
1560 $queryString = "SELECT ( MAX(civicrm_uf_join.weight)+1) as new_weight
1561 FROM civicrm_uf_join
1562 WHERE module = 'User Registration' OR module = 'User Account' OR module = 'Profile'";
1565 $queryString = "SELECT MAX(civicrm_uf_join.weight) as new_weight
1566 FROM civicrm_uf_join
1567 WHERE civicrm_uf_join.uf_group_id = %1
1568 AND ( entity_id IS NULL OR entity_id <= 0 )";
1569 $p[1] = array($ufGroupId, 'Integer');
1572 $dao = CRM_Core_DAO
::executeQuery($queryString, $p);
1574 return ($dao->new_weight
) ?
$dao->new_weight
: 1;
1578 * Function to get the uf group for a module
1580 * @param string $moduleName module name
1581 * $param int $count no to increment the weight
1582 * $param bool $skipPermision - whether to add permission clause
1583 * $param int $op - which operation (view, edit, create, etc) to check permission for
1585 * @return array $ufGroups array of ufgroups for a module
1589 public static function getModuleUFGroup($moduleName = NULL, $count = 0, $skipPermission = TRUE, $op = CRM_Core_Permission
::VIEW
) {
1590 $queryString = 'SELECT civicrm_uf_group.id, title, civicrm_uf_group.is_active, is_reserved, group_type
1591 FROM civicrm_uf_group
1592 LEFT JOIN civicrm_uf_join ON (civicrm_uf_group.id = uf_group_id)';
1595 $queryString .= ' AND civicrm_uf_group.is_active = 1
1596 WHERE civicrm_uf_join.module = %2';
1597 $p[2] = array($moduleName, 'String');
1601 // add permissioning for profiles only if not registration
1602 if (!$skipPermission) {
1603 $permissionClause = CRM_Core_Permission
::ufGroupClause($op, 'civicrm_uf_group.');
1604 if (strpos($queryString, 'WHERE') !== FALSE) {
1605 $queryString .= " AND $permissionClause ";
1608 $queryString .= " $permissionClause ";
1612 $queryString .= ' ORDER BY civicrm_uf_join.weight, civicrm_uf_group.title';
1613 $dao = CRM_Core_DAO
::executeQuery($queryString, $p);
1615 $ufGroups = array();
1616 while ($dao->fetch()) {
1617 //skip mix profiles in user Registration / User Account
1618 if (($moduleName == 'User Registration' ||
$moduleName == 'User Account') &&
1619 CRM_Core_BAO_UFField
::checkProfileType($dao->id
)
1623 $ufGroups[$dao->id
]['name'] = $dao->title
;
1624 $ufGroups[$dao->id
]['title'] = $dao->title
;
1625 $ufGroups[$dao->id
]['is_active'] = $dao->is_active
;
1626 $ufGroups[$dao->id
]['group_type'] = $dao->group_type
;
1627 $ufGroups[$dao->id
]['is_reserved'] = $dao->is_reserved
;
1630 // Allow other modules to alter/override the UFGroups.
1631 CRM_Utils_Hook
::buildUFGroupsForModule($moduleName, $ufGroups);
1637 * Function to filter ufgroups based on logged in user contact type
1639 * @params int $ufGroupId uf group id (profile id)
1641 * @return boolean true or false
1645 static function filterUFGroups($ufGroupId, $contactID = NULL) {
1647 $session = CRM_Core_Session
::singleton();
1648 $contactID = $session->get('userID');
1652 //get the contact type
1653 $contactType = CRM_Contact_BAO_Contact
::getContactType($contactID);
1655 //match if exixting contact type is same as profile contact type
1656 $profileType = CRM_Core_BAO_UFField
::getProfileType($ufGroupId);
1658 if (CRM_Contact_BAO_ContactType
::isaSubType($profileType)) {
1659 $profileType = CRM_Contact_BAO_ContactType
::getBasicType($profileType);
1662 //allow special mix profiles for Contribution and Participant
1663 $specialProfiles = array('Contribution', 'Participant', 'Membership');
1665 if (in_array($profileType, $specialProfiles)) {
1669 if (($contactType == $profileType) ||
$profileType == 'Contact') {
1678 * Function to build profile form
1680 * @params object $form form object
1681 * @params array $field array field properties
1682 * @params int $mode profile mode
1683 * @params int $contactID contact id
1689 static function buildProfile(
1699 $defaultValues = array();
1700 $fieldName = $field['name'];
1701 $title = $field['title'];
1702 $attributes = $field['attributes'];
1703 $rule = $field['rule'];
1704 $view = $field['is_view'];
1705 $required = ($mode == CRM_Profile_Form
::MODE_SEARCH
) ?
FALSE : $field['is_required'];
1706 $search = ($mode == CRM_Profile_Form
::MODE_SEARCH
) ?
TRUE : FALSE;
1707 $isShared = CRM_Utils_Array
::value('is_shared', $field, 0);
1709 // do not display view fields in drupal registration form
1711 if ($view && $mode == CRM_Profile_Form
::MODE_REGISTER
) {
1716 $name = "onbehalf[$fieldName]";
1718 elseif ($contactId && !$online) {
1719 $name = "field[$contactId][$fieldName]";
1721 elseif ($rowNumber) {
1722 $name = "field[$rowNumber][$fieldName]";
1724 elseif (!empty($prefix)) {
1725 $name = $prefix ."[$fieldName]";
1731 if ($fieldName == 'image_URL' && $mode == CRM_Profile_Form
::MODE_EDIT
) {
1732 $deleteExtra = ts('Are you sure you want to delete contact image.');
1734 CRM_Core_Action
::DELETE
=>
1736 'name' => ts('Delete Contact Image'),
1737 'url' => 'civicrm/contact/image',
1738 'qs' => 'reset=1&id=%%id%%&gid=%%gid%%&action=delete',
1740 'onclick = "if (confirm( \'' . $deleteExtra . '\' ) ) this.href+=\'&confirmed=1\'; else return false;"',
1743 $deleteURL = CRM_Core_Action
::formLink($deleteURL,
1744 CRM_Core_Action
::DELETE
,
1745 array('id' => $form->get('id'),
1746 'gid' => $form->get('gid'),
1749 $form->assign('deleteURL', $deleteURL);
1751 $addressOptions = CRM_Core_BAO_Setting
::valueOptions(CRM_Core_BAO_Setting
::SYSTEM_PREFERENCES_NAME
,
1752 'address_options', TRUE, NULL, TRUE
1755 if (substr($fieldName, 0, 14) === 'state_province') {
1756 $form->add('select', $name, $title,
1758 '' => ts('- select -')) + CRM_Core_PseudoConstant
::stateProvince(), $required
1760 $config = CRM_Core_Config
::singleton();
1761 if (!in_array($mode, array(
1762 CRM_Profile_Form
::MODE_EDIT
, CRM_Profile_Form
::MODE_SEARCH
)) &&
1763 $config->defaultContactStateProvince
1765 $defaultValues[$name] = $config->defaultContactStateProvince
;
1766 $form->setDefaults($defaultValues);
1769 elseif (substr($fieldName, 0, 7) === 'country') {
1770 $form->add('select', $name, $title,
1772 '' => ts('- select -')) + CRM_Core_PseudoConstant
::country(), $required
1774 $config = CRM_Core_Config
::singleton();
1775 if (!in_array($mode, array(
1776 CRM_Profile_Form
::MODE_EDIT
, CRM_Profile_Form
::MODE_SEARCH
)) &&
1777 $config->defaultContactCountry
1779 $defaultValues[$name] = $config->defaultContactCountry
;
1780 $form->setDefaults($defaultValues);
1783 elseif (substr($fieldName, 0, 6) === 'county') {
1784 if ($addressOptions['county']) {
1785 $form->add('select', $name, $title,
1787 '' => ts('- select state -')), $required
1791 elseif (substr($fieldName, 0, 9) === 'image_URL') {
1792 $form->add('file', $name, $title, $attributes, $required);
1793 $form->addUploadElement($name);
1795 elseif (substr($fieldName, 0, 2) === 'im') {
1796 $form->add('text', $name, $title, $attributes, $required);
1799 if (substr($name, -1) == ']') {
1800 $providerName = substr($name, 0, -1) . '-provider_id]';
1802 $form->add('select', $providerName, NULL,
1804 '' => ts('- select -')) + CRM_Core_PseudoConstant
::get('CRM_Core_DAO_IM', 'provider_id'), $required
1808 $form->add('select', $name . '-provider_id', $title,
1810 '' => ts('- select -')) + CRM_Core_PseudoConstant
::get('CRM_Core_DAO_IM', 'provider_id'), $required
1814 if ($view && $mode != CRM_Profile_Form
::MODE_SEARCH
) {
1815 $form->freeze($name . '-provider_id');
1819 elseif (($fieldName === 'birth_date') ||
($fieldName === 'deceased_date')) {
1820 $form->addDate($name, $title, $required, array('formatType' => 'birth'));
1822 elseif (in_array($fieldName, array(
1823 'membership_start_date', 'membership_end_date', 'join_date'))) {
1824 $form->addDate($name, $title, $required, array('formatType' => 'custom'));
1826 elseif (CRM_Utils_Array
::value('name',$field) == 'membership_type') {
1827 list($orgInfo, $types) = CRM_Member_BAO_MembershipType
::getMembershipTypeInfo();
1828 $sel = &$form->addElement('hierselect', $name, $title);
1829 $select = array( '' => ts('- select -') );
1830 $sel->setOptions(array( $select +
$orgInfo, $types));
1832 elseif (CRM_Utils_Array
::value('name',$field) == 'membership_status') {
1833 $form->add('select', $name, $title,
1835 '' => ts('- select -')) + CRM_Member_PseudoConstant
::membershipStatus(NULL, NULL, 'label'), $required
1838 elseif ($fieldName === 'gender') {
1839 $genderOptions = array();
1840 $gender = CRM_Core_PseudoConstant
::get('CRM_Contact_DAO_Contact', 'gender_id');
1841 foreach ($gender as $key => $var) {
1842 $genderOptions[$key] = $form->createElement('radio', NULL, ts('Gender'), $var, $key);
1844 $form->addGroup($genderOptions, $name, $title);
1846 $form->addRule($name, ts('%1 is a required field.', array(1 => $title)), 'required');
1849 elseif ($fieldName === 'individual_prefix') {
1850 $form->add('select', $name, $title,
1852 '' => ts('- select -')) + CRM_Core_PseudoConstant
::get('CRM_Contact_DAO_Contact', 'prefix_id'), $required
1855 elseif ($fieldName === 'individual_suffix') {
1856 $form->add('select', $name, $title,
1858 '' => ts('- select -')) + CRM_Core_PseudoConstant
::get('CRM_Contact_DAO_Contact', 'suffix_id'), $required
1861 elseif ($fieldName === 'contact_sub_type') {
1862 $gId = $form->get('gid') ?
$form->get('gid') : CRM_Utils_Array
::value('group_id', $field);
1864 $profileType = 'Organization';
1867 $profileType = $gId ? CRM_Core_BAO_UFField
::getProfileType($gId) : NULL;
1868 if ($profileType == 'Contact') {
1869 $profileType = 'Individual';
1873 $setSubtype = FALSE;
1874 if (CRM_Contact_BAO_ContactType
::isaSubType($profileType)) {
1875 $setSubtype = $profileType;
1876 $profileType = CRM_Contact_BAO_ContactType
::getBasicType($profileType);
1879 $subtypes = $profileType ? CRM_Contact_BAO_ContactType
::subTypePairs($profileType) : array();
1882 $subtypeList = array();
1883 $subtypeList[$setSubtype] = $subtypes[$setSubtype];
1886 $subtypeList = $subtypes;
1889 $sel = $form->add('select', $name, $title, $subtypeList, $required);
1890 $sel->setMultiple(TRUE);
1892 elseif (in_array($fieldName, CRM_Contact_BAO_Contact
::$_greetingTypes)) {
1893 //add email greeting, postal greeting, addressee, CRM-4575
1894 $gId = $form->get('gid') ?
$form->get('gid') : CRM_Utils_Array
::value('group_id', $field);
1895 $profileType = CRM_Core_BAO_UFField
::getProfileType($gId, TRUE, FALSE, TRUE);
1897 if (empty($profileType) ||
in_array($profileType, array(
1898 'Contact', 'Contribution', 'Participant', 'Membership'))) {
1899 $profileType = 'Individual';
1901 if (CRM_Contact_BAO_ContactType
::isaSubType($profileType)) {
1902 $profileType = CRM_Contact_BAO_ContactType
::getBasicType($profileType);
1905 'contact_type' => $profileType,
1906 'greeting_type' => $fieldName,
1908 $form->add('select', $name, $title,
1910 '' => ts('- select -')) + CRM_Core_PseudoConstant
::greeting($greeting), $required
1912 // add custom greeting element
1913 $form->add('text', $fieldName . '_custom', ts('Custom %1', array(1 => ucwords(str_replace('_', ' ', $fieldName)))),
1917 elseif ($fieldName === 'preferred_communication_method') {
1918 $communicationFields = CRM_Core_PseudoConstant
::get('CRM_Contact_DAO_Contact', 'preferred_communication_method');
1919 foreach ($communicationFields as $key => $var) {
1923 $communicationOptions[] = $form->createElement('checkbox', $key, NULL, $var);
1925 $form->addGroup($communicationOptions, $name, $title, '<br/>');
1927 elseif ($fieldName === 'preferred_mail_format') {
1928 $form->add('select', $name, $title, CRM_Core_SelectValues
::pmf());
1930 elseif ($fieldName === 'preferred_language') {
1931 $form->add('select', $name, $title, array('' => ts('- select -')) + CRM_Contact_BAO_Contact
::buildOptions('preferred_language'));
1933 elseif ($fieldName == 'external_identifier') {
1934 $form->add('text', $name, $title, $attributes, $required);
1935 $contID = $contactId;
1937 $contID = $form->get('id');
1939 $form->addRule($name,
1940 ts('External ID already exists in Database.'),
1942 array('CRM_Contact_DAO_Contact', $contID, 'external_identifier')
1945 elseif ($fieldName === 'group') {
1946 CRM_Contact_Form_Edit_TagsAndGroups
::buildQuickForm($form, $contactId,
1947 CRM_Contact_Form_Edit_TagsAndGroups
::GROUP
,
1952 elseif ($fieldName === 'tag') {
1953 CRM_Contact_Form_Edit_TagsAndGroups
::buildQuickForm($form, $contactId,
1954 CRM_Contact_Form_Edit_TagsAndGroups
::TAG
,
1959 elseif (substr($fieldName, 0, 4) === 'url-') {
1960 $form->add('text', $name, $title,
1961 array_merge(CRM_Core_DAO
::getAttribute('CRM_Core_DAO_Website', 'url'),
1963 'onfocus' => "if (!this.value) { this.value='http://';} else return false",
1964 'onblur' => "if ( this.value == 'http://') { this.value='';} else return false",
1969 $form->addRule($name, ts('Enter a valid Website.'), 'url');
1971 //Website type select
1973 if (substr($name, -1) == ']') {
1974 $websiteTypeName = substr($name, 0, -1) . '-website_type_id]';
1976 $form->addElement('select', $websiteTypeName, NULL, CRM_Core_PseudoConstant
::get('CRM_Core_DAO_Website', 'website_type_id'));
1979 $form->addElement('select', $name . '-website_type_id', NULL, CRM_Core_PseudoConstant
::get('CRM_Core_DAO_Website', 'website_type_id'));
1982 // Note should be rendered as textarea
1983 elseif (substr($fieldName, -4) == 'note') {
1984 $form->add('textarea', $name, $title, $attributes, $required);
1986 elseif (substr($fieldName, 0, 6) === 'custom') {
1987 $customFieldID = CRM_Core_BAO_CustomField
::getKeyID($fieldName);
1988 if ($customFieldID) {
1989 CRM_Core_BAO_CustomField
::addQuickFormElement($form, $name, $customFieldID, FALSE, $required, $search, $title);
1992 elseif (substr($fieldName, 0, 14) === 'address_custom') {
1993 list($fName, $locTypeId) = CRM_Utils_System
::explode('-', $fieldName, 2);
1994 $customFieldID = CRM_Core_BAO_CustomField
::getKeyID(substr($fName, 8));
1995 if ($customFieldID) {
1996 CRM_Core_BAO_CustomField
::addQuickFormElement($form, $name, $customFieldID, FALSE, $required, $search, $title);
1999 elseif (in_array($fieldName, array(
2000 'receive_date', 'receipt_date', 'thankyou_date', 'cancel_date'))) {
2001 $form->addDateTime($name, $title, $required, array('formatType' => 'activityDateTime'));
2003 elseif ($fieldName == 'send_receipt') {
2004 $form->addElement('checkbox', $name, $title);
2006 elseif ($fieldName == 'soft_credit') {
2007 CRM_Contact_Form_NewContact
::buildQuickForm($form, $rowNumber, NULL, FALSE, 'soft_credit_');
2008 $form->addMoney("soft_credit_amount[{$rowNumber}]", ts('Amount'), FALSE, NULL, FALSE);
2010 elseif ($fieldName == 'product_name') {
2011 list($products, $options) = CRM_Contribute_BAO_Premium
::getPremiumProductInfo();
2012 $sel = &$form->addElement('hierselect', $name, $title);
2014 '0' => ts('- select -')) +
$products;
2015 $sel->setOptions(array($products, $options));
2017 elseif ($fieldName == 'payment_instrument') {
2018 $form->add('select', $name, $title,
2019 array(''=>ts( '- select -' )) + CRM_Contribute_PseudoConstant
::paymentInstrument( ), $required );
2021 else if ($fieldName == 'financial_type' ) {
2022 $form->add('select', $name, $title,
2024 '' => ts('- select -')) + CRM_Contribute_PseudoConstant
::financialType(), $required
2027 elseif ($fieldName == 'contribution_status_id') {
2028 $contributionStatuses = CRM_Contribute_PseudoConstant
::contributionStatus();
2029 $statusName = CRM_Contribute_PseudoConstant
::contributionStatus(NULL, 'name');
2035 unset($contributionStatuses[CRM_Utils_Array
::key($suppress, $statusName)]);
2038 $form->add('select', $name, $title,
2040 '' => ts('- select -')) +
$contributionStatuses, $required
2043 elseif ($fieldName == 'currency') {
2044 $form->addCurrency($name, $title, $required);
2046 elseif ($fieldName == 'contribution_page_id') {
2047 $form->add('select', $name, $title,
2049 '' => ts('- select -')) + CRM_Contribute_PseudoConstant
::contributionPage(), $required, 'class="big"'
2052 elseif ($fieldName == 'participant_register_date') {
2053 $form->addDateTime($name, $title, $required, array('formatType' => 'activityDateTime'));
2055 elseif ($fieldName == 'activity_status_id') {
2056 $form->add('select', $name, $title,
2058 '' => ts('- select -')) + CRM_Core_PseudoConstant
::activityStatus(), $required
2061 elseif ($fieldName == 'activity_engagement_level') {
2062 $form->add('select', $name, $title,
2064 '' => ts('- select -')) + CRM_Campaign_PseudoConstant
::engagementLevel(), $required
2067 elseif ($fieldName == 'activity_date_time') {
2068 $form->addDateTime($name, $title, $required, array('formatType' => 'activityDateTime'));
2070 elseif ($fieldName == 'participant_status') {
2072 if ($online == TRUE) {
2073 $cond = 'visibility_id = 1';
2075 $form->add('select', $name, $title,
2077 '' => ts('- select -')) + CRM_Event_PseudoConstant
::participantStatus(NULL, $cond, 'label'), $required
2080 elseif ($fieldName == 'participant_role') {
2081 if (CRM_Utils_Array
::value('is_multiple', $field)) {
2082 $form->addCheckBox($name, $title, CRM_Event_PseudoConstant
::participantRole(), NULL, NULL, NULL, NULL, ' ', TRUE);
2085 $form->add('select', $name, $title,
2087 '' => ts('- select -')) + CRM_Event_PseudoConstant
::participantRole(), $required
2091 elseif ($fieldName == 'world_region') {
2092 $form->add('select', $name, $title,
2094 '' => ts('- select -')) + CRM_Core_PseudoConstant
::worldRegion(), $required
2097 elseif ($fieldName == 'signature_html') {
2098 $form->addWysiwyg($name, $title, CRM_Core_DAO
::getAttribute('CRM_Core_DAO_Email', $fieldName));
2100 elseif ($fieldName == 'signature_text') {
2101 $form->add('textarea', $name, $title, CRM_Core_DAO
::getAttribute('CRM_Core_DAO_Email', $fieldName));
2103 elseif (substr($fieldName, -11) == 'campaign_id') {
2104 if (CRM_Campaign_BAO_Campaign
::isCampaignEnable()) {
2105 $campaigns = CRM_Campaign_BAO_Campaign
::getCampaigns(CRM_Utils_Array
::value($contactId,
2106 $form->_componentCampaigns
2108 $form->add('select', $name, $title,
2110 '' => ts('- select -')) +
$campaigns, $required, 'class="big"'
2114 elseif ($fieldName == 'activity_details') {
2115 $form->addWysiwyg($fieldName, $title, array('rows' => 4, 'cols' => 60), $required);
2117 elseif ($fieldName == 'activity_duration') {
2118 $form->add('text', $name, $title, $attributes, $required);
2119 $form->addRule($name, ts('Please enter the duration as number of minutes (integers only).'), 'positiveInteger');
2122 if (substr($fieldName, 0, 3) === 'is_' or substr($fieldName, 0, 7) === 'do_not_') {
2123 $form->add('advcheckbox', $name, $title, $attributes, $required);
2126 $form->add('text', $name, $title, $attributes, $required);
2130 static $hiddenSubtype = FALSE;
2131 if (!$hiddenSubtype && CRM_Contact_BAO_ContactType
::isaSubType($field['field_type'])) {
2132 // In registration mode params are submitted via POST and we don't have any clue
2133 // about profile-id or the profile-type (which could be a subtype)
2134 // To generalize the behavior and simplify the process,
2135 // lets always add the hidden
2136 //subtype value if there is any, and we won't have to
2137 // compute it while processing.
2139 $form->addElement('hidden', 'onbehalf[contact_sub_type]', $field['field_type']);
2142 $form->addElement('hidden', 'contact_sub_type_hidden', $field['field_type']);
2144 $hiddenSubtype = TRUE;
2147 if (($view && $mode != CRM_Profile_Form
::MODE_SEARCH
) ||
$isShared) {
2148 $form->freeze($name);
2152 if (in_array($fieldName, array(
2153 'non_deductible_amount', 'total_amount', 'fee_amount', 'net_amount'))) {
2154 $form->addRule($name, ts('Please enter a valid amount.'), 'money');
2158 if (!($rule == 'email' && $mode == CRM_Profile_Form
::MODE_SEARCH
)) {
2159 $form->addRule($name, ts('Please enter a valid %1', array(1 => $title)), $rule);
2165 * Function to set profile defaults
2167 * @params int $contactId contact id
2168 * @params array $fields associative array of fields
2169 * @params array $defaults defaults array
2170 * @params boolean $singleProfile true for single profile else false(batch update)
2171 * @params int $componentId id for specific components like contribute, event etc
2177 static function setProfileDefaults($contactId, &$fields, &$defaults,
2178 $singleProfile = TRUE, $componentId = NULL, $component = NULL
2180 if (!$componentId) {
2181 //get the contact details
2182 list($contactDetails, $options) = CRM_Contact_BAO_Contact
::getHierContactDetails($contactId, $fields);
2183 $details = CRM_Utils_Array
::value($contactId, $contactDetails);
2184 $multipleFields = array('website' => 'url');
2186 //start of code to set the default values
2187 foreach ($fields as $name => $field) {
2188 // skip pseudo fields
2189 if (substr($name, 0, 9) == 'phone_ext') {
2193 //set the field name depending upon the profile mode(single/batch)
2194 if ($singleProfile) {
2198 $fldName = "field[$contactId][$name]";
2201 if ($name == 'group') {
2202 CRM_Contact_Form_Edit_TagsAndGroups
::setDefaults($contactId, $defaults, CRM_Contact_Form_Edit_TagsAndGroups
::GROUP
, $fldName);
2204 if ($name == 'tag') {
2205 CRM_Contact_Form_Edit_TagsAndGroups
::setDefaults($contactId, $defaults, CRM_Contact_Form_Edit_TagsAndGroups
::TAG
, $fldName);
2208 if (CRM_Utils_Array
::value($name, $details) ||
isset($details[$name])) {
2209 //to handle custom data (checkbox) to be written
2210 // to handle gender / suffix / prefix / greeting_type
2211 if ($name == 'gender') {
2212 $defaults[$fldName] = $details['gender_id'];
2214 elseif ($name == 'individual_prefix') {
2215 $defaults[$fldName] = $details['individual_prefix_id'];
2217 elseif ($name == 'individual_suffix') {
2218 $defaults[$fldName] = $details['individual_suffix_id'];
2220 elseif (($name == 'birth_date') ||
($name == 'deceased_date')) {
2221 list($defaults[$fldName]) = CRM_Utils_Date
::setDateDefaults($details[$name], 'birth');
2223 elseif (in_array($name, CRM_Contact_BAO_Contact
::$_greetingTypes)) {
2224 $defaults[$fldName] = $details[$name . '_id'];
2225 $defaults[$name . '_custom'] = $details[$name . '_custom'];
2227 elseif ($name == 'preferred_communication_method') {
2228 $v = explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $details[$name]);
2229 foreach ($v as $item) {
2231 $defaults[$fldName . "[$item]"] = 1;
2235 elseif ($name == 'world_region') {
2236 $defaults[$fldName] = $details['worldregion_id'];
2238 elseif ($customFieldId = CRM_Core_BAO_CustomField
::getKeyID($name)) {
2239 //fix for custom fields
2240 $customFields = CRM_Core_BAO_CustomField
::getFields(CRM_Utils_Array
::value('contact_type', $details));
2242 // hack to add custom data for components
2243 $components = array('Contribution', 'Participant', 'Membership', 'Activity');
2244 foreach ($components as $value) {
2245 $customFields = CRM_Utils_Array
::crmArrayMerge($customFields,
2246 CRM_Core_BAO_CustomField
::getFieldsForImport($value)
2250 switch ($customFields[$customFieldId]['html_type']) {
2251 case 'Multi-Select State/Province':
2252 case 'Multi-Select Country':
2253 case 'AdvMulti-Select':
2254 case 'Multi-Select':
2255 $v = explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $details[$name]);
2256 foreach ($v as $item) {
2258 $defaults[$fldName][$item] = $item;
2264 $v = explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $details[$name]);
2265 foreach ($v as $item) {
2267 $defaults[$fldName][$item] = 1;
2268 // seems like we need this for QF style checkboxes in profile where its multiindexed
2270 $defaults["{$fldName}[{$item}]"] = 1;
2275 case 'Autocomplete-Select':
2276 if ($customFields[$customFieldId]['data_type'] == 'ContactReference') {
2277 if (is_numeric($details[$name])) {
2278 $defaults[$fldName . '_id'] = $details[$name];
2279 $defaults[$fldName] = CRM_Core_DAO
::getFieldValue('CRM_Contact_DAO_Contact', $details[$name], 'sort_name');
2283 $label = CRM_Core_BAO_CustomOption
::getOptionLabel($customFieldId, $details[$name]);
2284 $defaults[$fldName . '_id'] = $details[$name];
2285 $defaults[$fldName] = $label;
2290 // CRM-6681, set defult values according to date and time format (if any).
2292 if (CRM_Utils_Array
::value('date_format', $customFields[$customFieldId])) {
2293 $dateFormat = $customFields[$customFieldId]['date_format'];
2296 if (!CRM_Utils_Array
::value('time_format', $customFields[$customFieldId])) {
2297 list($defaults[$fldName]) = CRM_Utils_Date
::setDateDefaults($details[$name], NULL,
2302 $timeElement = $fldName . '_time';
2303 if (substr($fldName, -1) == ']') {
2304 $timeElement = substr($fldName, 0, -1) . '_time]';
2306 list($defaults[$fldName], $defaults[$timeElement]) = CRM_Utils_Date
::setDateDefaults($details[$name],
2307 NULL, $dateFormat, $customFields[$customFieldId]['time_format']);
2312 $defaults[$fldName] = $details[$name];
2317 $defaults[$fldName] = $details[$name];
2321 $blocks = array('email', 'phone', 'im', 'openid');
2322 list($fieldName, $locTypeId, $phoneTypeId) = CRM_Utils_System
::explode('-', $name, 3);
2323 if (!in_array($fieldName, $multipleFields)) {
2324 if (is_array($details)) {
2325 foreach ($details as $key => $value) {
2326 // when we fixed CRM-5319 - get primary loc
2327 // type as per loc field and removed below code.
2328 $primaryLocationType = FALSE;
2329 if ($locTypeId == 'Primary') {
2330 if (is_array($value) && array_key_exists($fieldName, $value)){
2331 $primaryLocationType = TRUE;
2332 if (in_array($fieldName, $blocks)){
2333 $locTypeId = CRM_Contact_BAO_Contact
::getPrimaryLocationType($contactId, FALSE, $fieldName);
2336 $locTypeId = CRM_Contact_BAO_Contact
::getPrimaryLocationType($contactId, FALSE, 'address');
2341 // fixed for CRM-665
2342 if (is_numeric($locTypeId)) {
2343 if ($primaryLocationType ||
$locTypeId == CRM_Utils_Array
::value('location_type_id', $value)) {
2344 if (CRM_Utils_Array
::value($fieldName, $value)) {
2345 //to handle stateprovince and country
2346 if ($fieldName == 'state_province') {
2347 $defaults[$fldName] = $value['state_province_id'];
2349 elseif ($fieldName == 'county') {
2350 $defaults[$fldName] = $value['county_id'];
2352 elseif ($fieldName == 'country') {
2353 $defaults[$fldName] = $value['country_id'];
2354 if (!isset($value['country_id']) ||
!$value['country_id']) {
2355 $config = CRM_Core_Config
::singleton();
2356 if ($config->defaultContactCountry
) {
2357 $defaults[$fldName] = $config->defaultContactCountry
;
2361 elseif ($fieldName == 'phone') {
2363 if (isset($value['phone'][$phoneTypeId])) {
2364 $defaults[$fldName] = $value['phone'][$phoneTypeId];
2366 if (isset($value['phone_ext'][$phoneTypeId])) {
2367 $defaults[str_replace('phone', 'phone_ext', $fldName)] = $value['phone_ext'][$phoneTypeId];
2371 $phoneDefault = CRM_Utils_Array
::value('phone', $value);
2373 if (!is_array($phoneDefault)) {
2374 $defaults[$fldName] = $phoneDefault;
2378 elseif ($fieldName == 'email') {
2379 //adding the first email (currently we don't support multiple emails of same location type)
2380 $defaults[$fldName] = $value['email'];
2382 elseif ($fieldName == 'im') {
2383 //adding the first im (currently we don't support multiple ims of same location type)
2384 $defaults[$fldName] = $value['im'];
2385 $defaults[$fldName . '-provider_id'] = $value['im_provider_id'];
2388 $defaults[$fldName] = $value[$fieldName];
2391 elseif (substr($fieldName, 0, 14) === 'address_custom' &&
2392 CRM_Utils_Array
::value(substr($fieldName, 8), $value)
2394 $defaults[$fldName] = $value[substr($fieldName, 8)];
2402 if (is_array($details)) {
2403 if ($fieldName === 'url') {
2404 if (!empty($details['website'])) {
2405 foreach ($details['website'] as $val) {
2406 $defaults[$fldName] = CRM_Utils_Array
::value('url', $val);
2407 $defaults[$fldName . '-website_type_id'] = $val['website_type_id'];
2417 //Handling Contribution Part of the batch profile
2418 if (CRM_Core_Permission
::access('CiviContribute') && $component == 'Contribute') {
2419 self
::setComponentDefaults($fields, $componentId, $component, $defaults);
2422 //Handling Event Participation Part of the batch profile
2423 if (CRM_Core_Permission
::access('CiviEvent') && $component == 'Event') {
2424 self
::setComponentDefaults($fields, $componentId, $component, $defaults);
2427 //Handling membership Part of the batch profile
2428 if (CRM_Core_Permission
::access('CiviMember') && $component == 'Membership') {
2429 self
::setComponentDefaults($fields, $componentId, $component, $defaults);
2432 //Handling Activity Part of the batch profile
2433 if ($component == 'Activity') {
2434 self
::setComponentDefaults($fields, $componentId, $component, $defaults);
2439 * Function to get profiles by type eg: pure Individual etc
2441 * @param array $types associative array of types eg: types('Individual')
2442 * @param boolean $onlyPure true if only pure profiles are required
2444 * @return array $profiles associative array of profiles
2448 static function getProfiles($types, $onlyPure = FALSE) {
2449 $profiles = array();
2450 $ufGroups = CRM_Core_PseudoConstant
::get('CRM_Core_DAO_UFField', 'uf_group_id');
2452 CRM_Utils_Hook
::aclGroup(CRM_Core_Permission
::ADMIN
, NULL, 'civicrm_uf_group', $ufGroups, $ufGroups);
2454 // Exclude Batch Data Entry profiles - CRM-10901
2455 $batchProfiles = CRM_Core_BAO_UFGroup
::getBatchProfiles();
2457 foreach ($ufGroups as $id => $title) {
2458 $ptype = CRM_Core_BAO_UFField
::getProfileType($id, FALSE, $onlyPure);
2459 if (in_array($ptype, $types) && !array_key_exists($id, $batchProfiles)) {
2460 $profiles[$id] = $title;
2467 * Function to check whether a profile is valid combination of
2468 * required and/or optional profile types
2470 * @param array $required array of types those are required
2471 * @param array $optional array of types those are optional
2473 * @return array $profiles associative array of profiles
2477 static function getValidProfiles($required, $optional = NULL) {
2478 if (!is_array($required) ||
empty($required)) {
2482 $profiles = array();
2483 $ufGroups = CRM_Core_PseudoConstant
::get('CRM_Core_DAO_UFField', 'uf_group_id');
2485 CRM_Utils_Hook
::aclGroup(CRM_Core_Permission
::ADMIN
, NULL, 'civicrm_uf_group', $ufGroups, $ufGroups);
2487 foreach ($ufGroups as $id => $title) {
2488 $type = CRM_Core_BAO_UFField
::checkValidProfileType($id, $required, $optional);
2490 $profiles[$id] = $title;
2498 * Function to check whether a profile is valid combination of
2499 * required profile fields
2501 * @param array $ufId integer id of the profile
2502 * @param array $required array of fields those are required in the profile
2504 * @return array $profiles associative array of profiles
2508 static function checkValidProfile($ufId, $required = NULL) {
2509 $validProfile = FALSE;
2511 return $validProfile;
2514 if (!CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_UFGroup', $ufId, 'is_active')) {
2515 return $validProfile;
2518 $profileFields = self
::getFields($ufId, FALSE, CRM_Core_Action
::VIEW
, NULL,
2519 NULL, FALSE, NULL, FALSE, NULL,
2520 CRM_Core_Permission
::CREATE
, NULL
2523 $validProfile = array();
2524 if (!empty($profileFields)) {
2525 $fields = array_keys($profileFields);
2526 foreach ($fields as $val) {
2527 foreach ($required as $key => $field) {
2528 if (strpos($val, $field) === 0) {
2529 unset($required[$key]);
2534 $validProfile = (empty($required)) ?
TRUE : FALSE;
2537 return $validProfile;
2541 * Function to get default value for Register.
2547 static function setRegisterDefaults(&$fields, &$defaults) {
2548 $config = CRM_Core_Config
::singleton();
2549 foreach ($fields as $name => $field) {
2550 if (substr($name, 0, 8) == 'country-') {
2551 if (!empty($config->defaultContactCountry
)) {
2552 $defaults[$name] = $config->defaultContactCountry
;
2555 elseif (substr($name, 0, 15) == 'state_province-') {
2556 if (!empty($config->defaultContactStateProvince
)) {
2557 $defaults[$name] = $config->defaultContactStateProvince
;
2565 * This function is to make a copy of a profile, including
2566 * all the fields in the profile
2568 * @param int $id the profile id to copy
2573 static function copy($id) {
2574 $fieldsFix = array('prefix' => array('title' => ts('Copy of ')));
2575 $copy = &CRM_Core_DAO
::copyGeneric('CRM_Core_DAO_UFGroup',
2581 if ($pos = strrpos($copy->name
, "_{$id}")) {
2582 $copy->name
= substr_replace($copy->name
, '', $pos);
2584 $copy->name
= CRM_Utils_String
::munge($copy->name
, '_', 56) . "_{$copy->id}";
2587 $copyUFJoin = &CRM_Core_DAO
::copyGeneric('CRM_Core_DAO_UFJoin',
2588 array('uf_group_id' => $id),
2589 array('uf_group_id' => $copy->id
),
2594 $copyUFField = &CRM_Core_DAO
::copyGeneric('CRM_Core_BAO_UFField',
2595 array('uf_group_id' => $id),
2596 array('uf_group_id' => $copy->id
)
2599 $maxWeight = CRM_Utils_Weight
::getMax('CRM_Core_DAO_UFJoin', NULL, 'weight');
2603 UPDATE civicrm_uf_join
2605 WHERE uf_group_id = %2
2606 AND ( entity_id IS NULL OR entity_id <= 0 )
2608 $p = array(1 => array($maxWeight +
1, 'Integer'),
2609 2 => array($copy->id
, 'Integer'),
2611 CRM_Core_DAO
::executeQuery($query, $p);
2612 if ($copy->is_reserved
) {
2613 $query = "UPDATE civicrm_uf_group SET is_reserved = 0 WHERE id = %1";
2614 $params = array(1 => array($copy->id
, 'Integer'));
2615 CRM_Core_DAO
::executeQuery($query, $params);
2617 CRM_Utils_Hook
::copy('UFGroup', $copy);
2623 * Process that send notification e-mails
2625 * @params int $contactId contact id
2626 * @params array $values associative array of name/value pair
2632 static function commonSendMail($contactID, &$values) {
2633 if (!$contactID ||
!$values) {
2637 $template = CRM_Core_Smarty
::singleton();
2639 $displayName = CRM_Core_DAO
::getFieldValue('CRM_Contact_DAO_Contact',
2644 self
::profileDisplay($values['id'], $values['values'], $template);
2645 $emailList = explode(',', $values['email']);
2647 $contactLink = CRM_Utils_System
::url('civicrm/contact/view',
2648 "reset=1&cid=$contactID",
2649 TRUE, NULL, FALSE, FALSE, TRUE
2652 //get the default domain email address.
2653 list($domainEmailName, $domainEmailAddress) = CRM_Core_BAO_Domain
::getNameAndEmail();
2655 if (!$domainEmailAddress ||
$domainEmailAddress == 'info@EXAMPLE.ORG') {
2656 $fixUrl = CRM_Utils_System
::url('civicrm/admin/domain', 'action=update&reset=1');
2657 CRM_Core_Error
::fatal(ts('The site administrator needs to enter a valid \'FROM Email Address\' in <a href="%1">Administer CiviCRM » Communications » FROM Email Addresses</a>. The email address used may need to be a valid mail account with your email service provider.', array(1 => $fixUrl)));
2660 foreach ($emailList as $emailTo) {
2661 // FIXME: take the below out of the foreach loop
2662 CRM_Core_BAO_MessageTemplates
::sendTemplate(
2664 'groupName' => 'msg_tpl_workflow_uf',
2665 'valueName' => 'uf_notify',
2666 'contactId' => $contactID,
2667 'tplParams' => array(
2668 'displayName' => $displayName,
2669 'currentDate' => date('r'),
2670 'contactLink' => $contactLink,
2672 'from' => "$domainEmailName <$domainEmailAddress>",
2673 'toEmail' => $emailTo,
2680 * Given a contact id and a group id, returns the field values from the db
2681 * for this group and notify email only if group's notify field is
2682 * set and field values are not empty
2684 * @params $gid group id
2685 * @params $cid contact id
2686 * @params $params associative array
2691 function checkFieldsEmptyValues($gid, $cid, $params, $skipCheck = FALSE) {
2693 if (CRM_Core_BAO_UFGroup
::filterUFGroups($gid, $cid) ||
$skipCheck) {
2695 $fields = CRM_Core_BAO_UFGroup
::getFields($gid, FALSE, CRM_Core_Action
::VIEW
);
2696 CRM_Core_BAO_UFGroup
::getValues($cid, $fields, $values, FALSE, $params, TRUE);
2698 $email = CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_UFGroup', $gid, 'notify');
2700 if (!empty($values) &&
2705 'values' => $values,
2716 * Function to assign uf fields to template
2718 * @params int $gid group id
2719 * @params array $values associative array of fields
2724 function profileDisplay($gid, $values, $template) {
2725 $groupTitle = CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_UFGroup', $gid, 'title');
2726 $template->assign('grouptitle', $groupTitle);
2727 if (count($values)) {
2728 $template->assign('values', $values);
2733 * Format fields for dupe Contact Matching
2735 * @param array $params associated array
2737 * @return array $data assoicated formatted array
2741 static function formatFields($params, $contactId = NULL) {
2743 // get the primary location type id and email
2744 list($name, $primaryEmail, $primaryLocationType) = CRM_Contact_BAO_Contact_Location
::getEmailDetails($contactId);
2747 $defaultLocationType = CRM_Core_BAO_LocationType
::getDefault();
2748 $primaryLocationType = $defaultLocationType->id
;
2752 $locationType = array();
2754 $primaryLocation = 0;
2755 foreach ($params as $key => $value) {
2756 list($fieldName, $locTypeId, $phoneTypeId) = explode('-', $key);
2758 if ($locTypeId == 'Primary') {
2759 $locTypeId = $primaryLocationType;
2762 if (is_numeric($locTypeId)) {
2763 if (!in_array($locTypeId, $locationType)) {
2764 $locationType[$count] = $locTypeId;
2767 $loc = CRM_Utils_Array
::key($locTypeId, $locationType);
2769 $data['location'][$loc]['location_type_id'] = $locTypeId;
2771 // if we are getting in a new primary email, dont overwrite the new one
2772 if ($locTypeId == $primaryLocationType) {
2773 if (CRM_Utils_Array
::value('email-' . $primaryLocationType, $params)) {
2774 $data['location'][$loc]['email'][$loc]['email'] = $fields['email-' . $primaryLocationType];
2776 elseif (isset($primaryEmail)) {
2777 $data['location'][$loc]['email'][$loc]['email'] = $primaryEmail;
2783 $data['location'][$loc]['is_primary'] = 1;
2785 if ($fieldName == 'phone') {
2787 $data['location'][$loc]['phone'][$loc]['phone_type_id'] = $phoneTypeId;
2790 $data['location'][$loc]['phone'][$loc]['phone_type_id'] = '';
2792 $data['location'][$loc]['phone'][$loc]['phone'] = $value;
2794 elseif ($fieldName == 'email') {
2795 $data['location'][$loc]['email'][$loc]['email'] = $value;
2797 elseif ($fieldName == 'im') {
2798 $data['location'][$loc]['im'][$loc]['name'] = $value;
2801 if ($fieldName === 'state_province') {
2802 $data['location'][$loc]['address']['state_province_id'] = $value;
2804 elseif ($fieldName === 'country') {
2805 $data['location'][$loc]['address']['country_id'] = $value;
2808 $data['location'][$loc]['address'][$fieldName] = $value;
2813 if ($key === 'individual_suffix') {
2814 $data['suffix_id'] = $value;
2816 elseif ($key === 'individual_prefix') {
2817 $data['prefix_id'] = $value;
2819 elseif ($key === 'gender') {
2820 $data['gender_id'] = $value;
2822 elseif (substr($key, 0, 6) === 'custom') {
2823 if ($customFieldID = CRM_Core_BAO_CustomField
::getKeyID($key)) {
2825 if ($customFields[$customFieldID]['html_type'] == 'CheckBox') {
2826 $value = implode(CRM_Core_DAO
::VALUE_SEPARATOR
, array_keys($value));
2828 // fix the date field
2829 if ($customFields[$customFieldID]['data_type'] == 'Date') {
2830 $date = CRM_Utils_Date
::format($value);
2837 $data['custom'][$customFieldID] = array(
2840 'extends' => $customFields[$customFieldID]['extends'],
2841 'type' => $customFields[$customFieldID]['data_type'],
2842 'custom_field_id' => $customFieldID,
2846 elseif ($key == 'edit') {
2850 $data[$key] = $value;
2855 if (!$primaryLocation) {
2857 $data['location'][$loc]['email'][$loc]['email'] = $primaryEmail;
2865 * calculate the profile type 'group_type' as per profile fields.
2867 * @param int $gid profile id
2868 * @param int $ignoreFieldId ignore particular profile field
2870 * @return array list of calculated group type
2872 static function calculateGroupType($gId, $includeTypeValues = FALSE, $ignoreFieldId = NULL) {
2873 //get the profile fields.
2874 $ufFields = self
::getFields($gId, FALSE, NULL, NULL, NULL, TRUE, NULL, TRUE);
2875 return self
::_calculateGroupType($ufFields, $includeTypeValues, $ignoreFieldId);
2879 * calculate the profile type 'group_type' as per profile fields.
2881 * @param int $gid profile id
2882 * @param int $ignoreFieldId ignore perticular profile field
2884 * @return array list of calculated group type
2886 static function _calculateGroupType($ufFields, $includeTypeValues = FALSE, $ignoreFieldId = NULL) {
2887 $groupType = $groupTypeValues = $customFieldIds = array();
2888 if (!empty($ufFields)) {
2889 foreach ($ufFields as $fieldName => $fieldValue) {
2890 //ignore field from group type when provided.
2891 //in case of update profile field.
2892 if ($ignoreFieldId && ($ignoreFieldId == $fieldValue['field_id'])) {
2895 if (!in_array($fieldValue['field_type'], $groupType)) {
2896 $groupType[$fieldValue['field_type']] = $fieldValue['field_type'];
2899 if ($includeTypeValues && ($fldId = CRM_Core_BAO_CustomField
::getKeyID($fieldName))) {
2900 $customFieldIds[$fldId] = $fldId;
2905 if (!empty($customFieldIds)) {
2906 $query = 'SELECT DISTINCT(cg.id), cg.extends, cg.extends_entity_column_id, cg.extends_entity_column_value FROM civicrm_custom_group cg LEFT JOIN civicrm_custom_field cf ON cf.custom_group_id = cg.id WHERE cg.extends_entity_column_value IS NOT NULL AND cf.id IN (' . implode(',', $customFieldIds) . ')';
2908 $customGroups = CRM_Core_DAO
::executeQuery($query);
2909 while ($customGroups->fetch()) {
2910 if (!$customGroups->extends_entity_column_value
) {
2914 $groupTypeName = "{$customGroups->extends}Type";
2915 if ($customGroups->extends == 'Participant' && $customGroups->extends_entity_column_id
) {
2916 $groupTypeName = CRM_Core_OptionGroup
::getValue('custom_data_type', $customGroups->extends_entity_column_id
, 'value', 'String', 'name');
2919 foreach (explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $customGroups->extends_entity_column_value
) as $val) {
2921 $groupTypeValues[$groupTypeName][$val] = $val;
2926 if (!empty($groupTypeValues)) {
2927 $groupType = array_merge($groupType, $groupTypeValues);
2935 * Update the profile type 'group_type' as per profile fields including group types and group subtype values.
2936 * Build and store string like: group_type1,group_type2[VALUE_SEPERATOR]group_type1Type:1:2:3,group_type2Type:1:2
2939 * BirthDate + Email Individual,Contact
2940 * BirthDate + Subject Individual,Activity
2941 * BirthDate + Subject + SurveyOnlyField Individual,Activity\0ActivityType:28
2942 * BirthDate + Subject + SurveyOnlyField + PhoneOnlyField (Not allowed)
2943 * BirthDate + SurveyOnlyField Individual,Activity\0ActivityType:28
2944 * BirthDate + Subject + SurveyOrPhoneField Individual,Activity\0ActivityType:2:28
2945 * BirthDate + SurveyOrPhoneField Individual,Activity\0ActivityType:2:28
2946 * BirthDate + SurveyOrPhoneField + SurveyOnlyField Individual,Activity\0ActivityType:2:28
2947 * BirthDate + StudentField + Subject + SurveyOnlyField Individual,Activity,Student\0ActivityType:28
2949 * @param Integer $gid profile id
2950 * @param Array $groupTypes With key having group type names
2954 static function updateGroupTypes($gId, $groupTypes = array(
2956 if (!is_array($groupTypes) ||
!$gId) {
2960 // If empty group types set group_type as 'null'
2961 if (empty($groupTypes)) {
2962 return CRM_Core_DAO
::setFieldValue('CRM_Core_DAO_UFGroup', $gId, 'group_type', 'null');
2965 $componentGroupTypes = array('Contribution', 'Participant', 'Membership', 'Activity');
2966 $validGroupTypes = array_merge(array('Contact', 'Individual', 'Organization', 'Household'), $componentGroupTypes, CRM_Contact_BAO_ContactType
::subTypes());
2968 $gTypes = $gTypeValues = array();
2970 $participantExtends = array('ParticipantRole', 'ParticipantEventName', 'ParticipantEventType');
2971 // Get valid group type and group subtypes
2972 foreach ($groupTypes as $groupType => $value) {
2973 if (in_array($groupType, $validGroupTypes) && !in_array($groupType, $gTypes)) {
2974 $gTypes[] = $groupType;
2979 if (in_array($groupType, $participantExtends)) {
2980 $subTypesOf = $groupType;
2982 elseif (strpos($groupType, 'Type') > 0) {
2983 $subTypesOf = substr($groupType, 0, strpos($groupType, 'Type'));
2989 if (!empty($value) &&
2990 (in_array($subTypesOf, $componentGroupTypes) ||
2991 in_array($subTypesOf, $participantExtends)
2994 $gTypeValues[$subTypesOf] = $groupType . ":" . implode(':', $value);
2998 if (empty($gTypes)) {
3002 // Build String to store group types and group subtypes
3003 $groupTypeString = implode(',', $gTypes);
3004 if (!empty($gTypeValues)) {
3005 $groupTypeString .= CRM_Core_DAO
::VALUE_SEPARATOR
. implode(',', $gTypeValues);
3008 return CRM_Core_DAO
::setFieldValue('CRM_Core_DAO_UFGroup', $gId, 'group_type', $groupTypeString);
3012 * Create a "group_type" string
3014 * @param array $coreTypes e.g. array('Individual','Contact','Student')
3015 * @param array $subTypes e.g. array('ActivityType' => array(7, 11))
3016 * @param string $delim
3017 * @throws CRM_Core_Exception
3019 static function encodeGroupType($coreTypes, $subTypes, $delim = CRM_Core_DAO
::VALUE_SEPARATOR
) {
3020 $groupTypeExpr = '';
3022 $groupTypeExpr .= implode(',', $coreTypes);
3025 if (count($subTypes) > 1) {
3026 throw new CRM_Core_Exception("Multiple subtype filtering is not currently supported by widget.");
3028 foreach ($subTypes as $subType => $subTypeIds) {
3029 $groupTypeExpr .= $delim . $subType . ':' . implode(':', $subTypeIds);
3032 return $groupTypeExpr;
3036 * This function is used to setDefault componet specific profile fields.
3038 * @param array $fields profile fields.
3039 * @param int $componentId componetID
3040 * @param string $component component name
3041 * @param array $defaults an array of default values.
3045 function setComponentDefaults(&$fields, $componentId, $component, &$defaults, $isStandalone = FALSE) {
3046 if (!$componentId ||
3047 !in_array($component, array('Contribute', 'Membership', 'Event', 'Activity'))
3052 $componentBAO = $componentSubType = NULL;
3053 switch ($component) {
3055 $componentBAO = 'CRM_Member_BAO_Membership';
3056 $componentBAOName = 'Membership';
3057 $componentSubType = array('membership_type_id');
3061 $componentBAO = 'CRM_Contribute_BAO_Contribution';
3062 $componentBAOName = 'Contribution';
3063 $componentSubType = array( 'financial_type_id' );
3067 $componentBAO = 'CRM_Event_BAO_Participant';
3068 $componentBAOName = 'Participant';
3069 $componentSubType = array('role_id', 'event_id');
3073 $componentBAO = 'CRM_Activity_BAO_Activity';
3074 $componentBAOName = 'Activity';
3075 $componentSubType = array('activity_type_id');
3080 $params = array('id' => $componentId);
3082 //get the component values.
3083 CRM_Core_DAO
::commonRetrieve($componentBAO, $params, $values);
3085 $formattedGroupTree = array();
3086 $dateTimeFields = array('participant_register_date', 'activity_date_time', 'receive_date', 'receipt_date', 'cancel_date', 'thankyou_date', 'membership_start_date', 'membership_end_date', 'join_date');
3087 foreach ($fields as $name => $field) {
3088 $fldName = $isStandalone ?
$name : "field[$componentId][$name]";
3089 if (in_array($name, $dateTimeFields)) {
3090 $timefldName = $isStandalone ?
"{$name}_time" : "field[$componentId][{$name}_time]";
3091 if (CRM_Utils_Array
::value($name, $values)) {
3092 list($defaults[$fldName], $defaults[$timefldName]) = CRM_Utils_Date
::setDateDefaults($values[$name]);
3095 elseif (array_key_exists($name, $values)) {
3096 $defaults[$fldName] = $values[$name];
3098 elseif ($name == 'participant_note') {
3099 $noteDetails = CRM_Core_BAO_Note
::getNote($componentId, 'civicrm_participant');
3100 $defaults[$fldName] = array_pop($noteDetails);
3102 elseif (in_array($name, array(
3103 'financial_type', 'payment_instrument', 'participant_status', 'participant_role'))) {
3104 $defaults[$fldName] = $values["{$name}_id"];
3106 elseif ($name == 'membership_type') {
3107 // since membership_type field is a hierselect -
3108 $defaults[$fldName][0] =
3109 CRM_Core_DAO
::getFieldValue('CRM_Member_DAO_MembershipType',$values['membership_type_id'],'member_of_contact_id','id');
3110 $defaults[$fldName][1] = $values['membership_type_id'];
3112 elseif ($name == 'membership_status') {
3113 $defaults[$fldName] = $values['status_id'];
3115 elseif ($customFieldInfo = CRM_Core_BAO_CustomField
::getKeyID($name, TRUE)) {
3116 if (empty($formattedGroupTree)) {
3117 //get the groupTree as per subTypes.
3118 $groupTree = array();
3119 foreach ($componentSubType as $subType) {
3120 $subTree = CRM_Core_BAO_CustomGroup
::getTree($componentBAOName, CRM_Core_DAO
::$_nullObject,
3121 $componentId, 0, $values[$subType]
3123 $groupTree = CRM_Utils_Array
::crmArrayMerge($groupTree, $subTree);
3125 $formattedGroupTree = CRM_Core_BAO_CustomGroup
::formatGroupTree($groupTree, 1, CRM_Core_DAO
::$_nullObject);
3126 CRM_Core_BAO_CustomGroup
::setDefaults($formattedGroupTree, $defaults);
3129 //FIX ME: We need to loop defaults, but once we move to custom_1_x convention this code can be simplified.
3130 foreach ($defaults as $customKey => $customValue) {
3131 if ($customFieldDetails = CRM_Core_BAO_CustomField
::getKeyID($customKey, TRUE)) {
3132 if ($name == 'custom_' . $customFieldDetails[0]) {
3134 //hack to set default for checkbox
3135 //basically this is for weired field name like field[33][custom_19]
3136 //we are converting this field name to array structure and assign value.
3139 foreach ($formattedGroupTree as $tree) {
3140 if ('CheckBox' == CRM_Utils_Array
::value('html_type', $tree['fields'][$customFieldDetails[0]])) {
3142 $defaults['field'][$componentId][$name] = $customValue;
3145 elseif (CRM_Utils_Array
::value('data_type', $tree['fields'][$customFieldDetails[0]]) == 'Date') {
3148 // CRM-6681, $default contains formatted date, time values.
3149 $defaults[$fldName] = $customValue;
3150 if (CRM_Utils_Array
::value($customKey . '_time', $defaults)) {
3151 $defaults['field'][$componentId][$name . '_time'] = $defaults[$customKey . '_time'];
3156 if (!$skipValue ||
$isStandalone) {
3157 $defaults[$fldName] = $customValue;
3159 unset($defaults[$customKey]);
3169 * Function to retrieve reserved profiles
3171 * @param string $name name if the reserve profile
3172 * @param array $extraProfiles associated array of profile id's that needs to merge
3174 * @return array $reservedProfiles returns associated array
3177 static function getReservedProfiles($type = 'Contact', $extraProfiles = NULL) {
3178 $reservedProfiles = array();
3179 $profileNames = array();
3180 if ($type == 'Contact') {
3181 $whereClause = 'name IN ( "new_individual", "new_organization", "new_household" )';
3182 if (CRM_Contact_BAO_ContactType
::isActive('Individual')) {
3183 $profileNames[] = '"new_individual"';
3185 if (CRM_Contact_BAO_ContactType
::isActive('Household')) {
3186 $profileNames[] = '"new_household"';
3188 if (CRM_Contact_BAO_ContactType
::isActive('Organization')) {
3189 $profileNames[] = '"new_organization"';
3192 if (!empty($profileNames)) {
3193 $whereClause = 'name IN ( ' . implode(',', $profileNames) . ' ) AND is_reserved = 1';
3196 $whereClause = 'is_reserved = 1';
3199 $query = "SELECT id, title FROM civicrm_uf_group WHERE {$whereClause}";
3201 $dao = CRM_Core_DAO
::executeQuery($query);
3202 while ($dao->fetch()) {
3204 if ($extraProfiles) {
3205 $key .= ',' . implode(',', $extraProfiles);
3207 $reservedProfiles[$key] = $dao->title
;
3209 return $reservedProfiles;
3213 * Function to retrieve groups of profiles
3215 * @param integer $profileID id of the profile
3217 * @return array returns array
3220 static function profileGroups($profileID) {
3221 $groupTypes = array();
3222 $profileTypes = CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_UFGroup', $profileID, 'group_type');
3223 if ($profileTypes) {
3224 $groupTypeParts = explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $profileTypes);
3225 $groupTypes = explode(',', $groupTypeParts[0]);
3231 * Function to alter contact params by filtering existing subscribed groups and returns
3232 * unsubscribed groups array for subscription.
3234 * @param array $params contact params
3235 * @param int $contactId user contact id
3237 * @return array $subscribeGroupIds This contains array of groups for subscription
3239 static function getDoubleOptInGroupIds(&$params, $contactId = NULL) {
3240 $config = CRM_Core_Config
::singleton();
3241 $subscribeGroupIds = array();
3243 // process further only if profileDoubleOptIn enabled and if groups exist
3244 if (!array_key_exists('group', $params) ||
3245 !self
::isProfileDoubleOptin() ||
3246 CRM_Utils_System
::isNull($params['group'])
3248 return $subscribeGroupIds;
3251 //check if contact email exist.
3253 foreach ($params as $name => $value) {
3254 if (strpos($name, 'email-') !== FALSE) {
3260 //Proceed furthur only if email present
3262 return $subscribeGroupIds;
3265 //do check for already subscriptions.
3266 $contactGroups = array();
3270 FROM civicrm_group_contact
3271 WHERE status = 'Added'
3272 AND contact_id = %1";
3274 $dao = CRM_Core_DAO
::executeQuery($query, array(1 => array($contactId, 'Integer')));
3275 while ($dao->fetch()) {
3276 $contactGroups[$dao->group_id
] = $dao->group_id
;
3280 //since we don't have names, compare w/ label.
3281 $mailingListGroupType = array_search('Mailing List', CRM_Core_OptionGroup
::values('group_type'));
3283 //actual processing start.
3284 foreach ($params['group'] as $groupId => $isSelected) {
3285 //unset group those are not selected.
3287 unset($params['group'][$groupId]);
3291 $groupTypes = explode(CRM_Core_DAO
::VALUE_SEPARATOR
,
3292 CRM_Core_DAO
::getFieldValue('CRM_Contact_DAO_Group', $groupId, 'group_type', 'id')
3294 //get only mailing type group and unset it from params
3295 if (in_array($mailingListGroupType, $groupTypes) && !in_array($groupId, $contactGroups)) {
3296 $subscribeGroupIds[$groupId] = $groupId;
3297 unset($params['group'][$groupId]);
3301 return $subscribeGroupIds;
3305 * Function to check if we are rendering mixed profiles
3307 * @param array $profileIds associated array of profile ids
3309 * @return boolean $mixProfile true if profile is mixed
3313 static function checkForMixProfiles($profileIds) {
3314 $mixProfile = FALSE;
3316 $contactTypes = array('Individual', 'Household', 'Organization');
3317 $subTypes = CRM_Contact_BAO_ContactType
::subTypes();
3319 $components = array('Contribution', 'Participant', 'Membership', 'Activity');
3321 $typeCount = array('ctype' => array(), 'subtype' => array());
3322 foreach ($profileIds as $gid) {
3323 $profileType = CRM_Core_BAO_UFField
::getProfileType($gid);
3324 // ignore profile of type Contact
3325 if ($profileType == 'Contact') {
3328 if (in_array($profileType, $contactTypes)) {
3329 if (!isset($typeCount['ctype'][$profileType])) {
3330 $typeCount['ctype'][$profileType] = 1;
3333 // check if we are rendering profile of different contact types
3334 if (count($typeCount['ctype']) == 2) {
3339 elseif (in_array($profileType, $components)) {
3344 if (!isset($typeCount['subtype'][$profileType])) {
3345 $typeCount['subtype'][$profileType] = 1;
3347 // check if we are rendering profile of different contact sub types
3348 if (count($typeCount['subtype']) == 2) {
3358 * Funtion to determine of we show overlay profile or not
3360 * @return boolean true if profile should be shown else false
3364 static function showOverlayProfile() {
3365 $showOverlay = TRUE;
3367 // get the id of overlay profile
3368 $overlayProfileId = CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_UFGroup', 'summary_overlay', 'id', 'name');
3369 $query = "SELECT count(id) FROM civicrm_uf_field WHERE uf_group_id = {$overlayProfileId} AND visibility IN ('Public Pages', 'Public Pages and Listings') ";
3371 $count = CRM_Core_DAO
::singleValueQuery($query);
3373 //check if there are no public fields and use is anonymous
3374 $session = CRM_Core_Session
::singleton();
3375 if (!$count && !$session->get('userID')) {
3376 $showOverlay = FALSE;
3379 return $showOverlay;
3383 * function to get group type values of the profile
3385 * @params Integer $profileId Profile Id
3386 * @params String $groupType Group Type
3388 * @return Array group type values
3392 static function groupTypeValues($profileId, $groupType = NULL) {
3393 $groupTypeValue = array();
3394 $groupTypes = CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_UFGroup', $profileId, 'group_type');
3396 $groupTypeParts = explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $groupTypes);
3397 if (!CRM_Utils_Array
::value(1, $groupTypeParts)) {
3398 return $groupTypeValue;
3400 $participantExtends = array('ParticipantRole', 'ParticipantEventName', 'ParticipantEventType');
3402 foreach (explode(',', $groupTypeParts[1]) as $groupTypeValues) {
3404 $valueParts = explode(':', $groupTypeValues);
3406 ($valueParts[0] != "{$groupType}Type" ||
3407 ($groupType == 'Participant' &&
3408 !in_array($valueParts[0], $participantExtends)
3414 foreach ($valueParts as $val) {
3415 if (CRM_Utils_Rule
::integer($val)) {
3416 $values[$val] = $val;
3419 if (!empty($values)) {
3420 $typeName = substr($valueParts[0], 0, -4);
3421 if (in_array($valueParts[0], $participantExtends)) {
3422 $typeName = $valueParts[0];
3424 $groupTypeValue[$typeName] = $values;
3428 return $groupTypeValue;
3431 static function isProfileDoubleOptin() {
3432 // check for double optin
3433 $config = CRM_Core_Config
::singleton();
3434 if (in_array('CiviMail', $config->enableComponents
)) {
3435 return CRM_Core_BAO_Setting
::getItem(CRM_Core_BAO_Setting
::MAILING_PREFERENCES_NAME
,
3436 'profile_double_optin', NULL, FALSE
3442 static function isProfileAddToGroupDoubleOptin() {
3443 // check for add to group double optin
3444 $config = CRM_Core_Config
::singleton();
3445 if (in_array('CiviMail', $config->enableComponents
)) {
3446 return CRM_Core_BAO_Setting
::getItem(CRM_Core_BAO_Setting
::MAILING_PREFERENCES_NAME
,
3447 'profile_add_to_group_double_optin', NULL, FALSE
3454 * get profiles used for batch entry
3456 * @return array profileIds profile ids
3459 static function getBatchProfiles() {
3461 FROM civicrm_uf_group
3462 WHERE name IN ('contribution_batch_entry', 'membership_batch_entry')";
3463 $dao = CRM_Core_DAO
::executeQuery( $query );
3464 $profileIds = array();
3465 while( $dao->fetch() ) {
3466 $profileIds[$dao->id
] = $dao->id
;
3471 static function shiftMultiRecordFields(&$source, &$destination, $returnMultiSummaryFields = FALSE) {
3472 $multiSummaryFields = $returnMultiSummaryFields ?
array( ) : NULL;
3473 foreach ($source as $field => $properties) {
3474 if (!CRM_Core_BAO_CustomField
::getKeyID($field)) {
3477 if (CRM_Core_BAO_CustomField
::isMultiRecordField($field)) {
3478 $destination[$field] = $properties;
3479 if ($returnMultiSummaryFields) {
3480 if ($properties['is_multi_summary']) {
3481 $multiSummaryFields[$field] = $properties;
3484 unset($source[$field]);
3487 return $multiSummaryFields;
3491 * This is function is used to format pseudo fields
3493 * @param array $fields associated array of profile fields
3497 static function reformatProfileFields(&$fields) {
3498 //reformat fields array
3499 foreach ($fields as $name => $field) {
3500 //reformat phone and extension field
3501 if ( substr($field['name'], 0, 13) == 'phone_and_ext') {
3502 $fieldSuffix = str_replace('phone_and_ext-', '', $field['name']);
3504 // retain existing element properties and just update and replace key
3505 CRM_Utils_Array
::crmReplaceKey($fields, $name, "phone-{$fieldSuffix}");
3506 $fields["phone-{$fieldSuffix}"]['name'] = "phone-{$fieldSuffix}";
3507 $fields["phone-{$fieldSuffix}"]['where'] = 'civicrm_phone.phone';
3509 // add additional phone extension field
3510 $fields["phone_ext-{$fieldSuffix}"] = $field;
3511 $fields["phone_ext-{$fieldSuffix}"]['title'] = $field['title'] .' - '.ts('Ext.');
3512 $fields["phone_ext-{$fieldSuffix}"]['name'] = "phone_ext-{$fieldSuffix}";
3513 $fields["phone_ext-{$fieldSuffix}"]['where'] = 'civicrm_phone.phone_ext';
3514 $fields["phone_ext-{$fieldSuffix}"]['skipDisplay'] = 1;
3515 //ignore required for extension field
3516 $fields["phone_ext-{$fieldSuffix}"]['is_required'] = 0;