Community Documentation

How to sync user profile fields with civicrm when a user account is created (Drupal 6)

Last updated September 4, 2009. Created by scarer on June 2, 2009.
Edited by bekasu. Log in to edit this page.

Make sure you have the Rules module installed.

Create a new triggered rule that occurs when a new user is created.

Create a new action for this rule that executes custom php.

I added this code as my custom php (omit php tags):

<?php
profile_load_profile
($account);
$firstname = $account->profile_first_name;
$lastname = $account->profile_last_name;
$displayname = $account->name;
$email = $account->mail;
$street = $account->profile_street;
$city = $account->profile_city;
$state = $account->profile_state;
$postalcode = $account->profile_postal_code;
$country = $account->profile_country;
$fax = $account->profile_fax_number;
$phone = $account->profile_phone_number;
$mobile = $account->profile_mobile;

db_set_active('contacts');

$result = db_query("SELECT contact_id FROM civicrm_email WHERE email = '$email'");

    while (
$node = db_fetch_object($result)) {
       
$userId = $node->id;
    }
//end while statement
//insert names into civicrm
//db_query("SELECT * FROM civicrm_contact WHERE id = $userId");
db_query("UPDATE civicrm_contact SET display_name = '$displayname' WHERE id = $userId");
db_query("UPDATE civicrm_contact SET first_name = '$firstname' WHERE id = $userId");
db_query("UPDATE civicrm_contact SET last_name = '$lastname' WHERE id = $userId");
//insert addresses into civicrm
if ($street != '' || $street != NULL || $street != 0 || $city != '' || $city != NULL || $city != 0)
{
   
db_query("INSERT INTO civicrm_address (street_address, city, contact_id) values ('$street', '$city', $userId)");
}


db_set_active('default');
?>

This code selects the database that stores the civicrm data, loads the profile fields from drupal and writes to the database that stores the civicrm data.

For this code snippet to work you'll need to modify your Drupal settings file so that it allows you to select an alternative database.

Eg.

$db_url['default'] = 'mysqli://user:pass@localhost/drupaldb';
$db_url['contacts'] = 'mysqli://user:pass@localhost/civicrmdb';

Comments

work around for Gigya

PLEASE NOTE: this is a bit of a hack, so any advice on how to clean it up would be greatly appreciated.

I was trying to do this same thing, except I was also using the Gigya module for authentication. the above didn't work, because the Gigya authentication doesn't happen immediately upon creating a new account, so the above was registering an anonymous user.

So what I did is set up a rule with action 'upon viewing a user profile' (which is where the user is redirected on login) with the following two conditions:

<?php
$firstname
= $account->profile_first_name;
global
$user;
$uid = $user->uid;
db_set_active('civicrm');
$civiid = db_result(db_query("SELECT contact_id FROM {civicrm_uf_match} WHERE uf_id = %d", $uid));
$result = db_result(db_query("SELECT first_name FROM {civicrm_contact} WHERE id = %d", $civiid));
db_set_active('default');
return
$result != $firstname;
?>

and

<?php
return $account->uid == $user->uid;
?>

and then the rule was:

<?php
drupal_set_message
("This is your account page. Click Edit to change your password or account info. Click My Friends to see which of your current Social Networking Friends are on this site.");
// set all of our variables

$firstname = $account->profile_first_name;
$lastname = $account->profile_last_name;
$displayname = $firstname;
$displayname .= " ";
$displayname .= $lastname;
$firstname = $account->profile_first_name;
$lastname = $account->profile_last_name;
$sortname = $lastname;
$sortname .= ", ";
$sortname .= $firstname;
$email = $account->mail;
$street = $account->profile_street_address;
$city = $account->profile_city;
$state = $account->profile_state;
$postalcode = $account->profile_postal_code;
$county = $account->profile_county;
$mobile = $account->profile_mobile_phone;

// get this new user's uid
global $user;
$uid = $user->uid;

// set the civicrm database as the active one for all queries
db_set_active('civicrm');

// get info about current CiviCRM user id
$civiid = db_result(db_query("SELECT contact_id FROM {civicrm_uf_match} WHERE uf_id = %d", $uid));

//insert the users name into the civicrm database
db_query("UPDATE {civicrm_contact} SET display_name='$displayname', first_name='$firstname', last_name='$lastname', sort_name='$sortname' WHERE id = $civiid");

// insert the users mobile number in the civicrm database
db_query("INSERT INTO {civicrm_phone} (contact_id, phone, phone_type_id, is_primary) VALUES (%d, '%s', %d, %b)", $civiid, $mobile, 2, 1);

// insert the users postal code, since it is a required field
db_query("INSERT INTO {civicrm_address} (postal_code, contact_id) VALUES ('%s', %d)", $postalcode, $civiid);

// get state ID
$stateCode = db_result(db_query("SELECT id FROM {civicrm_state_province} WHERE abbreviation = $state"));

//insert the users addresses into the civicrm db, but first check to make sure they entered at least something in those non-required fields
if ($street != '' || $street != NULL || $street != 0 || $city != '' || $city != NULL || $city != 0 || $state != '' || $state != NULL || $state != 0) {
 
db_query("UPDATE {civicrm_address} SET street_address='%s', city='%s', state_province_id=%d, is_primary=1 WHERE contact_id=%d", $street, $city, $stateCode, $civiid);
}

// insert the users county into the county db fields (mine are custom) (another required field)
db_query("INSERT INTO {civicrm_value_pledge_results_2} (entity_id, user_county_19) VALUES (%d, '%s')", $civiid, $county);

// set db back to drupal db for rest of page load
db_set_active('default');
?>

Page status

No known problems

Log in to edit this page

About this page

Drupal version
Drupal 6.x
Audience
Programmers

Site Building Guide

Drupal’s online documentation is © 2000-2013 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License. Comments on documentation pages are used to improve content and then deleted.
nobody click here