* @copyright 2009 Deon George * @link http://osb.leenooks.net * * @link http://www.agileco.com/ * @copyright 2004-2008 Agileco, LLC. * @license http://www.agileco.com/agilebill/license1-4.txt * @author Tony Landis * @package AgileBill * @subpackage Core */ /** * The main AgileBill Search Class * * @package AgileBill * @subpackage Core */ class CORE_search { public $recent_js; public $recent_menu; public $saved_js; public $saved_menu; /** * Create a new search record. * * @param array Contains the elements of the search query * @return void * @since Version 1.0 */ public function add($arr) { $db = &DB(); # Determine the search id: $this->id = $db->GenID(AGILE_DB_PREFIX.'search_id'); # Create the search record $result = $db->Execute(sqlInsert($db,'search',array( 'session_id'=>SESS, 'account_id'=>SESS_ACCOUNT, 'module'=>$arr['module'], 'date_orig'=>time(), 'date_expire'=>(time()+(SEARCH_EXPIRE*60)), 'full_sql'=>$arr['sql'], 'order_by'=>$arr['order_by'], 'limit_no'=>$arr['limit'], 'results'=>$arr['results'] ),$this->id)); # Error reporting if (! $result) { global $C_debug; $C_debug->error(__FILE__,__METHOD__,$db->ErrorMsg()); } } /** * Retrieves a specific search record, and sets the values to the object. * * @param int Contians the Search Id to be retrieved * @return void * @since Version 1.0 * @todo Complete the search refresh feature */ public function get($id) { # Get the details for this search $db = &DB(); $result = $db->Execute(sqlSelect('search','*',array('where'=>array('id'=>$id)))); # Error reporting if (! $result) { global $C_debug; $C_debug->error(__FILE__,__METHOD__,$db->ErrorMsg()); } # Get the search values $this->id = $id; $this->account = $result->fields['account_id']; $this->session = $result->fields['session_id']; $this->date_orig = $result->fields['date_orig']; $this->date_expire = $result->fields['date_expire']; $this->sql = $result->fields['full_sql']; $this->order_by = $result->fields['order_by']; $this->limit = $result->fields['limit_no']; # Check if this search has expired: if ($this->date_expire <= time()) { # Refresh the search # $this->results = $this->refresh($id); # echo "
this search has expired! Refreshing....
"; $this->results = $result->fields['results']; } else { # Use the existing result count $this->results = $result->fields['results']; } return; } /** * Refreshes the result count of a specific search and stores the new results in the search record, * and returns the new search result count. * * @param int Contians the Search Id to be refreshed * @return int Contains the new search results count * @since Version 1.0 * @todo Complete the search refresh code * @return int The new search results count */ private function refresh($id) { } /** * Saves the current search for later retreival. * * @param string Contains search nickname to remember this search as * @return void * @since Version 1.0 * @todo Add some error checking for previously used nicknames, identical searches, etc. * @param int Contians the Search Id to be saved * @param string Contains the name of the Module this search was for */ public function save($search_id,$module,$name) { # Save the search $db = &DB(); # Determine the search id: $this->id = $db->GenID('search_saved'); $result = $db->Execute(sqlInsert($db,'search_saved',array( 'search_id'=>$search_id, 'account_id'=>SESS_ACCOUNT, 'session_id'=>SESS, 'date_orig'=>time(), 'date_last'=>time(), 'date_expire'=>'', 'module'=>$module, 'name'=>$name ),$this->id)); # Error reporting if (! $result) { global $C_debug; $C_debug->error(__FILE__,__METHOD__,$db->ErrorMsg()); } } /** * Build the recent search menu and JavaScript * * @param string Contains the name of the Module to find recent searches for * @return void * @since Version 1.0 */ function build_recent($module) { # Disable for now return 0; if(isset($this->arr)) unset ($this->arr); # Get the recent searches $db = &DB(); $q = "SELECT id, date_orig, date_expire, full_sql, order_by, limit_no FROM " . AGILE_DB_PREFIX . "search WHERE session_id = '" . SESS . "' OR account_id = '" . SESS_ACCOUNT . "' AND module = '$module' AND date_expire >= '" . time() . "' AND site_id = '" . DEFAULT_SITE . "'"; $result = $db->Execute($q); # Error reporting if ($result === false) { global $C_debug; $C_debug->error(__FILE__,__METHOD__,$db->ErrorMsg()); } $results = $result->RecordCount(); $i = 0; while (!$result->EOF) { # Get the fields for this loop $sql = $result->fields['full_sql']; # Remove the WHERE $sql = trim($sql); $sql = eregi_replace("WHERE","",$sql); $sql = eregi_replace("AND$","",$sql); $sql = trim($sql); # Replace any sql statements before we split the string $sql = ereg_replace(" = ","===",$sql); $sql = ereg_replace(" LIKE ","===",$sql); # Determine the number of fields $ii=0; if(ereg(" AND ", $sql)) { $sql = explode(" AND ",$sql); $this_fields = count($sql); # Loop for($count=0; $count < $this_fields; $count++) { # Do each field $sqls = explode("==",$sql[$count]); $field[$count][name] = $sqls[0]; $field[$count][value] = ereg_replace("'","",$sqls[1]); $field[$count][value] = ereg_replace("=","",$field[$count][value]); # Check that the name & value are both set... if($field[$count][value] != '' && $field[$count][name] != '') { if(!isset($this->arr[$i][$ii][limit])) { $this->arr[$i][$ii][search] = $result->fields['id']; $this->arr[$i][$ii][limit] = $result->fields['limit_no']; $this->arr[$i][$ii][order] = $result->fields['order_by']; } $this->arr[$i][$ii][0] = $field[$count][name]; $this->arr[$i][$ii][1] = $field[$count][value]; # echo "

