[pLog-svn] r4103 - in plog/branches/lifetype-1.1.1: class/dao/userdata config

oscar at devel.lifetype.net oscar at devel.lifetype.net
Sun Oct 8 20:25:06 GMT 2006


Author: oscar
Date: 2006-10-08 20:25:04 +0000 (Sun, 08 Oct 2006)
New Revision: 4103

Added:
   plog/branches/lifetype-1.1.1/class/dao/userdata/joomlauserdataprovider.class.php
Modified:
   plog/branches/lifetype-1.1.1/config/userdata.properties.php
Log:
Finally added the Joomla user data provider


Added: plog/branches/lifetype-1.1.1/class/dao/userdata/joomlauserdataprovider.class.php
===================================================================
--- plog/branches/lifetype-1.1.1/class/dao/userdata/joomlauserdataprovider.class.php	2006-10-08 08:43:13 UTC (rev 4102)
+++ plog/branches/lifetype-1.1.1/class/dao/userdata/joomlauserdataprovider.class.php	2006-10-08 20:25:04 UTC (rev 4103)
@@ -0,0 +1,472 @@
+<?php
+
+    include_once( PLOG_CLASS_PATH."class/dao/userdata/baseuserdataprovider.class.php" );
+    include_once( PLOG_CLASS_PATH."class/database/db.class.php" );
+    
+    define( "JOOMLA_USER_IS_BLOCKED", 1);
+    define( "JOOMLA_USER_IS_ACTIVE", 0);
+    define( "JOOMLA_SITE_ADMIN", "Super Administrator");
+    
+    
+    /**
+     * Model representing the users in our application. Provides the methods such as
+     * authentication and querying for users.
+	 *
+	 * \ingroup User_Data_Providers
+     */
+     
+    class JoomlaUserDataProvider extends BaseUserDataProvider
+    //Based on phpbb2userdataprovider.class.php
+    {
+	    var $_db;
+	    var $_joomladbprefix;
+	    var $_joomlaauxtable;
+	    var $_blogtitle_postfix;
+
+        /**
+         * Initializes the model
+         */
+        function JoomlaUserDataProvider( $providerConfig )
+        {
+            $this->BaseUserDataProvider( $providerConfig );
+			
+            //*** Temporarily disabled for causing a fatal error ***/
+            // disable all caching for userdata
+            //CacheManager::disableCache( CACHE_USERINFO );
+            
+            // initialize the database connection based on our parameters
+            $config = $this->getProviderConfiguration();
+            $user = $config->getValue( "user" );
+            $pass = $config->getValue( "password" );
+            $host = $config->getValue( "host" );
+            $db = $config->getValue( "database" );
+            $this->_joomladbprefix = $config->getValue( "prefix" );
+            $this->_blogtitle_postfix = $config->getValue( "blogtitle_postfix" );
+            //phpbb2_users table is created upon installation, we can use it for joomla too
+            //but better parameterize its name
+            $this->_joomlaauxtable="joomla_users";
+
+            $this->_dbc =& Db::getNewDb( $host, $user, $pass, $db );                     
+            
+            //Oddly, there have been problems in reading Joomla! db in utf-8
+            //Setting explicitly connection charset has fixed them
+			$dbcharset = $config->getValue( "dbcharset" );
+        	$query = "SET NAMES '".$dbcharset."';";
+            $result = $this->_dbc->Execute( $query );
+                   
+            
+        }
+
+        /**
+         * Returns true if the user is in the database and the username
+         * and password match
+         *
+         * @param user Username of the user who we'd like to authenticate
+         * @param pass Password of the user
+         * @return true if user and password correct or false otherwise.
+         */
+        function authenticateUser( $user, $pass )
+        {
+	        $query = "SELECT * FROM ".$this->_joomladbprefix."users".
+	        			" WHERE username = '".$user."'".
+	        			" AND password = '".md5($pass)."'".
+	        			" AND block=".JOOMLA_USER_IS_ACTIVE;
+	        			
+	        $result = $this->_dbc->Execute( $query );
+	        	        
+	        if( !$result ){
+		        $this->log->debug("Joomla: User".$user." has failed to authenticate..." );
+	        	return false;
+        	}
+	        	
+            $ret = ($result->RecordCount() == 1);
+            $result->Close();
+
+            if($ret)
+                return true;
+            else{
+	            $this->log->debug("Joomla: User ".$user." has no entrys in joomla db" );
+                return false;    	
+            }
+        }
+
+        /**
+         * Returns all the information associated to the user given
+         *
+         * @param user Username of the user from who we'd like to get the information
+         * @param pass Password of the user we'd like to get the information
+         * @return Returns a UserInfo object with the requested information, or false otherwise.
+         */
+        function getUserInfo( $user, $pass )
+        {
+        	//Query Joomla db
+	        $query = "SELECT * FROM ".$this->_joomladbprefix."users".
+	        			" WHERE username = '".$user."'".
+	        			" AND password = '".md5($pass)."';".
+	                  
+	        $result = $this->_dbc->Execute( $query );
+	        
+	        if( !$result )
+	        	return false;
+	        	
+	        $row = $result->FetchRow();
+            $result->Close();
+            
+            $userid=$row["id"];
+                      	
+            $result->Close();
+            
+	        return( $this->_mapUserInfoObject( $row ));	        
+        }
+
+        /**
+         * Retrieves the user information but given only a username
+         *
+         * @param username The username of the user
+         * @return Returns a UserInfo object with the requested information, or false otherwise.
+         */
+        function getUserInfoFromUsername( $username )
+        {
+        	//Query Joomla table
+	        $query = "SELECT * FROM ".$this->_joomladbprefix."users WHERE username = '".Db::qstr( $username )."'";	       	       
+	                  
+	        $result = $this->_dbc->Execute( $query );
+	        
+	        if( !$result ){
+	        	return false;
+        	}
+	        		        	
+	        if( $result->RowCount() != 1 ){
+	        	$this->log->debug("Joomla: No data found for username $username or not unique record");
+                $result->Close();
+	        	return false;
+            }
+	        	
+	        $row = $result->FetchRow();
+            $result->Close();
+            
+            $userid=$row["id"];
+	        
+	        return( $this->_mapUserInfoObject( $row ));	        
+        }
+
+        /**
+         * Retrieves the user infromation but given only a userid
+         *
+         * @param userId User ID of the user from whom we'd like to get the information
+         * @return Returns a UserInfo object with the requested information, or false otherwise.
+         */
+        function getUserInfoFromId( $userid, $extendedInfo = false )
+        {
+	        include_once( PLOG_CLASS_PATH."class/dao/userpermissions.class.php" );
+	        
+	        $query = "SELECT * FROM ".$this->_joomladbprefix."users WHERE id = '".Db::qstr( $userid )."'";
+
+			//print("user__id = $userid");
+	                  
+	        $result = $this->_dbc->Execute( $query );
+	        
+	        if( !$result )
+	        	return false;
+	        	
+	        $row = $result->FetchRow();
+            $result->Close();
+	        
+	        return( $this->_mapUserInfoObject( $row ));
+        }
+        
+        function JoomlaAddBlog( $row )
+        {
+		    // create a new blog
+		    include_once( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
+            include_once( PLOG_CLASS_PATH."class/dao/articles.class.php" );
+            include_once( PLOG_CLASS_PATH."class/dao/articlecategories.class.php" );
+		    
+		    $blogs = new Blogs();
+		    $blog = new BlogInfo( $row["user"].$this->_blogtitle_postfix,  // name of the new blog
+		       	                  $row["id"],  // id of the owner
+		           	              "",  // no about
+		            	          ""); // no properties either
+		    $newBlogId = $blogs->addBlog( $blog );
+		     	    	     
+            // add a default category and a default post            
+            $articleCategories = new ArticleCategories();
+            $articleCategory = new ArticleCategory( "General", "", $newBlogId, true );
+            $catId = $articleCategories->addArticleCategory( $articleCategory );
+            $config =& Config::getConfig();
+            $locale =& Locales::getLocale( $config->getValue( "default_locale" ));
+            $articleTopic = $locale->tr( "register_default_article_topic" );
+            $articleText  = $locale->tr( "register_default_article_text" );
+            $article = new Article( $articleTopic, 
+                                    $articleText, 
+                                    Array( $catId ), 
+                                    $row["id"], 
+                                    $newBlogId, 
+                                    POST_STATUS_PUBLISHED, 
+                                    0, 
+                                    Array(), 
+                                    "welcome" );
+            $t = new Timestamp();
+            $article->setDateObject( $t );
+            $articles = new Articles();
+            $articles->addArticle( $article );	           
+        }
+        
+        /* Gets rows from Joomla user data table and auxiliary LT table and merges
+         * them into a single userInfo object
+         * 
+         * @param row Joomla user data table row, as fetched
+         * @param extraInfo Lifetype auxiliary table extra user data, as fetched
+         * @return userInfo object, as neede by LT 
+         */
+        function _mapUserInfoObject( $row, $extraInfo=false)
+        {
+	        include_once( PLOG_CLASS_PATH."class/dao/userpermissions.class.php" );
+	        
+	        $plogJoomlaData = $this->getpLogJoomlaUserData( $row["id"] );
+
+			//Data fetched from Joomla db
+	        //$row["id"] = $row["id"];   //no need to map
+	        $row["user"] = $row["username"];
+	        $row["password"] = $row["password"];
+	        $row["email"] = $row["email"];
+	        $row["full_name"] = $row["name"];
+	        $row["status"] = ($row["block"] != 1) ? USER_STATUS_ACTIVE : USER_STATUS_DISABLED;
+	        
+	        //Data fetched from auxiliary table
+	        //If no data fetched, these fields will be empty
+	        if(!$plogJoomlaData){
+		        $row["about"] = "";
+		        $row["resource_picture_id"] = 0;
+		        $row["properties"] = serialize(Array());
+	        } else {
+		        $row["about"] = $plogJoomlaData["about"];
+		        $row["resource_picture_id"] = $plogJoomlaData["resource_picture_id"];
+				if( $row["resource_picture_id"] == "" ) $plogJoomlaData["resource_picture_id"] = 0;
+		        $row["properties"] = serialize($plogJoomlaData["properties"]);
+	        }
+		        
+	        // If this is the first time user data is loaded on LT, Joomla Super administrator
+	        // will be an LT site admin as well.
+	        // Otherwise, get site admin status from auxiliary table	        
+	        if(!$plogJoomlaData){
+				$row["site_admin"] = ($row["usertype"]==JOOMLA_SITE_ADMIN);
+	        }   else {
+	        	$row["site_admin"] = $plogJoomlaData["blog_site_admin"];
+	        }    
+	        	        
+	       	// does this Joomla user have a blog yet? If so, create one if the configuration
+	        // of the user data provider says so
+	        $providerConfig = $this->getProviderConfiguration();
+	        if( $providerConfig->getValue( "createBlogIfNotExisting" )) {
+		        $userInfo = BaseUserDataProvider::mapRow( $row, true );
+		        // check if this user is assigned to any blog
+		        $userBlogs = $userInfo->getBlogs();
+		        $this->log->debug("Joomla: checking if user ".$row["user"]." has at least one blog..." );
+		        if( empty($userBlogs )) {
+			        $this->log->debug( "Joomla: creating new blog for user!" );
+			        $this->JoomlaAddBlog( $row );
+			        $userInfo->setBlogs( $this->getUsersBlogs( $userInfo->getId()));
+     			}
+				else {
+					$this->log->debug("he already has one!!!");
+				}
+	        }
+	        else {
+		        $userInfo = BaseUserDataProvider::mapRow( $row );
+	        }	        
+	        
+	        return( $userInfo );
+        }
+
+        /**
+         * Returns an array with all the users available in the database
+         *
+		 * @param status
+		 * @param includeExtraInfo
+         * @param page
+         * @param itemsPerPage
+         * @return An array containing all the users.
+         */
+        function getAllUsers( $status = USER_STATUS_ALL, $searchTerms = "", $page = -1, $itemsPerPage = DEFAULT_ITEMS_PER_PAGE )
+        {	        
+            $query = "SELECT * FROM ".$this->_joomladbprefix."users ORDER BY id ASC";
+
+            $result = $this->_dbc->Execute( $query, $page, $itemsPerPage );            
+
+            $users = Array();
+
+            while ($info = $result->FetchRow( $result )){
+                array_push( $users, $this->_mapUserInfoObject( $info ));
+            }
+            $result->Close();
+
+            return $users;	        	        
+        }
+
+        /**
+         * Updates the information related to a user
+         *
+         * @param userInfo An UserInfo object containing the <b>already udpated</b> information of the
+         * user we would like to update.
+         * @return Returns true if ok or false otherwise.
+         */
+        function updateUser( $userInfo )
+        {
+	        /* These should be accessible only from Joomla! */
+	        /*
+	        $query = "UPDATE ".$this->_joomladbprefix."users ".
+		        "SET username = '".Db::qstr($userInfo->getUserName()).
+		        "', password = '".Db::qstr(md5($userInfo->getPassword())).
+		        "', email = '".Db::qstr($userInfo->getEmail()).
+		        "', block = '".Db::qstr(($userInfo->getStatus()>USER_STATUS_ACTIVE)? JOOMLA_USER_IS_BLOCKED : JOOMLA_USER_IS_ACTIVE) .
+		        "'  WHERE id = ".Db::qstr($userInfo->getId());
+	                              
+            $result = $this->_dbc->Execute( $query );            
+            
+            if( !$result ){
+	            $this->log->debug("Error while updating joomla table. Query:\n".$query."\n" );
+            	return false;
+        	}
+            
+            BaseUserDataProvider::updateUser( $userInfo );
+            */
+            
+			// update plog's joomla_user table
+			$result = $this->updatepLogJoomlaUserData( $userInfo );
+
+			return( $result );
+        }
+        
+        /**
+         * Adds a user to the database.
+         *
+         * @param user An UserInfo object with the necessary information
+         * @return Returns the identifier assigned to the user, or false if there was any error. It will also modify the
+		 * UserInfo object passed by parameter and set its database id.
+         */
+        function addUser( &$user )
+        {	        
+	        /* 	User registration should be done via Joomla!/Mambo.*/
+        }
+        
+        /**
+         * @private
+         * Updates the plog-specific user data that is used when the joomla integration is enabled, since
+         * plog has some extra information that does not fit anywhere in joomla
+         *
+         * @param user A UserInfo object
+         * @return true if successful or false otherwise
+         */
+        function updatepLogJoomlaUserData( &$user )
+        {
+	    	// is the user already there?
+	    	if( $this->getpLogJoomlaUserData( $user->getId())) {
+		    	$this->log->debug("Joomla user ".$user->getUsername()." already exists! Running an UPDATE query..." );
+		    	// we need to run an UPDATE query...
+		    	$query = "UPDATE ".$this->getPrefix().$this->_joomlaauxtable.
+		    	         " SET about = '".Db::qstr( $user->getAboutMyself()).
+		    	         "', properties = '".Db::qstr( serialize($user->getProperties())).
+		    	         "', resource_picture_id = '".Db::qstr( $user->getPictureId()).
+		    	         "', blog_site_admin = ".(Db::qstr( $user->isSiteAdmin() ? "1" : "0")).
+		    	         "  WHERE joomla_id = ".Db::qstr( $user->getId());    
+	    	}
+	    	else {
+		    	// we need to run an INSERT query...	
+		    	$this->log->debug("Joomla user ".$user->getUsername()." does NOT exist yet! Running an INSERT query..." );
+		    	$query = "INSERT INTO ".$this->getPrefix().$this->_joomlaauxtable."(joomla_id, about, properties, blog_site_admin, resource_picture_id) ".
+		    			  " VALUES (".
+		    			  Db::qstr($user->getId()).",'".
+		    			  Db::qstr($user->getAboutMyself())."','".
+		    	          Db::qstr(serialize($user->getProperties()))."',".
+		    	          Db::qstr( $user->isSiteAdmin() ? "1" : "0").",'".
+		    	          Db::qstr($user->getPictureId())."')";
+	    	}
+	    	
+	    	$result = $this->Execute( $query );
+	    	
+			return( true );
+        }
+        
+        /**
+         * @private
+         * Load the plog-specific joomla user data
+         *
+         * @param userId
+         * @return A row with the extra user data or false otherwise
+         */
+        function getpLogJoomlaUserData( $userId )
+        {
+            
+	        $query = "SELECT * FROM ".$this->getPrefix().$this->_joomlaauxtable." WHERE joomla_id = '".Db::qstr($userId)."'";
+	        $result = $this->Execute( $query );
+	        
+	        if( !$result )
+	        	return false;
+	        	
+	        if( $result->RowCount() == 0 ){
+                $result->Close();
+                return false;
+            }
+
+            $ret = $result->FetchRow();
+            $result->Close();
+
+	        return $ret;
+        }
+        
+        /**
+         * Removes users from the database
+         *
+         * @param userId The identifier of the user we are trying to remove
+         */
+        function deleteUser( $userId )
+        {
+        }        
+
+        /**
+         * returns the total number of users
+         *
+         * @return total number of users
+         */
+        function getNumUsers( $status = USER_STATUS_ALL )
+        {
+	        //
+	        // :TODO:
+	        // add the status check here!
+	        //
+	        $query = "SELECT COUNT(id) AS total FROM ".$this->_joomladbprefix."users";
+	        
+	        $result = $this->_dbc->Execute( $query );
+	        
+	        // return no users if this doesn't work!
+	        if( !$result )
+	        	return 0;
+	        
+	        $row = $result->FetchRow();
+            $result->Close();
+	        
+	        if( $row["total"] == "" )
+	        	$row["total"] = 0;
+	        	
+	        return( $row["total"] );
+        }
+
+        /**
+         * check if the email account has been registered
+         * @return true if the email account has been registered
+         */
+        function emailExists($email)        
+        {
+	        $query = "SELECT * FROM ".$this->_joomladbprefix."users WHERE email = '".Db::qstr($email)."'";
+	        
+	        $result = $this->_dbc->Execute( $query );
+	        
+	        if( !$result )
+	        	return false;
+            $ret = ($result->RecordCount() > 0);
+            $result->Close();
+	        return $ret;
+        }
+    }
+?>

Modified: plog/branches/lifetype-1.1.1/config/userdata.properties.php
===================================================================
--- plog/branches/lifetype-1.1.1/config/userdata.properties.php	2006-10-08 08:43:13 UTC (rev 4102)
+++ plog/branches/lifetype-1.1.1/config/userdata.properties.php	2006-10-08 20:25:04 UTC (rev 4103)
@@ -69,7 +69,7 @@
   "provider" => "WBBUserDataProvider", 
   "createBlogIfNotExisting" => true, 
   
-  // PostNuke db connection 
+  // WBB2 connection 
   "host" => "localhost",                       //database server default: localhost 
   "database" => "",                            //database name 
   "user" => "",                                //database user 
@@ -80,4 +80,40 @@
 );
 */
 
