------------------------------------------------------------
revno: 854
committer: Roger Martin <[email protected]>
branch nick: aikiframework
timestamp: Wed 2011-06-15 23:55:03 +0200
message:
  widgets. add records_num metho
modified:
  src/libs/widgets.php


--
lp:aikiframework
https://code.launchpad.net/~aikiframework-devel/aikiframework/trunk

Your team Aiki Framework Developers is subscribed to branch lp:aikiframework.
To unsubscribe from this branch go to 
https://code.launchpad.net/~aikiframework-devel/aikiframework/trunk/+edit-subscription
=== modified file 'src/libs/widgets.php'
--- src/libs/widgets.php	2011-06-15 20:00:09 +0000
+++ src/libs/widgets.php	2011-06-15 21:55:03 +0000
@@ -525,44 +525,13 @@
 				$widget->normal_select = 
 					$aiki->processVars ($aiki->languages->L10n(
 											"$widget->normal_select"));
-
-				// Support DISTINCT selection
-				preg_match('/select DISTINCT(.*)from/si', 
-						   $widget->normal_select, $get_DISTINCT);
-
-				preg_match('/^select(.*) from /Usi', 
-						   $widget->normal_select, $selectionmatch);
-
-                if ( isset($selectionmatch['1']))
-				{
-                    if ( stripos($widget->normal_select," GROUP BY ") || 
-                         stripos($widget->normal_select," LIMIT" )) {
-                        // with GROUP or LIMIT clausule must do a query
-                        $db->get_results($widget->normal_select);
-                        $records_num= $db->num_rows;                
-                    } else {
-                        if (isset ($get_DISTINCT['1'])){
-                            $mysql_count = ' count(DISTINCT('.$get_DISTINCT['1'].')) ';
-                        }else{  
-                            $mysql_count = ' count(*) ';
-                        }
-                        $records_num_query = preg_replace (
-                            "/^select.* from /Usi",
-                            "SELECT $mysql_count FROM ",
-							$widget->normal_select);
-                        $records_num_query = preg_replace(
-							'/ORDER BY(.*)(DESC|ASC)?/i', '', 
-							 $records_num_query);
-                        $records_num = $db->get_var($records_num_query);
-                    }
-                }    
-
-				if (isset($records_num)) {
-					$widget->widget = str_replace("[records_num]", 
-					$records_num, $widget->widget);
-				} else {
-					$records_num = '';
-				}
+                
+				$records_num = $this->records_num( $widget->normal_select);  
+				if ( $records_num !== false ) {
+					$widget->widget = str_replace(
+						"[records_num]", 
+						$records_num, $widget->widget);
+				} 
 
 				// Default pages links settings.
 				$pagesgroup = 10;
@@ -1204,4 +1173,52 @@
 		return $widget;
 	} // end of inherent_widgets function
 
+
+    /*
+     * Counts number of records of a query.
+     * 
+     * Is used in pagination. Try to make a 'rapid' converting
+     * a SELECT .... FROM in a SELECT count(*) FROM..
+     * 
+     * @PARAM string $sql Query.
+     */
+
+	private function records_num($sql){
+		global $db;
+		
+		if ( !preg_match('/^select(.*) from /Usi', $sql, $select) ){
+			return false;
+		}
+						   
+		if ( stripos($sql," GROUP BY ") ||  stripos($sql," LIMIT" )) {
+			// with GROUP or LIMIT clausule must do a query 
+			$db->get_results($sql);
+			$records_num= $db->num_rows;            
+		} else {
+			// try made a substituion of all select field with count(*)
+			
+			// Support DISTINCT selection
+			if ( preg_match('/^select DISTINCT(.*) from/Usi', $sql, $distinct) ){
+				$mysql_count = ' count(DISTINCT({$distinc[1]})) ';
+			}else{  
+				$mysql_count = ' count(*) ';
+			}
+			$new_sql = preg_replace (
+				"/^select.* from /Usi",
+				"SELECT $mysql_count FROM ",
+				$sql);
+			
+			// if there is a unique ORDER BY, try remove it.	
+			if ( substr_count($new_sql,"ORDER BY")==1){	
+				$new_sql = preg_replace(
+					'/ORDER BY(.*) (DESC|ASC)$/Usi', '', 
+					$new_sql);
+			}	 
+			$records_num = $db->get_var($new_sql);
+		}
+		return $records_num;		
+	}	
+
+
+
 } // end of CreateLayout Class

_______________________________________________
Mailing list: https://launchpad.net/~aikiframework-devel
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~aikiframework-devel
More help   : https://help.launchpad.net/ListHelp

Reply via email to