Now we really have ship-simu specific user/member classes
authorRoland Häder <roland@mxchange.org>
Tue, 1 Jul 2008 11:30:16 +0000 (11:30 +0000)
committerRoland Häder <roland@mxchange.org>
Tue, 1 Jul 2008 11:30:16 +0000 (11:30 +0000)
application/ship-simu/main/login/class_ShipSimuUserLogin.php
application/ship-simu/main/user/class_ShipSimuGuest.php
application/ship-simu/main/user/class_ShipSimuMember.php
inc/classes/main/filter/verifier/class_UserUnconfirmedVerifierFilter.php
inc/classes/main/user/guest/class_Guest.php
inc/classes/main/user/member/class_Member.php

index 7ca65d2da16f8c757511972b76eaf339f29f9565..eced73d98f53ec54eb18aed803084eb5ec4fff30 100644 (file)
@@ -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);
index 1f6edc37ec8873f8bd75593f0ce07d89f8f00cca..a410917829c900182a1f2cd51616981feaabe3d4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * A special guest class for Ship-Simu!
+ * A special guest class for Ship-Simu
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0.0
  * You should have received a copy of the GNU General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
-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
        }
 }
 
index b62c7d3fd2f26a7a7409ab98e126b9ba5f7c9a05..531e8c7470b9029047af7299cd6fbfcc4b603ef0 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * A special member class for Ship-Simu!
+ * A special member class for Ship-Simu
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0.0
  * You should have received a copy of the GNU General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
-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
        }
 }
 
index a86505a094e797163d50545395cbce3daecd4251..b2fc520700b255764b283ac7512a866dadc2e713 100644 (file)
@@ -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()) {
index 2058a2409e868f0b583e68d7fc4862f7aacf8858..ebaf5086bbe3e74c0fe105490475f648ddff9cfa 100644 (file)
@@ -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);
index a71c746d4455b0460fe7464e000ec023bd96d506..eb633e4536ff548cd8fbc9c2716705516f1489b8 100644 (file)
@@ -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");