/** * 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; }
/** * 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; }