/**
  * Save member
  *
  * @access	public
  * @param 	int		Member key: Either Array, ID or email address. If it's an array, it must be in the format:
  *					 array( 'core' => array( 'field' => 'member_id', 'value' => 1 ) ) - useful for passing custom fields through
  * @param 	array 	Fields to save in the following format: array( 'members'      => array( 'email'     => '*****@*****.**',
  *																				         'joined'   => time() ),
  *															   'extendedProfile' => array( 'signature' => 'My signature' ) );
  *					Tables: members, pfields_content, profile_portal.
  *					You can also use the aliases: 'core [members]', 'extendedProfile [profile_portal]', and 'customFields [pfields_content]'
  * @return	boolean	True if the save was successful
  *
  * Exception Error Codes:
  * NO_DATA 		  : No data to save
  * NO_VALID_KEY    : No valid key to save
  * NO_AUTO_LOAD    : Could not autoload the member as she does not exist
  * INCORRECT_TABLE : Table one is attempting to save to does not exist
  * NO_MEMBER_GROUP_ID: Member group ID is in the array but blank
  */
 public static function save($member_key, $save = array())
 {
     $member_id = 0;
     $member_email = '';
     $member_field = '';
     $_updated = 0;
     $bitWiseFields = ipsRegistry::fetchBitWiseOptions('global');
     $member_k_array = array('members' => array(), 'pfields_content' => array(), 'profile_portal' => array());
     $_tables = array_keys($save);
     $_MEMBERKEY = 'member_id';
     $_MEMBERVALUE = $member_key;
     //-----------------------------------------
     // Test...
     //-----------------------------------------
     if (!is_array($save) or !count($save)) {
         throw new Exception('NO_DATA');
     }
     //-----------------------------------------
     // ID or email?
     //-----------------------------------------
     if (!is_array($member_key)) {
         if (strstr($member_key, '@')) {
             $_MEMBERKEY = 'email';
             $member_k_array['members'] = array('field' => 'email', 'value' => "'" . ipsRegistry::instance()->DB()->addSlashes(strtolower($member_key)) . "'");
             //-----------------------------------------
             // Check to see if we've got more than the core
             // table to save on.
             //-----------------------------------------
             $_got_more_than_core = FALSE;
             foreach ($_tables as $table) {
                 if (isset(self::$remap[$table])) {
                     $table = self::$remap[$table];
                 }
                 if ($table != 'members') {
                     $_got_more_than_core = TRUE;
                     break;
                 }
             }
             if ($_got_more_than_core === TRUE) {
                 /* Get the ID */
                 $_memberTmp = self::load($member_key, 'core');
                 if ($_memberTmp['member_id']) {
                     $member_k_array['pfields_content'] = array('field' => 'member_id', 'value' => $_memberTmp['member_id']);
                     $member_k_array['profile_portal'] = array('field' => 'pp_member_id', 'value' => $_memberTmp['member_id']);
                 } else {
                     throw new Exception("NO_AUTO_LOAD");
                 }
             }
         } else {
             $member_k_array['members'] = array('field' => 'member_id', 'value' => intval($member_key));
             $member_k_array['pfields_content'] = array('field' => 'member_id', 'value' => intval($member_key));
             $member_k_array['profile_portal'] = array('field' => 'pp_member_id', 'value' => intval($member_key));
             self::_updateCache($member_key, $save);
         }
     } else {
         $_member_k_array = $member_k_array;
         foreach ($member_key as $table => $data) {
             if (isset(self::$remap[$table])) {
                 $table = self::$remap[$table];
             }
             if (!in_array($table, array_keys($_member_k_array))) {
                 throw new Exception('INCORRECT_TABLE');
             }
             $member_k_array[$table] = $data;
         }
     }
     //-----------------------------------------
     // Test...
     //-----------------------------------------
     if (!is_array($member_k_array) or !count($member_k_array)) {
         throw new Exception('NO_DATA');
     }
     //-----------------------------------------
     // Now save...
     //-----------------------------------------
     foreach ($save as $table => $data) {
         if (isset(self::$remap[$table])) {
             $table = self::$remap[$table];
         }
         if ($table == 'profile_portal') {
             $data[$member_k_array[$table]['field']] = $member_k_array[$table]['value'];
             //-----------------------------------------
             // Does row exist?
             //-----------------------------------------
             $check = ipsRegistry::DB()->buildAndFetch(array('select' => 'pp_member_id', 'from' => 'profile_portal', 'where' => 'pp_member_id=' . $data['pp_member_id']));
             if (!$check['pp_member_id']) {
                 ipsRegistry::DB()->insert($table, $data);
             } else {
                 ipsRegistry::DB()->update($table, $data, 'pp_member_id=' . $data['pp_member_id']);
             }
         } else {
             if ($table == 'pfields_content') {
                 $data[$member_k_array[$table]['field']] = $member_k_array[$table]['value'];
                 foreach ($data as $_k => $_v) {
                     ipsRegistry::DB()->force_data_type[$_k] = 'string';
                 }
                 //-----------------------------------------
                 // Does row exist?
                 //-----------------------------------------
                 $check = ipsRegistry::DB()->buildAndFetch(array('select' => 'member_id', 'from' => 'pfields_content', 'where' => 'member_id=' . $data['member_id']));
                 if (!$check['member_id']) {
                     ipsRegistry::DB()->insert($table, $data);
                 } else {
                     ipsRegistry::DB()->update($table, $data, 'member_id=' . $data['member_id']);
                 }
             } else {
                 if ($table == 'members') {
                     /* Make sure we have a value for member_group_id if passed */
                     if (isset($data['member_group_id']) and !$data['member_group_id']) {
                         throw new Exception("NO_MEMBER_GROUP_ID");
                     }
                     /* Some stuff that can end up  here */
                     unset($data['_canBeIgnored']);
                     /* Bitwise options */
                     if (is_array($bitWiseFields['members'])) {
                         $_freeze = array();
                         foreach ($bitWiseFields['members'] as $field) {
                             if (isset($data[$field])) {
                                 /* Add to freezeable array */
                                 $_freeze[$field] = $data[$field];
                                 /* Remove it from the fields to save to DB */
                                 unset($data[$field]);
                             }
                         }
                         if (count($_freeze)) {
                             $data['members_bitoptions'] = IPSBWOptions::freeze($_freeze, 'members', 'global');
                         }
                     }
                     ipsRegistry::DB()->force_data_type = array('name' => 'string', 'title' => 'string', 'members_l_username' => 'string', 'members_display_name' => 'string', 'members_l_display_name' => 'string', 'members_seo_name' => 'string', 'msg_count_total' => 'int', 'msg_count_new' => 'int', 'members_bitoptions' => 'int');
                 }
                 ipsRegistry::DB()->update($table, $data, $member_k_array[$table]['field'] . '=' . $member_k_array[$table]['value']);
             }
         }
         $_updated += ipsRegistry::instance()->DB()->getAffectedRows();
     }
     //-----------------------------------------
     // If member login key is updated during
     // session creation, this causes fatal error
     //-----------------------------------------
     if (is_object(ipsRegistry::member())) {
         $save[$_MEMBERKEY] = $_MEMBERVALUE;
         IPSLib::runMemberSync('onProfileUpdate', $save);
     }
     return $_updated > 0 ? TRUE : FALSE;
 }
Exemple #2
0
 /**
  * Fetch and build the bitwise array
  *
  * @param	string		Array key to return
  * @return	array
  */
 protected static function _getBitWiseArray($type, $app)
 {
     $bitArray = array();
     $allOptions = ipsRegistry::fetchBitWiseOptions($app);
     if (is_array($allOptions)) {
         if (isset($allOptions[$type]) and is_array($allOptions[$type])) {
             $n = 1;
             foreach ($allOptions[$type] as $key) {
                 $bitArray[$key] = $n;
                 $n *= 2;
             }
         }
     }
     return $bitArray;
 }