/** * loads and prepares all extra fields to be put in the * object via the setExtra method called in the multiport * * NOTE: this MUST be implemented if user class hasExtra is true. * can be empty or removed (no, it won't be called) if hasExtra is false. * * @param int $userId * @return array extra user data stored in the object * * @access public */ public function getExtraData(ADAUser $userObj) { $db =& $this->getConnection(); if (AMA_DB::isError($db)) { return $db; } /** * get extras from table ADAUser::getExtraTableKeyProperty() */ $selQry = "SELECT " . implode(", ", $userObj->getExtraFields()) . " FROM " . ADAUser::getExtraTableName() . " WHERE " . ADAUser::getExtraTableKeyProperty() . "=?"; $returnArr = $this->getRowPrepared($selQry, array($userObj->getId()), AMA_FETCH_ASSOC); /** * load data form tables that have a 1:n relationship with studente table. * * $tablseToLoad is the array of tables to be loaded. WITHOUT PREFIX. * $tablesPrefix is the prefix of the table in the DB. * * the foreach loop does the magic */ $tablesToLoad = ADAUser::getLinkedTables(); $tablesPrefix = ADAUser::getTablesPrefix(); if (!is_null($tablesToLoad)) { foreach ($tablesToLoad as $table) { if (!empty($table) && class_exists($table)) { $selQry = "SELECT " . implode(", ", $table::getFields()) . " FROM " . $tablesPrefix . $table . " WHERE " . $table::getForeignKeyProperty() . "=?" . " ORDER BY " . $table::getKeyProperty() . " ASC"; $extraArr = $this->getAllPrepared($selQry, array($userObj->getId()), AMA_FETCH_ASSOC); foreach ($extraArr as $extraKey => $extraElement) { foreach ($extraElement as $key => $val) { if (stripos($key, "date") !== false) { $extraArr[$extraKey][$key] = ts2dFN($val); } } } if (!empty($extraArr)) { $returnArr[$table] = $extraArr; } } } } return $returnArr; }
if ($userId !== false) { $editUserObj = MultiPort::findUser($userId); } break; } if (!is_null($editUserObj) && isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') { $form = new UserProfileForm($languages); $form->fillWithPostData(); if ($form->isValid()) { $user_layout = $_POST['layout']; $editUserObj->fillWithArrayData($_POST); // save extra datas if it has been forced if (isset($_POST['forceSaveExtra']) && $editUserObj->hasExtra()) { $editUserObj->setExtras($_POST); } MultiPort::setUser($editUserObj, array(), true, ADAUser::getExtraTableName()); /** * Set the session user to the saved one if it's not * a switcher, that is not saving its own profile */ if ($userObj->getType() != AMA_TYPE_SWITCHER) { $_SESSION['sess_userObj'] = $editUserObj; } // if registration form is saved ok and userObj is not a switcher, // force a page reload to reflect the changes immediately $retArray = array("status" => "OK", "title" => $title, "msg" => translateFN('Scheda Anagrafica Salvata'), "reload" => true); } else { $retArray = array("status" => "ERROR", "title" => $title, "msg" => translateFN("I dati non sono validi")); } } else { if (is_null($editUserObj)) {
/** * Updates an existing user * * @param ADAGenericUser $userObj * @param $testers array * @return boolean */ public static function setUser(ADALoggableUser $userObj, $new_testers = array(), $update_user_data = FALSE, $extraTableName = false) { $user_id = $userObj->getId(); $testers = $userObj->getTesters(); $testers_to_add = array(); if (!is_array($testers)) { $testers = array(); } if ($user_id == 0) { return FALSE; } $common_dh = AMA_Common_DataHandler::instance(); $user_dataAr = $userObj->toArray(); if ($update_user_data) { $result = $common_dh->set_user($user_id, $user_dataAr); if (AMA_Common_DataHandler::isError($result)) { //return ADA_SET_USER_ERROR; } } if ($update_user_data) { $idFromPublicTester = 0; foreach ($testers as $tester) { $tester_dh = AMA_DataHandler::instance(MultiPort::getDSN($tester)); // switch ($userObj->getType()) { case AMA_TYPE_STUDENT: /** * @author giorgio * if it's an extraTable I need set_student to return me the id of the inserted * record in the table on DEFAULT that will be used as an id for all other providers */ $result = $tester_dh->set_student($user_id, $user_dataAr, $extraTableName, $userObj, $idFromPublicTester); break; case AMA_TYPE_AUTHOR: $result = $tester_dh->set_author($user_id, $user_dataAr); break; case AMA_TYPE_SUPERTUTOR: case AMA_TYPE_TUTOR: $result = $tester_dh->set_tutor($user_id, $user_dataAr); break; case AMA_TYPE_SWITCHER: $result = $tester_dh->set_user($user_id, $user_dataAr); break; case AMA_TYPE_ADMIN: $result = $tester_dh->set_user($user_id, $user_dataAr); break; } if (AMA_DataHandler::isError($result)) { if ($result->code == AMA_ERR_NOT_FOUND) { $testers_to_add[] = $tester; } //return ADA_SET_USER_ERROR_TESTER; } } } // se sono qui, verifico se in new_testers ci sono dei tester nuovi e li associo all'utente $testers_to_add = array_merge($testers_to_add, array_diff($new_testers, $testers)); $pwd = $common_dh->_get_user_pwd($user_id); if (AMA_DataHandler::isError($pwd)) { // if there is an error, we MUST insert a fake password in provider DB $pwd = sha1($user_id); } $user_dataAr['password'] = $pwd; foreach ($testers_to_add as $tester_to_add) { // aggiungi utente nella tabella utente del tester $tester_dh = AMA_DataHandler::instance(MultiPort::getDSN($tester_to_add)); // we have to use different functions for different user types switch ($userObj->getType()) { case AMA_TYPE_STUDENT: $result = $tester_dh->add_student($user_dataAr); $result = $tester_dh->set_student($user_id, $user_dataAr, $extraTableName, $userObj); if ($userObj->hasExtra()) { if (method_exists('ADAUser', 'getExtraTableName')) { $tableName = ADAUser::getExtraTableName(); if (strlen($tableName) > 0) { $tester_dh->set_student($user_id, $user_dataAr, $tableName, $userObj); } } if (method_exists('ADAUser', 'getLinkedTables')) { $linkedTables = ADAUser::getLinkedTables(); if (is_array($linkedTables) && count($linkedTables) > 0) { foreach ($linkedTables as $tableName) { // force the record to be saved in the provider we're adding the user if (isset($user_dataAr[$tableName]) && is_array($user_dataAr[$tableName])) { foreach ($user_dataAr[$tableName] as $i => $notused) { $storedID = $user_dataAr[$tableName][$i][$tableName::getKeyProperty()]; $user_dataAr[$tableName][$i][$tableName::getKeyProperty()] = 0; $user_dataAr[$tableName][$i]['_isSaved'] = 0; $result = $tester_dh->set_student($user_id, $user_dataAr, $tableName, $userObj, $storedID); if (!AMA_DB::isError($result)) { $user_dataAr[$tableName][$i]['_isSaved'] = 1; } } //$result = $tester_dh->set_student($user_id,$user_dataAr, $tableName, $userObj, $storedID); } } } } } break; case AMA_TYPE_AUTHOR: $result = $tester_dh->add_author($user_dataAr); break; case AMA_TYPE_SUPERTUTOR: case AMA_TYPE_TUTOR: $result = $tester_dh->add_tutor($user_dataAr); break; case AMA_TYPE_SWITCHER: $result = $tester_dh->add_user($user_dataAr); break; case AMA_TYPE_ADMIN: $result = $tester_dh->add_user($user_dataAr); break; } if (AMA_DataHandler::isError($result)) { //return ADA_SET_USER_ERROR_TESTER_ASSOCIATION; } } /* * If the user has subscribed to at least one tester, add the user * to the utente_tester table in common database. */ foreach ($testers_to_add as $tester_to_add) { $testerHa = $common_dh->get_tester_info_from_pointer($tester_to_add); $tester_id = $testerHa[0]; $res = $common_dh->add_user_to_tester($user_id, $tester_id); if (AMA_DataHandler::isError($res)) { if ($res->code != AMA_ERR_ADD and $res->code != AMA_ERR_UNIQUE_KEY) { //return ADA_SET_USER_ERROR_TESTER; return false; } } else { $userObj->addTester($tester_to_add); } } if (isset($result)) { return $result; } }