Yo también hace tiempo desarrolle un datagrid, pero lo llame gridview.
Una desventaja que yo le veo a tu grilla que es muy dependiente de una consulta
SQL, no seria mejor pasarle un datasource? ... así este solo se encargaría de mostrar la grilla sin importar de donde viene (mysql,oracle,mssql,xml,csv,txt,etc)
Adjunto mi grilla
Código PHP:
Ver original<?php
class GridView{
private $_ds;
private $_name;
private $_ClassName = '';
private $_columns = array(); private $_TColumns = array(); private $_WColumns = array();
private $_fields = array(); private $_actions = array(); private $_idAction = '';
private $_rows = 0;
private $_pager = 0;
private $_tPager = 0;
private $_pRequest = '';
private $_cRow = 1;
private $_RPage;
public function setName($name){
$this->_name = $name;
}
public function setClassName($cn){
$this->_ClassName = $cn;
}
public function setDataSource($ds){
$this->_ds = $ds;
}
public function setColumns($cols){
$this->_columns
= explode(',',$cols); }
public function setTColumns($cols){
$this->_TColumns
= explode(',',$cols); }
public function setWColumns($cols){
$this->_WColumns
= explode(',',$cols); }
public function setFields($fl){
}
public function setActions($actions){
if(count($this->_columns
)>0) $this->_actions
= explode(',',$actions); }
public function setIdAction($id){
$this->_idAction
= explode(',',$id); }
public function setRowsAndPager($rw,$pg){
$this->_rows = $rw;
$this->_pager = $pg;
/*La cantidad de paginas que hay en total*/
$this->_tPager = (($this->_rows%$this->_pager)==0) ? (int)($this->_rows/$this->_pager) : (int)($this->_rows/$this->_pager) + 1;
}
public function setPRequest($rq){
$this->_pRequest = $rq;
}
public function setCRow($rw){
$this->_cRow = $rw;
}
public function setRefreshPage($rp){
$this->_RPage = base_url('index.php/' . $rp);
}
public function render(){
$tb = '<table id="' . $this->_name . '" class="gridview UserGridView ' . $this->_ClassName . '">';
$tb .= '{header}{rows}{pager}';
$tb .= '</table>';
/*Header*/
$th = ''; $t = ''; $w = 0;
foreach($this->_columns as $k => $col){
/*Ancho de cabezera*/
$w = ($this->_WColumns[$k]>0) ? 'style="width: ' . $this->_WColumns[$k] . 'px;" ' : '';
/*Dejamos un espacio para la columna de acciones*/
$th .= "<th $t $w>$col</th>";
if($k == count($this->_columns
)){ $th .= "<tr>$th</tr>";
}
}
/*Filas*/
$td = '';
foreach($this->_ds as $x => $r){
$alter = ($x%2) ? 'class="alter"' : '';
$td .= "<tr $alter>";
foreach($this->_fields as $k => $col){
$t = ($this->_TColumns[$k]<>'x') ? 'class="' . $this->_TColumns[$k] . '" ' : '';
/*Ancho de cabezera*/
$w = ($this->_WColumns[$k]>0) ? 'style="width: ' . $this->_WColumns[$k] . 'px;" ' : '';
if($col=='x'){
$td .= '<td ' . $w . ' class="actions">';
foreach($this->_actions as $at){
$ids = "";
foreach($this->_idAction as $k => $id)
($k < count($this->_idAction
)-1) ?
$ids .= $r->$id . '|' : $ids .= $r->$id . ''; switch($at){
case 'select':
$td .= '<input type="image" src="' . base_url() . 'assets/css/images/_select.png" class="gv_select" value="' . $ids . '" />';
break;
case 'search':
$td .= '<input type="image" src="' . base_url() . 'assets/css/images/_search2.png" class="gv_search" value="' . $ids . '" />';
break;
case 'delete':
$td .= '<input type="image" src="' . base_url() . 'assets/css/images/_delete.png" class="gv_del" value="' . $ids . '" />';
break;
}
}
$td .= '</td>';
}else{
$td .= "<td $w $t>" . $r->$col . "</td>";
}
}
$td .= '</tr>';
}
/*Pager*/
$pg = '';
if($this->_rows > 0){
/*Paginas en total*/
$pg .= '<tr class="pager">
<td colspan="' . count($this->_columns
) . '">'; $pg .= img
(array('src'=>'assets/css/images/_loading.gif','class'=>'loading','title'=>'Cargando sea paciente, en caso de demorar demasiado consulte con su proveedor.')); $pg .= '<input class="gv_pager" type="hidden" value="' . $this->_pager . '" />
<input class="gv_tpager" type="hidden" value="' . $this->_tPager . '" />
<input class="gv_current" type="hidden" value="' . $this->_cRow . '" />
<input class="gv_refresh" type="hidden" value="' . $this->_RPage . '" />';
/*Desabilitamos los botones de las paginas anteriores segun la condicion*/
if($this->_cRow > 1){
$pg .= '<button value="1">Inicio</button>';
$pg .= '<button value="' . ($this->_cRow - 1) . '"><</button>';
}else{
$pg .= '<button value="1" disabled="disabled">Inicio</button>';
$pg .= '<button value="1" disabled="disabled"><</button>';
}
$pg .= '<input class="gv_page" type="text" style="width: 25px; text-align: center;" value="' . $this->_cRow . '" />';
if($this->_cRow < $this->_tPager){
$pg .= '<button value="' . ($this->_cRow + 1) . '">></button>';
$pg .= '<button value="' . $this->_tPager . '">Fin</button>';
}else{
$pg .= '<button value="0" disabled="disabled">></button>';
$pg .= '<button value="0" disabled="disabled">Fin</button>';
}
$pg .= '<span class="count">Se encontraron ' . count($this->_ds
) . ' registros de ' . $this->_tPager
. ' paginas en total</span>'; $pg .= '</td>
</tr>';
}
return $tb;
}
}
Y un ejemplo de como implementarla
Código PHP:
Ver original/*gridview*/
$this->gridview->setDataSource($this->objAlmacenDLO->listarStockProductos($p,$w));
$this->gridview->setColumns('ID,Nombre,stock,Categoria,Marca,UND');
$this->gridview->setFields('idProducto,nombre,stock,categoria,marca,idUnidadMedida');
$this->gridview->setActions('select');
$this->gridview->setIdAction('idProducto');
$this->gridview->setTColumns('center,x,x,x,x,x,x,x,x,x');
$this->gridview->setWColumns('55,70,x,65,90,65,100,100,55,100');
$this->gridview->setRowsAndPager($this->objAlmacenDLO->totalStockProductos($w),15);
$this->gridview->setRefreshPage('almacen/stock');
$this->gridview->setCRow($c);
A lo mejor podríamos hacer una mejor grilla entre los GURU, y mas controles como lo haria en webforms ASP.NET jojojojo
EDIT: no usen mi codigo, me acabo de dar cuenta que el mensaje es del 2009 ... yo publique el codigo para darle una idea de como lo implemente yo, pero para que esto funcione hace falta jquery, y usar codeigniter... saludos