Field/Name: " . $this->arr[$i][$ii][0] . " -> " . $this->arr[$i][$ii][1]; $ii++; # Set the menu up for Smarty $this->recent_menu[$i] = $result->fields; } } } else { # Field count $this_fields = 1; # Do this one field $sqls = explode("==",$sql); $field[name] = $sqls[0]; $field[value] = ereg_replace("'","",$sqls[1]); $field[value] = ereg_replace("=","",$field[value]); # Check that the name & value are both set... if($field[value] != '' && $field[name] != '') { if(!isset($this->arr[$i][$ii][limit])) { $this->arr[$i][$ii][search] = $result->fields['id']; $this->arr[$i][$ii][limit] = $result->fields['limit_no']; $this->arr[$i][$ii][order] = $result->fields['order_by']; } $this->arr[$i][$ii][0] = $field[name]; $this->arr[$i][$ii][1] = $field[value]; # echo "

Field/Name: " . $field[name] . " -> " . $field[value]; $ii++; # Set the menu up for Smarty $this->recent_menu[$i] = $result->fields; } } # Continue loop $result->MoveNext(); if ($ii > 0) $i++; } # Finish the JS: if($i > 0 && $ii > 0) { # Build the JavaScript $this->recent_js = ' "; } else { $this->recent_js = FALSE; } } # End of functino /** * Build the saved search menu and JavaScript * * @param string Contains the name of the Module to find saved searches for * @return void * @since Version 1.0 */ function build_saved($module) { # Disable for now return 0; if(isset($this->arr)) unset ($this->arr); # Get the saved searches # Get the recent searches $db1 = &DB(); $q = "SELECT id, search_id, name FROM " . AGILE_DB_PREFIX . "search_saved WHERE session_id = '" . SESS . "' OR account_id = '" . SESS_ACCOUNT . "' AND module = '$module' AND site_id = '" . DEFAULT_SITE . "' ORDER BY name ASC"; $result1 = $db1->Execute($q); # Error reporting if ($result1 === false) { global $C_debug; $C_debug->sql_error($db1->ErrorMsg()); } $i=0; while (!$result1->EOF) { # Get the information for this search $db = &DB(); $q = "SELECT id, full_sql, order_by, limit_no FROM " . AGILE_DB_PREFIX . "search WHERE id = '" . $result1->fields['search_id'] . "' AND site_id = '" . DEFAULT_SITE . "'"; $result = $db->Execute($q); # Error reporting if ($result === false) { global $C_debug; $C_debug->error(__FILE__,__METHOD__,$db->ErrorMsg()); } # Get the fields for this loop $sql = $result->fields['full_sql']; # Remove the WHERE $sql = trim($sql); $sql = eregi_replace("WHERE","",$sql); $sql = eregi_replace("AND$","",$sql); $sql = trim($sql); # Replace any sql statements before we split the string $sql = ereg_replace(" = ","===",$sql); $sql = ereg_replace(" LIKE ","===",$sql); # Determine the number of fields $ii=0; if(ereg(" AND ", $sql)) { $sql = explode(" AND ",$sql); $this_fields = count($sql); # Loop for($count=0; $count < $this_fields; $count++) { # Do each field $sqls = explode("==",$sql[$count]); $field[$count][name] = $sqls[0]; $field[$count][value] = ereg_replace("'","",$sqls[1]); $field[$count][value] = ereg_replace("=","",$field[$count][value]); # Check that the name & value are both set... if($field[$count][value] != '' && $field[$count][name] != '') { if(!isset($this->arr[$i][$ii][limit])) { $this->arr[$i][$ii][search] = $result->fields['id']; $this->arr[$i][$ii][limit] = $result->fields['limit_no']; $this->arr[$i][$ii][order] = $result->fields['order_by']; } $this->arr[$i][$ii][0] = $field[$count][name]; $this->arr[$i][$ii][1] = $field[$count][value]; # echo "

Field/Name: " . $this->arr[$i][$ii][0] . " -> " . $this->arr[$i][$ii][1]; $ii++; $this->saved_menu[$i] = $result->fields; $this->saved_menu[$i]["name"] = $result1->fields["name"]; } } } else { # Field count $this_fields = 1; # Do this one field $sqls = explode("==",$sql); $field[name] = $sqls[0]; $field[value] = ereg_replace("'","",$sqls[1]); $field[value] = ereg_replace("=","",$field[value]); # Check that the name & value are both set... if($field[value] != '' && $field[name] != '') { if(!isset($this->arr[$i][$ii][limit])) { $this->arr[$i][$ii][search] = $result->fields['id']; $this->arr[$i][$ii][limit] = $result->fields['limit_no']; $this->arr[$i][$ii][order] = $result->fields['order_by']; } $this->arr[$i][$ii][0] = $field[name]; $this->arr[$i][$ii][1] = $field[value]; # echo "

Field/Name: " . $field[name] . " -> " . $field[value]; $ii++; # Set the menu up for Smarty $this->saved_menu[$i] = $result->fields; $this->saved_menu[$i]["name"] = $result1->fields["name"]; } } $result1->MoveNext(); if ($ii > 0) $i++; } # Finish the JS: if($i > 0 && $ii > 0) { # Build the JavaScript $this->saved_js = ' "; } else { $this->saved_js = FALSE; } } } ?>