/** * If table key (id) is NULL : inserts new rows * otherwise updates existing row in the database tables * * Can be overridden or overloaded by the child classes * * @param boolean $updateNulls TRUE: null object variables are also updated, FALSE: not. * @return boolean TRUE if successful otherwise FALSE */ function store( $updateNulls = false ) { global $_CB_framework, $_CB_database, $ueConfig; $this->id = (int) $this->id; if ( checkJversion() == 2 ) { $this->gids = ( is_array( $this->gids ) ? $this->gids : array( $this->gid ) ); $this->gid = (int) $_CB_framework->acl->getBackwardsCompatibleGid( $this->gids ); } else { $this->gid = (int) $this->gid; $this->gids = array( $this->gid ); } $isNew = ( $this->id == 0 ); $oldUsername = null; $oldGid = null; $oldBlock = null; //TOOD //FIXME Somehow the constructor does not get called in j1.6, so need to redo this here: if ( checkJversion() == 2 ) { $this->_cmsUserTableGid = 'usertype'; } if ( ! $isNew ) { // get actual username to update sessions in case: $sql = 'SELECT ' . $_CB_database->NameQuote( $this->_cmsUserTableUsername ) . ', ' . $_CB_database->NameQuote( $this->_cmsUserTableGid ) . ', ' . $_CB_database->NameQuote( 'block' ) . ' FROM ' . $_CB_database->NameQuote( $this->_cmsUserTable ) . ' WHERE ' . $_CB_database->NameQuote( $this->_cmsUserTableKey ) . ' = ' . (int) $this->user_id; $_CB_database->setQuery( $sql ); $oldEntry = null; if ( $_CB_database->loadObject( $oldEntry ) ) { $oldUsername = $oldEntry->username; if ( checkJversion() == 2 ) { $oldGids = array_values( (array) JFactory::getUser( $this->id )->groups ); $oldGid = (int) $_CB_framework->acl->getBackwardsCompatibleGid( $oldGids ); } else { $oldGid = (int) $oldEntry->gid; $oldGids = array( $oldEntry->gid ); } $oldBlock = $oldEntry->block; } } // insure usertype is in sync with gid: /* * This could be a better method: if ( checkJversion() == 1 ) { $gdataArray = $_CB_framework->acl->get_group_data( (int) $this->gid, 'ARO' ); if ( $gdataArray ) { $this->usertype = $gdataArray[3]; } else { user_error( sprintf( 'comprofilerUser::store: gacl:get_group_data: for user_id %d, name of group_id %d not found in acl groups table.', $this->id, $this->gid ), E_USER_WARNING ); $this->usertype = 'Registered'; } } else { $this->usertype = $_CB_framework->acl->get_group_name( (int) $gid, 'ARO' ); } */ if ( checkJversion() == 2 ) { $query = 'SELECT title AS name' . "\n FROM #__usergroups" . "\n WHERE id = " . (int) $this->gid ; } elseif ( checkJversion() == 1 ) { $query = 'SELECT name' . "\n FROM #__core_acl_aro_groups" . "\n WHERE id = " . (int) $this->gid ; } else { $query = 'SELECT name' . "\n FROM #__core_acl_aro_groups" . "\n WHERE group_id = " . (int) $this->gid ; } $_CB_database->setQuery( $query ); $this->usertype = $_CB_database->loadResult(); // creates CMS and CB objects: $this->_mapUsers(); // remove the previous email set in bindSafely() and needed for checkSafely(): unset( $this->_original_email ); // stores first into CMS to get id of user if new: if ( is_callable( array( $this->_cmsUser, 'store' ) ) ) { $result = $this->_cmsUser->store( $updateNulls ); if ( ! $result ) { $this->_error = $this->_cmsUser->getError(); } } else { if ( checkJversion() == 2 ) { $this->_cmsUser->groups = $this->gids; } $result = $this->_cmsUser->save(); // Joomla 1.5 native if ( ! $result ) { $this->_error = $this->_cmsUser->getError(); if ( class_exists( 'JText' ) ) { $this->_error = JText::_( $this->_error ); } } } if ( $result ) { // synchronize id and user_id: if ( $isNew ) { if ( $this->_cmsUser->id == 0 ) { // this is only for mambo 4.5.0 backwards compatibility. 4.5.2.3 $row->store() updates id on insert $sql = 'SELECT ' . $_CB_database->NameQuote( $this->_cmsUserTableKey ) . ' FROM ' . $_CB_database->NameQuote( $this->_cmsUserTable ) . ' WHERE ' . $_CB_database->NameQuote( $this->_cmsUserTableUsername ) . ' = ' . $_CB_database->Quote( $this->username); $_CB_database->setQuery( $sql ); $this->_cmsUser->id = (int) $_CB_database->loadResult(); } $this->id = $this->_cmsUser->id; $this->_comprofilerUser->id = $this->_cmsUser->id; } if ( ( $this->confirmed == 0 ) && ( $this->cbactivation == '' ) && ( $ueConfig['reg_confirmation'] != 0 ) ) { $this->_setActivationCode(); } // stores CB user into comprofiler: if new, inserts, otherwise updates: if ( $this->user_id == 0 ) { $this->user_id = $this->_cmsUser->id; $this->_comprofilerUser->user_id = $this->user_id; $result = $this->_comprofilerUser->storeNew( $updateNulls ); } else { $result = $this->_comprofilerUser->store( $updateNulls ); } if ( ! $result ) { $this->_error = $this->_comprofilerUser->getError(); } } if ( $result ) { // update the ACL: if ( checkJversion() == 2 ) { $query = 'SELECT m.id AS aro_id, a.group_id FROM #__user_usergroup_map AS a' . "\n INNER JOIN #__usergroups AS m ON m.id= a.group_id" . "\n WHERE a.user_id = " . (int) $this->id ; } elseif ( checkJversion() == 1 ) { $query = 'SELECT a.id AS aro_id, m.group_id FROM #__core_acl_aro AS a' . "\n INNER JOIN #__core_acl_groups_aro_map AS m ON m.aro_id = a.id" . "\n WHERE a.value = " . (int) $this->id ; } else { $query = 'SELECT a.aro_id, m.group_id FROM #__core_acl_aro AS a' . "\n INNER JOIN #__core_acl_groups_aro_map AS m ON m.aro_id = a.aro_id" . "\n WHERE a.value = " . (int) $this->id ; } $_CB_database->setQuery( $query ); $aro_group = null; $result = $_CB_database->loadObject( $aro_group ); if ( $result && ( $aro_group->group_id != $this->gid ) ) { if ( checkJversion() == 2 ) { // $query = 'UPDATE #__user_usergroup_map' // . "\n SET group_id = " . (int) $this->gid // . "\n WHERE user_id = " . (int) $this->id // . ( $oldGid ? "\n AND group_id = " . (int) $oldGid : null ) // ; // $_CB_database->setQuery( $query ); // $result = $_CB_database->query(); } else { $query = 'UPDATE #__core_acl_groups_aro_map' . "\n SET group_id = " . (int) $this->gid . "\n WHERE aro_id = " . (int) $aro_group->aro_id ; $_CB_database->setQuery( $query ); $result = $_CB_database->query(); } } if ( $result && ( ! $isNew ) && ( ( $oldUsername != $this->username ) || ( $aro_group->group_id != $this->gid ) || ( $oldGid != $this->gid ) || ( ( $oldBlock == 0 ) && ( $this->block == 1 ) ) ) ) { // Update current sessions state if there is a change in gid or in username: if ( $this->block == 0 ) { $sessionGid = 1; if ( $_CB_framework->acl->is_group_child_of( $this->usertype, 'Registered', 'ARO' ) || $_CB_framework->acl->is_group_child_of( $this->usertype, 'Public Backend', 'ARO' ) ) { // Authors, Editors, Publishers and Super Administrators are part of the Special Group: $sessionGid = 2; } $query = 'UPDATE #__session ' . "\n SET usertype = " . $_CB_database->Quote( $this->usertype ); if ( checkJversion() <= 1 ) { $query .= ', gid = ' . (int) $sessionGid; } $query .= ', username = ' . $_CB_database->Quote( $this->username ) . "\n WHERE userid = " . (int) $this->id ; //TBD: here maybe jaclplus fields update if JACLplus installed.... $_CB_database->setQuery( $query ); $result = $_CB_database->query(); } else { // logout user now that user login has been blocked: if ( $_CB_framework->myId() == $this->id ) { $_CB_framework->logout(); } $_CB_database->setQuery( "DELETE FROM #__session WHERE userid = " . (int) $this->id ); //TBD: check if this is enough for J 1.5 $result = $_CB_database->query(); } } if ( ! $result ) { $this->_error = $_CB_database->stderr(); return false; } } return $result; }