public function testExtractName() { $cases = array(array('full_name' => 'Alan', 'first_name' => 'Alan'), array('full_name' => 'Alan Arkin', 'first_name' => 'Alan', 'last_name' => 'Arkin'), array('full_name' => '"Alan Arkin"', 'first_name' => 'Alan', 'last_name' => 'Arkin'), array('full_name' => 'Alan A Arkin', 'first_name' => 'Alan', 'middle_name' => 'A', 'last_name' => 'Arkin'), array('full_name' => 'Adams, Amy', 'first_name' => 'Amy', 'last_name' => 'Adams'), array('full_name' => 'Adams, Amy A', 'first_name' => 'Amy', 'middle_name' => 'A', 'last_name' => 'Adams'), array('full_name' => '"Adams, Amy A"', 'first_name' => 'Amy', 'middle_name' => 'A', 'last_name' => 'Adams')); foreach ($cases as $case) { $actual = array(); CRM_Utils_String::extractName($case['full_name'], $actual); $this->assertEquals($actual['first_name'], $case['first_name']); $this->assertEquals(CRM_Utils_Array::value('last_name', $actual), CRM_Utils_Array::value('last_name', $case)); $this->assertEquals(CRM_Utils_Array::value('middle_name', $actual), CRM_Utils_Array::value('middle_name', $case)); } }
/** * Retrieve a contact ID and if not present. * * Create one with this email * * @param string $email * @param string $name * @param bool $create * @param string $mail * * @return int|null */ public static function getContactID($email, $name = NULL, $create = TRUE, &$mail) { $dao = CRM_Contact_BAO_Contact::matchContactOnEmail($email, 'Individual'); $contactID = NULL; if ($dao) { $contactID = $dao->contact_id; } $result = NULL; CRM_Utils_Hook::emailProcessorContact($email, $contactID, $result); if (!empty($result)) { if ($result['action'] == self::EMAILPROCESSOR_IGNORE) { return NULL; } if ($result['action'] == self::EMAILPROCESSOR_OVERRIDE) { return $result['contactID']; } // else this is now create individual // so we just fall out and do what we normally do } if ($contactID) { return $contactID; } if (!$create) { return NULL; } // contact does not exist, lets create it $params = array('contact_type' => 'Individual', 'email-Primary' => $email); CRM_Utils_String::extractName($name, $params); return CRM_Contact_BAO_Contact::createProfileContact($params, CRM_Core_DAO::$_nullArray); }
/** * Synchronize the object with the UF Match entry. Can be called stand-alone from * the drupalUsers script * * @param Object $user * The drupal user object. * @param string $userKey * The id of the user from the uf object. * @param string $uniqId * The OpenID of the user. * @param string $uf * The name of the user framework. * @param int $status * Returns the status if user created or already exits (used for CMS sync). * @param string $ctype * contact type * @param bool $isLogin * * @return CRM_Core_DAO_UFMatch|bool */ public static function &synchronizeUFMatch(&$user, $userKey, $uniqId, $uf, $status = NULL, $ctype = NULL, $isLogin = FALSE) { $config = CRM_Core_Config::singleton(); if (!CRM_Utils_Rule::email($uniqId)) { $retVal = $status ? NULL : FALSE; return $retVal; } $newContact = FALSE; // make sure that a contact id exists for this user id $ufmatch = new CRM_Core_DAO_UFMatch(); $ufmatch->domain_id = CRM_Core_Config::domainID(); $ufmatch->uf_id = $userKey; if (!$ufmatch->find(TRUE)) { $transaction = new CRM_Core_Transaction(); $dao = NULL; if (!empty($_POST) && !$isLogin) { $params = $_POST; $params['email'] = $uniqId; $dedupeParams = CRM_Dedupe_Finder::formatParams($params, 'Individual'); $dedupeParams['check_permission'] = FALSE; $ids = CRM_Dedupe_Finder::dupesByParams($dedupeParams, 'Individual'); if (!empty($ids) && Civi::settings()->get('uniq_email_per_site')) { // restrict dupeIds to ones that belong to current domain/site. $siteContacts = CRM_Core_BAO_Domain::getContactList(); foreach ($ids as $index => $dupeId) { if (!in_array($dupeId, $siteContacts)) { unset($ids[$index]); } } // re-index the array $ids = array_values($ids); } if (!empty($ids)) { $dao = new CRM_Core_DAO(); $dao->contact_id = $ids[0]; } } else { $dao = CRM_Contact_BAO_Contact::matchContactOnEmail($uniqId, $ctype); } $found = FALSE; if ($dao) { // ensure there does not exists a contact_id / uf_id pair // in the DB. This might be due to multiple emails per contact // CRM-9091 $sql = "\nSELECT id\nFROM civicrm_uf_match\nWHERE contact_id = %1\nAND domain_id = %2\n"; $params = array(1 => array($dao->contact_id, 'Integer'), 2 => array(CRM_Core_Config::domainID(), 'Integer')); $conflict = CRM_Core_DAO::singleValueQuery($sql, $params); if (!$conflict) { $found = TRUE; $ufmatch->contact_id = $dao->contact_id; $ufmatch->uf_name = $uniqId; } } if (!$found) { if ($config->userSystem->is_drupal) { $mail = 'mail'; } elseif ($uf == 'WordPress') { $mail = 'user_email'; } else { $mail = 'email'; } if (is_object($user)) { $params = array('email-Primary' => $user->{$mail}); } if ($ctype == 'Organization') { $params['organization_name'] = $uniqId; } elseif ($ctype == 'Household') { $params['household_name'] = $uniqId; } if (!$ctype) { $ctype = "Individual"; } $params['contact_type'] = $ctype; // extract first / middle / last name // for joomla if ($uf == 'Joomla' && $user->name) { CRM_Utils_String::extractName($user->name, $params); } if ($uf == 'WordPress') { if ($user->first_name) { $params['first_name'] = $user->first_name; } if ($user->last_name) { $params['last_name'] = $user->last_name; } } $contactId = CRM_Contact_BAO_Contact::createProfileContact($params, CRM_Core_DAO::$_nullArray); $ufmatch->contact_id = $contactId; $ufmatch->uf_name = $uniqId; } // check that there are not two CMS IDs matching the same CiviCRM contact - this happens when a civicrm // user has two e-mails and there is a cms match for each of them // the gets rid of the nasty fata error but still reports the error $sql = "\nSELECT uf_id\nFROM civicrm_uf_match\nWHERE ( contact_id = %1\nOR uf_name = %2\nOR uf_id = %3 )\nAND domain_id = %4\n"; $params = array(1 => array($ufmatch->contact_id, 'Integer'), 2 => array($ufmatch->uf_name, 'String'), 3 => array($ufmatch->uf_id, 'Integer'), 4 => array($ufmatch->domain_id, 'Integer')); $conflict = CRM_Core_DAO::singleValueQuery($sql, $params); if (!$conflict) { $ufmatch = CRM_Core_BAO_UFMatch::create((array) $ufmatch); $ufmatch->free(); $newContact = TRUE; $transaction->commit(); } else { $msg = ts("Contact ID %1 is a match for %2 user %3 but has already been matched to %4", array(1 => $ufmatch->contact_id, 2 => $uf, 3 => $ufmatch->uf_id, 4 => $conflict)); unset($conflict); } } if ($status) { return $newContact; } else { return $ufmatch; } }
/** * retrieve a contact ID and if not present * create one with this email */ function getContactID($email, $name = null, $create = true) { require_once 'CRM/Contact/BAO/Contact.php'; $dao = CRM_Contact_BAO_Contact::matchContactOnEmail($email, 'Individual'); if ($dao) { return $dao->contact_id; } if (!$create) { return null; } // contact does not exist, lets create it $params = array('contact_type' => 'Individual', 'email-Primary' => $email); require_once 'CRM/Utils/String.php'; CRM_Utils_String::extractName($name, $params); return CRM_Contact_BAO_Contact::createProfileContact($params, CRM_Core_DAO::$_nullArray); }
/** * Synchronize the object with the UF Match entry. Can be called stand-alone from * the drupalUsers script * * @param Object $user the drupal user object * @param string $userKey the id of the user from the uf object * @param string $uniqId the OpenID of the user * @param string $uf the name of the user framework * @param integer $status returns the status if user created or already exits (used for CMS sync) * * @return the ufmatch object that was found or created * @access public * @static */ static function &synchronizeUFMatch(&$user, $userKey, $uniqId, $uf, $status = null, $ctype = null, $isLogin = false) { // validate that uniqId is a valid url. it will either be // an OpenID (which should always be a valid url) or a // http://uf_username/ construction (so that it can // be used as an OpenID in the future) require_once 'CRM/Utils/Rule.php'; if ($uf == 'Standalone') { if (!CRM_Utils_Rule::url($uniqId)) { return $status ? null : false; } } else { if (!CRM_Utils_Rule::email($uniqId)) { return $status ? null : false; } } $newContact = false; // make sure that a contact id exists for this user id $ufmatch =& new CRM_Core_DAO_UFMatch(); if (CRM_Core_DAO::checkFieldExists('civicrm_uf_match', 'domain_id')) { // FIXME: if() condition check was required especially for upgrade cases (2.2.x -> 3.0.x), // where folks if happen to logout, would encounter a column not found fatal error $ufmatch->domain_id = CRM_Core_Config::domainID(); } $ufmatch->uf_id = $userKey; if (!$ufmatch->find(true)) { require_once 'CRM/Core/Transaction.php'; $transaction = new CRM_Core_Transaction(); if (!empty($_POST) && !$isLogin) { $params = $_POST; $params['email'] = $uniqId; require_once 'CRM/Dedupe/Finder.php'; $dedupeParams = CRM_Dedupe_Finder::formatParams($params, 'Individual'); $ids = CRM_Dedupe_Finder::dupesByParams($dedupeParams, 'Individual'); if (!empty($ids) && defined('CIVICRM_UNIQ_EMAIL_PER_SITE') && CIVICRM_UNIQ_EMAIL_PER_SITE) { // restrict dupeIds to ones that belong to current domain/site. require_once 'CRM/Core/BAO/Domain.php'; $siteContacts = CRM_Core_BAO_Domain::getContactList(); foreach ($ids as $index => $dupeId) { if (!in_array($dupeId, $siteContacts)) { unset($ids[$index]); } } $ids = array_values($ids); //re-index the array } if (!empty($ids)) { $dao = new CRM_Core_DAO(); $dao->contact_id = $ids[0]; } } else { require_once 'CRM/Contact/BAO/Contact.php'; if ($uf == 'Standalone') { $dao =& CRM_Contact_BAO_Contact::matchContactOnOpenId($uniqId, $ctype); } else { $dao =& CRM_Contact_BAO_Contact::matchContactOnEmail($uniqId, $ctype); } } if ($dao) { //print "Found contact with uniqId $uniqId<br/>"; $ufmatch->contact_id = $dao->contact_id; $ufmatch->uf_name = $uniqId; } else { if ($uf == 'Drupal') { $mail = 'mail'; } else { $mail = 'email'; } if (is_Object($user)) { $params = array('email-Primary' => $user->{$mail}); } if ($ctype == 'Organization') { $params['organization_name'] = $uniqId; } else { if ($ctype == 'Household') { $params['household_name'] = $uniqId; } } if (!$ctype) { $ctype = "Individual"; } $params['contact_type'] = $ctype; // extract first / middle / last name // for joomla if ($uf == 'Joomla' && $user->name) { require_once 'CRM/Utils/String.php'; CRM_Utils_String::extractName($user->name, $params); } if ($uf == 'Standalone') { $params['openid-Primary'] = $uniqId; //need to delete below code once profile is //exposed on signup page if (!empty($user->first_name) || !empty($user->last_name)) { $params['first_name'] = $user->first_name; $params['last_name'] = $user->last_name; } elseif (!empty($user->name)) { require_once 'CRM/Utils/String.php'; CRM_Utils_String::extractName($user->name, $params); } } $contactId = CRM_Contact_BAO_Contact::createProfileContact($params, CRM_Core_DAO::$_nullArray); $ufmatch->contact_id = $contactId; $ufmatch->uf_name = $uniqId; } // check that there are not two CMS IDs matching the same CiviCRM contact - this happens when a civicrm // user has two e-mails and there is a cms match for each of them // the gets rid of the nasty fata error but still reports the error $sql = "\nSELECT uf_id\nFROM civicrm_uf_match\nWHERE ( contact_id = %1\nOR uf_name = %2\nOR uf_id = %3 )\nAND domain_id = %4\n"; $params = array(1 => array($ufmatch->contact_id, 'Integer'), 2 => array($ufmatch->uf_name, 'String'), 3 => array($ufmatch->uf_id, 'Integer'), 4 => array($ufmatch->domain_id, 'Integer')); require_once 'CRM/Core/DAO.php'; $conflict = CRM_Core_DAO::singleValueQuery($sql, $params); if (!$conflict) { $ufmatch->save(); $ufmatch->free(); $newContact = true; $transaction->commit(); } else { $msg = ts("Contact ID %1 is a match for %2 user %3 but has already been matched to %4", array(1 => $ufmatch->contact_id, 2 => $uf, 3 => $ufmatch->uf_id, 4 => $conflict)); unset($conflict); } } if ($status) { return $newContact; } else { return $ufmatch; } }
/** * Synchronize the object with the UF Match entry. Can be called stand-alone from * the drupalUsers script * * @param Object $user the drupal user object * @param string $userKey the id of the user from the uf object * @param string $uniqId the OpenID of the user * @param string $uf the name of the user framework * @param integer $status returns the status if user created or already exits (used for CMS sync) * * @return the ufmatch object that was found or created * @access public * @static */ static function &synchronizeUFMatch(&$user, $userKey, $uniqId, $uf, $status = null, $ctype = null) { // validate that uniqId is a valid url. it will either be // an OpenID (which should always be a valid url) or a // http://uf_username/ construction (so that it can // be used as an OpenID in the future) require_once 'CRM/Utils/Rule.php'; if ($uf == 'Standalone') { if (!CRM_Utils_Rule::url($uniqId)) { return $status ? null : false; } } else { if (!CRM_Utils_Rule::email($uniqId)) { return $status ? null : false; } } $newContact = false; // make sure that a contact id exists for this user id $ufmatch =& new CRM_Core_DAO_UFMatch(); if (CRM_Core_DAO::checkFieldExists('civicrm_uf_match', 'domain_id')) { // FIXME: if() condition check was required especially for upgrade cases (2.2.x -> 3.0.x), // where folks if happen to logout, would encounter a column not found fatal error $ufmatch->domain_id = CRM_Core_Config::domainID(); } $ufmatch->uf_id = $userKey; if (!$ufmatch->find(true)) { require_once 'CRM/Core/Transaction.php'; $transaction = new CRM_Core_Transaction(); if (!empty($_POST)) { $params = $_POST; $params['email'] = $uniqId; require_once 'CRM/Dedupe/Finder.php'; $dedupeParams = CRM_Dedupe_Finder::formatParams($params, 'Individual'); $ids = CRM_Dedupe_Finder::dupesByParams($dedupeParams, 'Individual'); if (!empty($ids)) { $dao = new CRM_Core_DAO(); $dao->contact_id = $ids[0]; } } else { require_once 'CRM/Contact/BAO/Contact.php'; if ($uf == 'Standalone') { $dao =& CRM_Contact_BAO_Contact::matchContactOnOpenId($uniqId, $ctype); } else { $dao =& CRM_Contact_BAO_Contact::matchContactOnEmail($uniqId, $ctype); } } if ($dao) { //print "Found contact with uniqId $uniqId<br/>"; $ufmatch->contact_id = $dao->contact_id; $ufmatch->uf_name = $uniqId; } else { if ($uf == 'Drupal') { $mail = 'mail'; } else { $mail = 'email'; } if (is_Object($user)) { $params = array('email-Primary' => $user->{$mail}); } if ($ctype == 'Organization') { $params['organization_name'] = $uniqId; } else { if ($ctype == 'Household') { $params['household_name'] = $uniqId; } } if (!$ctype) { $ctype = "Individual"; } $params['contact_type'] = $ctype; // extract first / middle / last name // for joomla if ($uf == 'Joomla' && $user->name) { require_once 'CRM/Utils/String.php'; CRM_Utils_String::extractName($user->name, $params); } if ($uf == 'Standalone') { $params['openid-Primary'] = $uniqId; //need to delete below code once profile is //exposed on signup page if (!empty($user->first_name) || !empty($user->last_name)) { $params['first_name'] = $user->first_name; $params['last_name'] = $user->last_name; } elseif (!empty($user->name)) { require_once 'CRM/Utils/String.php'; CRM_Utils_String::extractName($user->name, $params); } } $contactId = CRM_Contact_BAO_Contact::createProfileContact($params, CRM_Core_DAO::$_nullArray); $ufmatch->contact_id = $contactId; $ufmatch->uf_name = $uniqId; } $ufmatch->save(); $ufmatch->free(); $newContact = true; $transaction->commit(); } if ($status) { return $newContact; } else { return $ufmatch; } }