+#
+# JOOMLA user data provider
+#
+#
+# Please run the following SQL query in your LifeType database,
+# as it is required by the provider
+#
+# CREATE TABLE `lt_joomla_users` (
+#  `id` int(10) unsigned NOT NULL auto_increment,
+#  `joomla_id` int(10) unsigned NOT NULL,
+#  `about` text,
+#  `properties` text NOT NULL,
+#  `resource_picture_id` int(10) NOT NULL default '0',
+#  `blog_site_admin` int(10) NOT NULL default '0',
+#  PRIMARY KEY  (`id`),
+#  UNIQUE KEY `joomla_id` (`joomla_id`)
+# ) ENGINE=MyISAM AUTO_INCREMENT=1 ;
+/*
+$config = Array( 
+  // general
+  "provider" => "JoomlaUserDataProvider",
+  "createBlogIfNotExisting" => true,
+
+  // Joomla db connection
+  "host" => "mysql_host",
+  "database" => "joomla_db",
+  "user" => "joomla_db_user",
+  "password" => "joomla_db_pass",
+  "prefix" => "jos_",
+
+  // This string gets appended to the username and results
+  // in "Username's Weblog"
+  "blogtitle_postfix" => "'s Weblog"
+);
+*/
+
 ?>



More information about the pLog-svn mailing list