$prev_page,
$next_page,
$first_page;
-
+
var $page_len,
$rec_count;
-
- var $select,
- $where,
- $from,
- $group,
- $order;
+
+ var $order = array();
+
var $extra_where;
var $ready = false; // this var is false after change in sql before first
if ($sql != $this->sql) {
$this->sql = $sql;
$this->ready = false;
- $parts = preg_split('/\sORDER\s*BY\s/si', $sql, 2);
- if(count($parts) == 2) {
- $sql = $parts[0];
- $this->order = $parts[1];
- }
- $parts = preg_split('/\sGROUP\s*BY\s/si', $sql, 2);
- if(count($parts) == 2) {
- $sql = $parts[0];
- $this->group = $parts[1];
- }
- $parts = preg_split('/\sWHERE\s/si', $sql, 2);
- if(count($parts) == 2) {
- $sql = $parts[0];
- $this->where = $parts[1];
- }
- $parts = preg_split('/\sFROM\s/si', $sql, 2);
- if(count($parts) == 2) {
- $sql = $parts[0];
- $this->from = $parts[1];
- }
- $this->select = $sql;
}
}
//
$ord = $this->columns[$col]['ord'];
$ord = ($ord == '') ? 'asc' : (($ord == 'asc') ? 'desc' : '');
$this->columns[$col]['ord'] = $ord;
+ $n = array_search($col, $this->order);
+ if ($n !== false)
+ unset($this->order[$n]);
+ if ($ord != '')
+ array_unshift($this->order, $col); // store column number as first
$this->set_page(1);
$this->query();
+
return true;
}
//
} else
return false;
return true;
- }
+ }
//
// Calculates page numbers for html controls.
//
// $flds: array( fldname1, fldname2=>type,...)
function set_columns($flds)
{
- $this->columns = array();
+ $this->columns = $this->order = array();
if (!is_array($flds)) {
$flds = array($flds);
}
case 'skip': // skip the column (no header)
unset($c['head']); break;
}
- $this->columns[] = $c;
+ if (@$c['ord'])
+ array_push($this->order, count($this->columns));
+ $this->columns[] = $c;
}
}
//
//
function _sql_gen($count=false)
{
- $select = $this->select;
- $from = $this->from;
- $where = $this->where;
- $group = $this->group;
- $order = $this->order;
-
- if(count($this->extra_where)) {
- $where .= ($where=='' ? '' : ' AND ')
- .implode(' AND ', $this->extra_where);
- }
- if ($where) $where = " WHERE ($where)";
- if ($count) {
- $group = $group == '' ? "*" : "DISTINCT $group";
+ if (count($this->extra_where)) {
+ $where = ' WHERE ('.implode(' AND ', $this->extra_where).')';
+ } else
+ $where = '';
+
+ if ($count)
+ return "SELECT COUNT(*) FROM ($this->sql) $where AS _dummyname";
- return "SELECT COUNT($group) FROM $from $where";
- }
- $sql = "$select FROM $from $where";
- if ($group) $sql.= " GROUP BY $group";
$ord = array();
- foreach ($this->columns as $col) {
+ $sql = "SELECT * FROM ($this->sql) $where AS _dummyname";
+
+ foreach ($this->order as $n) {
+ $col = $this->columns[$n];
if (isset($col['ord'])) {
if ( $col['ord'] != '' && isset($col['name'])) {
$ord[] = $col['name'] .' '. $col['ord'];
}
}
}
-
if (count($ord)) {
$sql .= " ORDER BY " . implode($ord, ',');
- } else {
- if($order)
- $sql .= " ORDER BY $order"; // original base query order
}
$page_len = $this->page_len;
$offset = ($this->curr_page - 1) * $page_len;
+
$sql .= " LIMIT $offset, $page_len";
return $sql;
-
+
}
//
// Initialization after changing record set
function _init()
{
global $go_debug;
-
+
if ($this->ready == false ) {
$sql = $this->_sql_gen(true);
$result = db_query($sql, 'Error reading record set');
$this->rec_count = $row[0];
$this->max_page = $this->page_len ?
ceil($this->rec_count/$this->page_len) : 0;
-
+
if ($go_debug) { // FIX - need column name parsing, but for now:
// check if field names are set explicite in col def
// for all initially ordered columns
if (isset($col['ord']) && $col['ord'] != ''
&& !isset($col['name'])) {
display_warning("Result field names must be set
- for all intially ordered db_pager columns.");
+ for all initially ordered db_pager columns.");
}
}
}
// return inactive_control_cell($row[$this->inactive_ctrl['key']],
// $row['inactive'], $this->inactive_ctrl['table'],
// $this->inactive_ctrl['key']);
-
+
global $Ajax;
$key = $this->key ?