From 428f13602500ee8408161c0126456f8bfe229472 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Tue, 1 Jul 2008 11:30:16 +0000 Subject: [PATCH] Now we really have ship-simu specific user/member classes --- .../main/login/class_ShipSimuUserLogin.php | 5 +- .../main/user/class_ShipSimuGuest.php | 98 ++++++++++- .../main/user/class_ShipSimuMember.php | 165 +++++++++++++++++- .../class_UserUnconfirmedVerifierFilter.php | 5 +- inc/classes/main/user/guest/class_Guest.php | 12 +- inc/classes/main/user/member/class_Member.php | 8 +- 6 files changed, 268 insertions(+), 25 deletions(-) diff --git a/application/ship-simu/main/login/class_ShipSimuUserLogin.php b/application/ship-simu/main/login/class_ShipSimuUserLogin.php index 7ca65d2..eced73d 100644 --- a/application/ship-simu/main/login/class_ShipSimuUserLogin.php +++ b/application/ship-simu/main/login/class_ShipSimuUserLogin.php @@ -84,8 +84,11 @@ class ShipSimuUserLogin extends BaseFrameworkSystem implements LoginableUser { // Is there an instance? if (is_null($userInstance)) { + // Get member class + $userClass = $this->getConfigInstance()->readConfig('user_class'); + // Get a user instance - $userInstance = Member::createMemberByRequest($requestInstance); + $userInstance = call_user_func_array(array($userClass, 'createMemberByRequest'), array($requestInstance)); // Remember this new instance in registry Registry::getRegistry()->addInstance($userInstance); diff --git a/application/ship-simu/main/user/class_ShipSimuGuest.php b/application/ship-simu/main/user/class_ShipSimuGuest.php index 1f6edc3..a410917 100644 --- a/application/ship-simu/main/user/class_ShipSimuGuest.php +++ b/application/ship-simu/main/user/class_ShipSimuGuest.php @@ -1,6 +1,6 @@ * @version 0.0.0 @@ -21,18 +21,106 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class ShipSimuGuest extends Guest { +class ShipSimuGuest extends BaseUser implements ManageableGuest, Registerable { + // Exceptions + const EXCEPTION_USERNAME_NOT_FOUND = 0x170; + const EXCEPTION_USER_EMAIL_NOT_FOUND = 0x171; + const EXCEPTION_USER_PASS_MISMATCH = 0x172; + /** * Protected constructor * + * @param $className Name of the class * @return void */ - protected function __construct () { + protected function __construct ($className = "") { + // Is the class name empty? Then this is not a specialized user class + if (empty($className)) $className = __CLASS__; + // Call parent constructor - parent::__construct(__CLASS__); + parent::__construct($className); // Set part description - $this->setObjectDescription("Special guest class for Ship-Simu"); + $this->setObjectDescription("Special ship-simu class"); + + // Create unique ID number + $this->generateUniqueId(); + } + + /** + * Creates an instance of this user class by a provided username. This + * factory method will check if the username is already taken and if not + * so it will throw an exception. + * + * @param $userName Username we need a class instance for + * @return $userInstance An instance of this user class + * @throws UsernameMissingException If the username does not exist + */ + public final static function createGuestByUsername ($userName) { + // Get a new instance + $userInstance = new ShipSimuGuest(); + + // Set the username + $userInstance->setUserName($userName); + + // Check if the username exists + if (!$userInstance->ifUsernameExists()) { + // Throw an exception here + throw new UsernameMissingException(array($userInstance, $userName), self::EXCEPTION_USERNAME_NOT_FOUND); + } + + // Return the instance + return $userInstance; + } + + /** + * Creates an instance of this user class by a provided email address. This + * factory method will not check if the email address is there. + * + * @param $email Email address of the user + * @return $userInstance An instance of this user class + */ + public final static function createGuestByEmail ($email) { + // Get a new instance + $userInstance = new ShipSimuGuest(); + + // Set the username + $userInstance->setEmail($email); + + // Return the instance + return $userInstance; + } + + /** + * Updates the last activity timestamp and last performed action in the + * database result. You should call flushPendingUpdates() to flush these updates + * to the database layer. + * + * @param $requestInstance A requestable class instance + * @return void + */ + public function updateLastActivity (Requestable $requestInstance) { + // No activity will be logged for guest accounts + } + + /** + * Flushs all pending updates to the database layer + * + * @return void + */ + public function flushPendingUpdates () { + // No updates will be flushed to database! + } + + /** + * Adds data for later complete update + * + * @param $column Column we want to update + * @param $value New value to store in database + * @return void + */ + public function addUpdateData ($column, $value) { + // Nothing shall be updated by user him/her self } } diff --git a/application/ship-simu/main/user/class_ShipSimuMember.php b/application/ship-simu/main/user/class_ShipSimuMember.php index b62c7d3..531e8c7 100644 --- a/application/ship-simu/main/user/class_ShipSimuMember.php +++ b/application/ship-simu/main/user/class_ShipSimuMember.php @@ -1,6 +1,6 @@ * @version 0.0.0 @@ -21,18 +21,175 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class ShipSimuMember extends Member { +class ShipSimuMember extends BaseUser implements ManageableMember, Registerable, Updateable { /** * Protected constructor * + * @param $className Name of the class * @return void */ - protected function __construct () { + protected function __construct ($className = "") { + // Is the class name empty? Then this is not a specialized user class + if (empty($className)) $className = __CLASS__; + // Call parent constructor - parent::__construct(__CLASS__); + parent::__construct($className); // Set part description $this->setObjectDescription("Special member class for Ship-Simu"); + + // Create unique ID number + $this->generateUniqueId(); + } + + /** + * Destructor to always flush updates + * + * @return void + */ + public function __destruct () { + // Flush any updated entries to the database + $this->flushPendingUpdates(); + + // Call parent destructor + parent::__destruct(); + } + + /** + * Creates an instance of this user class by a provided username. This + * factory method will check if the username is already taken and if not + * so it will throw an exception. + * + * @param $userName Username we need a class instance for + * @return $userInstance An instance of this user class + * @throws UsernameMissingException If the username does not exist + */ + public final static function createMemberByUsername ($userName) { + // Get a new instance + $userInstance = new ShipSimuMember(); + + // Set the username + $userInstance->setUserName($userName); + + // Check if the username exists + if (!$userInstance->ifUsernameExists()) { + // Throw an exception here + throw new UsernameMissingException(array($userInstance, $userName), self::EXCEPTION_USERNAME_NOT_FOUND); + } + + // Return the instance + return $userInstance; + } + + /** + * Creates an instance of this user class by a provided email address. This + * factory method will not check if the email address is there. + * + * @param $email Email address of the user + * @return $userInstance An instance of this user class + */ + public final static function createMemberByEmail ($email) { + // Get a new instance + $userInstance = new ShipSimuMember(); + + // Set the username + $userInstance->setEmail($email); + + // Return the instance + return $userInstance; + } + + /** + * Creates a user by a given request instance + * + * @param $requestInstance An instance of a Requestable class + * @return $userInstance An instance of this user class + */ + public final static function createMemberByRequest (Requestable $requestInstance) { + // Determine if by email or username + if (!is_null($requestInstance->getRequestElement('username'))) { + // Username supplied + $userInstance = self::createMemberByUserName($requestInstance->getRequestElement('username')); + } elseif (!is_null($requestInstance->getRequestElement('email'))) { + // Email supplied + $userInstance = self::createMemberByEmail($requestInstance->getRequestElement('email')); + } else { + // Unsupported mode + $userInstance = new ShipSimuMember(); + $userInstance->partialStub("We need to add more ways of creating user classes here."); + $userInstance->debugBackTrace(); + exit(); + } + + // Return the prepared instance + return $userInstance; + } + + /** + * Adds data for later complete update + * + * @param $column Column we want to update + * @param $value New value to store in database + * @return void + * @deprecated + */ + public function addUpdateData ($column, $value) { + $this->deprecatedMethod("Please use updateDatabaseField() instead!"); + $this->updateDatabaseField($column, $value); + } + + /** + * Updates the last activity timestamp and last performed action in the + * database result. You should call flushPendingUpdates() to flush these updates + * to the database layer. + * + * @param $requestInstance A requestable class instance + * @return void + */ + public function updateLastActivity (Requestable $requestInstance) { + // Set last action + $lastAction = $requestInstance->getRequestElement('action'); + + // If there is no action use the default on + if (is_null($lastAction)) { + $lastAction = $this->getConfigInstance()->readConfig('login_default_action'); + } // END - if + + // Get a critieria instance + $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); + + // Add search criteria + $searchInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_USERNAME, $this->getUserName()); + $searchInstance->setLimit(1); + + // Now get another criteria + $updateInstance = ObjectFactory::createObjectByConfiguredName('update_criteria_class'); + + // And add our both entries + $updateInstance->addCriteria('last_activity', date("Y-m-d H:i:s", time())); + $updateInstance->addCriteria('last_action', $lastAction); + + // Add the search criteria for searching for the right entry + $updateInstance->setSearchInstance($searchInstance); + + // Remember the update in database result + $this->getResultInstance()->add2UpdateQueue($updateInstance); + } + + /** + * Flushs all pending updates to the database layer + * + * @return void + */ + public function flushPendingUpdates () { + // Do we have data to update? + if ($this->getResultInstance()->ifDataNeedsFlush()) { + // Get a database wrapper + $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper_class'); + + // Yes, then send the whole result to the database layer + $wrapperInstance->doUpdateByResult($this->getResultInstance()); + } // END - if } } diff --git a/inc/classes/main/filter/verifier/class_UserUnconfirmedVerifierFilter.php b/inc/classes/main/filter/verifier/class_UserUnconfirmedVerifierFilter.php index a86505a..b2fc520 100644 --- a/inc/classes/main/filter/verifier/class_UserUnconfirmedVerifierFilter.php +++ b/inc/classes/main/filter/verifier/class_UserUnconfirmedVerifierFilter.php @@ -59,8 +59,11 @@ class UserUnconfirmedVerifierFilter extends BaseFrameworkSystem implements Filte * @return void */ public function execute (Requestable $requestInstance, Responseable $responseInstance) { + // Get member class + $userClass = $this->getConfigInstance()->readConfig('user_class'); + // Get a user instance for comparison - $userInstance = Member::createMemberByRequest($requestInstance); + $userInstance = call_user_func_array(array($userClass, 'createMemberByRequest'), array($requestInstance)); // Is the email address valid? if (!$userInstance->ifEmailAddressExists()) { diff --git a/inc/classes/main/user/guest/class_Guest.php b/inc/classes/main/user/guest/class_Guest.php index 2058a24..ebaf508 100644 --- a/inc/classes/main/user/guest/class_Guest.php +++ b/inc/classes/main/user/guest/class_Guest.php @@ -30,18 +30,14 @@ class Guest extends BaseUser implements ManageableGuest, Registerable { /** * Protected constructor * - * @param $className Name of the class * @return void */ - protected function __construct ($className = "") { - // Is the class name empty? Then this is not a specialized user class - if (empty($className)) $className = __CLASS__; - + protected function __construct () { // Call parent constructor - parent::__construct($className); + parent::__construct(__CLASS__); // Set part description - $this->setObjectDescription("Generic user class"); + $this->setObjectDescription("Generic guest class"); // Create unique ID number $this->generateUniqueId(); @@ -82,7 +78,7 @@ class Guest extends BaseUser implements ManageableGuest, Registerable { */ public final static function createGuestByEmail ($email) { // Get a new instance - $userInstance = new User(); + $userInstance = new Guest(); // Set the username $userInstance->setEmail($email); diff --git a/inc/classes/main/user/member/class_Member.php b/inc/classes/main/user/member/class_Member.php index a71c746..eb633e4 100644 --- a/inc/classes/main/user/member/class_Member.php +++ b/inc/classes/main/user/member/class_Member.php @@ -25,15 +25,11 @@ class Member extends BaseUser implements ManageableMember, Registerable, Updatea /** * Protected constructor * - * @param $className Name of the class * @return void */ - protected function __construct ($className = "") { - // Is the class name empty? Then this is not a specialized user class - if (empty($className)) $className = __CLASS__; - + protected function __construct () { // Call parent constructor - parent::__construct($className); + parent::__construct(__CLASS__); // Set part description $this->setObjectDescription("Generic user class"); -- 2.30.2