Foros del Web » Programando para Internet » PHP »

Problema al paginar y dividir en 2 columnas

Estas en el tema de Problema al paginar y dividir en 2 columnas en el foro de PHP en Foros del Web. Hola a todos, estoy intentando crear un catálogo virtual, paginando los resultados y dividiendo en 2 columnas los resultados de cada categoría. Es decir, lo ...
  #1 (permalink)  
Antiguo 25/11/2010, 02:19
 
Fecha de Ingreso: febrero-2010
Ubicación: Madrid, España
Mensajes: 36
Antigüedad: 14 años, 10 meses
Puntos: 0
Problema al paginar y dividir en 2 columnas

Hola a todos,

estoy intentando crear un catálogo virtual, paginando los resultados y dividiendo en 2 columnas los resultados de cada categoría. Es decir, lo que estoy intentando hacer es que cuando un usuario seleccione una categoría, el php le devuelve 4 productos por página (el resto lo pagina), y estos 4 resultados que los divida en 2 columnas, dando por consiguiente 2 filas.

Para realizar esto estoy usando un código que he tomado de algún lugar (probé con tantos códigos que no recuerdo el sitio exacto):
Código:
<?php

$categ1 = 1; //Número de la categoría. Campo "categoria" de la tabla SQL.
$categ2 = 1; // Número de la sub-categoría. Campo "categoria2" de la tabla SQL.

$host="localhost";
$user="user";
$pass="password";
$db="basededatos";
if(!$link=@mysql_connect($host,$user,$pass)) die ("Error");
$base=@mysql_select_db($db,$link)or die("Error");
require 'PageNavigator.php';
//Maximo de paginas, procurar que sea # par
define("PERPAGE", 4);
define("OFFSET", "offset");
$offset=(int)@$_GET[OFFSET];
 
$recordoffset=$offset*PERPAGE;
$sql="SELECT * FROM productos WHERE categoria = $categ1 AND categoria2= $categ2 ORDER BY id ASC LIMIT $recordoffset,". PERPAGE;
$total="SELECT COUNT(*) as cuantos FROM productos";
$result = @mysql_query($sql);
$result0 = @mysql_query($total);
$totalrecords=mysql_fetch_assoc($result0);
$totalrecords=$totalrecords['cuantos'];
// esto de par e impar es para tener una mejor fluidez de datos
 
$fieldPar;
$fieldImpar;
$i=0;
while ($row = @mysql_fetch_array($result, MYSQL_ASSOC)){
$i++;
if(($i%2)){
$fieldImpar[] = $row;
}else{
$fieldPar[] = $row;
}
}
$pagename=basename($_SERVER['PHP_SELF']);
$numpages = ceil($totalrecords/PERPAGE);
$otherparameter = "&amp;unparametro=VALOR :D";
$primedio=ceil((count($fieldImpar)+count($fieldPar))/2);
 
?>
Posteriormente pongo ésto encima de la tabla de los 4 resultados:

Código:
<?php
for($i=0;$i<$primedio;$i++){
?>
Y por último:
Código:
<?
}
?>
Mi problema es que no sé dónde tengo que poner la última parte, ya que donde lo ponga lo que hace es repetir los 4 productos de nuevo. Es decir, si pongo el código al final de la tabla con los 4 productos, me repite de nuevo los 4 productos debajo de éstos.

El código que tengo con las tablas es el siguiente:

Código:
<?php
for($i=0;$i<$primedio;$i++){
?>
                <td width="300"><table width="300" border="0" cellspacing="0" cellpadding="0">
                  <tr>
                    <td colspan="3"><img src="images/<?=$fieldImpar[$i][foto]?>" width="300" height="200"></td>
                  </tr>
                  <tr>
                    <td height="10" colspan="3"></td>
                  </tr>
                  <tr>
                    <td colspan="3" class="PRODname"><?=$fieldImpar[$i][nombre]?></td>
                  </tr>
                  <tr>
                    <td colspan="3"><span class="PRODdescrip"><?=$fieldImpar[$i][descripcion]?></span></td>
                  </tr>
                  <tr>
                    <td height="10" colspan="3"></td>
                  </tr>
                  <tr>
                    <td width="75"><img src="images/productos/referencia.jpg" width="75" height="14"></td>
                    <td width="8">&nbsp;</td>
                    <td width="217" class="PRODref"><?=$fieldImpar[$i][referencia]?></td>
                  </tr>
                  <tr>
                    <td colspan="3">&nbsp;</td>
                  </tr>
                </table></td>
                <td width="20">&nbsp;</td>
                <td width="300"><table width="300" border="0" cellspacing="0" cellpadding="0">
                  <tr>
                    <td colspan="3"><img src="images/<?=$fieldPar[$i][foto]?>" width="300" height="200"></td>
                  </tr>
                  <tr>
                    <td height="10" colspan="3"></td>
                  </tr>
                  <tr>
                    <td colspan="3" class="PRODname"><?=$fieldPar[$i][nombre]?></td>
                  </tr>
                  <tr>
                    <td colspan="3"><span class="PRODdescrip"><?=$fieldPar[$i][descripcion]?></span></td>
                  </tr>
                  <tr>
                    <td height="10" colspan="3"></td>
                  </tr>
                  <tr>
                    <td width="75"><img src="images/productos/referencia.jpg" width="75" height="14"></td>
                    <td width="8">&nbsp;</td>
                    <td width="217" class="PRODref"><?=$fieldPar[$i][referencia]?></td>
                  </tr>
                  <tr>
                    <td colspan="3">&nbsp;</td>
                  </tr>
                </table></td>
                <td width="15">&nbsp;</td>
              </tr>
              <tr>
                <td><table width="300" border="0" cellspacing="0" cellpadding="0">
                  <tr>
                    <td colspan="3"><img src="images/<?=$fieldImpar[$i][foto]?>" width="300" height="200"></td>
                  </tr>
                  <tr>
                    <td height="10" colspan="3"></td>
                  </tr>
                  <tr>
                    <td colspan="3" class="PRODname"><?=$fieldImpar[$i][nombre]?></td>
                  </tr>
                  <tr>
                    <td colspan="3"><span class="PRODdescrip"><?=$fieldImpar[$i][descripcion]?></span></td>
                  </tr>
                  <tr>
                    <td height="10" colspan="3"></td>
                  </tr>
                  <tr>
                    <td width="75"><img src="images/productos/referencia.jpg" width="75" height="14"></td>
                    <td width="8">&nbsp;</td>
                    <td width="217" class="PRODref"><?=$fieldImpar[$i][referencia]?></td>
                  </tr>
                  <tr>
                    <td colspan="3">&nbsp;</td>
                  </tr>
                </table></td>
                <td>&nbsp;</td>
                <td><table width="300" border="0" cellspacing="0" cellpadding="0">
                  <tr>
                    <td colspan="3"><img src="images/<?=$fieldPar[$i][foto]?>" width="300" height="200"></td>
                  </tr>
                  <tr>
                    <td height="10" colspan="3"></td>
                  </tr>
                  <tr>
                    <td colspan="3" class="PRODname"><?=$fieldPar[$i][nombre]?></td>
                  </tr>
                  <tr>
                    <td colspan="3"><span class="PRODdescrip"><?=$fieldPar[$i][descripcion]?></span></td>
                  </tr>
                  <tr>
                    <td height="10" colspan="3"></td>
                  </tr>
                  <tr>
                    <td width="75"><img src="images/productos/referencia.jpg" width="75" height="14"></td>
                    <td width="8">&nbsp;</td>
                    <td width="217" class="PRODref"><?=$fieldPar[$i][referencia]?></td>
                  </tr>
                  <tr>
                    <td colspan="3">&nbsp;</td>
                  </tr>
                </table></td>
<?
}
?>
<center>
<?php
//numero de paginas minimo necesarias
if($numpages>1){
//Crea el navegador
$nav = new PageNavigator($pagename, $totalrecords, PERPAGE, $recordoffset, 4, $otherparameter);
echo $nav->getNavigator();
}
?>
El último código creo que es para que se paginen los datos, aunque esa parte el php me lo pone encima de la tabla aunque pongo el código al final de ésta. Eso es otra cosa que no entiendo, pero ya lo miraré.

¿Puede alguien ayudarme, por favor? Muchas gracias por adelantado.
  #2 (permalink)  
Antiguo 25/11/2010, 02:28
 
Fecha de Ingreso: febrero-2010
Ubicación: Madrid, España
Mensajes: 36
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Problema al paginar y dividir en 2 columnas

Copio el código del archivo pagenavigator.php por si alguien lo quiere para usarlo:

Código:
<?php
////////////////////////////////////////////////////////////////////
class PageNavigator{
	//data members
	private $pagename;
	private $totalpages;
	private $recordsperpage;
	private $maxpagesshown;
	private $currentstartpage;
	private $currentendpage;
	private $currentpage;
	//next and previous inactive
	private $spannextinactive;
	private $spanpreviousinactive;
	//first and last inactive
	private $firstinactivespan;
	private $lastinactivespan;	
	//must match $_GET['offset'] in calling page
	private $firstparamname="offset";
	//use as "&name=value" pair for getting
	private $params;
	//css class names
	private $inactivespanname = "inactive";
	private $pagedisplaydivname = "totalpagesdisplay";
	private $divwrappername = "navigator";
	//text for navigation
	private $strfirst = "|&lt;";
	private $strnext = "Siguiente";
	private $strprevious = "Anterior";
	private $strlast = "&gt;|";
  //for error reporting
	private $errorstring;	
////////////////////////////////////////////////////////////////////
//constructor
////////////////////////////////////////////////////////////////////
  public function __construct($pagename, $totalrecords, $recordsperpage, $recordoffset, $maxpagesshown = 4, $params = ""){
  	$this->pagename=$pagename;
  	$this->recordsperpage=$recordsperpage;	
		$this->maxpagesshown=$maxpagesshown;
		//already urlencoded
		$this->params=$params;
    //check recordoffset a multiple of recordsperpage
		if(!$this->checkRecordoffset($recordoffset, $recordsperpage)){
		  throw new Exception($this->errorstring);
    }
  	$this->setTotalPages($totalrecords, $recordsperpage);
		$this->calculateCurrentPage($recordoffset, $recordsperpage);
		$this->createInactiveSpans();	
		$this->calculateCurrentStartPage();
		$this->calculateCurrentEndPage();
  }
////////////////////////////////////////////////////////////////////
//public methods
////////////////////////////////////////////////////////////////////
//give css class name to inactive span
////////////////////////////////////////////////////////////////////
  public function setInactiveSpanName($name){
  	$this->inactivespanname=$name;
		//call function to rename span
		$this->createInactiveSpans();	
  }
////////////////////////////////////////////////////////////////////
  public function getInactiveSpanName(){
  	return $this->inactivespanname;
  }
////////////////////////////////////////////////////////////////////
  public function setPageDisplayDivName($name){
  	$this->pagedisplaydivname=$name;		
  }
////////////////////////////////////////////////////////////////////
  public function getPageDisplayDivName(){
  	return $this->pagedisplaydivname;
  }
////////////////////////////////////////////////////////////////////
  public function setDivWrapperName($name){
  	$this->divwrappername=$name;		
  }
////////////////////////////////////////////////////////////////////
  public function getDivWrapperName(){
  	return $this->divwrappername;
  }
////////////////////////////////////////////////////////////////////
  public function setFirstParamName($name){
  	$this->firstparamname=$name;		
  }
////////////////////////////////////////////////////////////////////
  public function getFirstParamName(){
  	return $this->firstparamname;
  }
////////////////////////////////////////////////////////////////////
	public function getNavigator(){
		//wrap in div tag
		$strnavigator= "<div class=\"$this->divwrappername\">\n";
		//output movefirst button		
		if($this->currentpage==0){
			$strnavigator.=$this->firstinactivespan;			
		}else{
			$strnavigator .= $this->createLink(0, $this->strfirst);
		}
		//output moveprevious button
		if($this->currentpage==0){
			$strnavigator.= $this->spanpreviousinactive;			
		}else{
			$strnavigator.= $this->createLink($this->currentpage-1, $this->strprevious);
		}
		//loop through displayed pages from $currentstart
		for($x=$this->currentstartpage;$x<$this->currentendpage;$x++){
			//make current page inactive
			if($x==$this->currentpage){
				$strnavigator.= "<span class=\"$this->inactivespanname\">";
				$strnavigator.= $x+1;
				$strnavigator.= "</span>\n";
			}else{
				$strnavigator.= $this->createLink($x, $x+1);
			}
		}
		//next button		
		if($this->currentpage==$this->totalpages-1){
			$strnavigator.=$this->spannextinactive;			
		}else{
			$strnavigator.=$this->createLink($this->currentpage + 1, $this->strnext);
		}
		//move last button
		if($this->currentpage==$this->totalpages-1){
			$strnavigator.= $this->lastinactivespan;			
		}else{
			$strnavigator.=$this->createLink($this->totalpages -1, $this->strlast);
		}
		$strnavigator.= "</div>\n";
		$strnavigator.=$this->getPageNumberDisplay();		
		return $strnavigator;
	}
////////////////////////////////////////////////////////////////////
//private methods
////////////////////////////////////////////////////////////////////
	private function createLink($offset, $strdisplay ){
		$strtemp= "<a href=\"$this->pagename?$this->firstparamname=";
		$strtemp.= $offset;
		$strtemp.= "$this->params\">$strdisplay</a>\n";
		return $strtemp;
	}
////////////////////////////////////////////////////////////////////	
	private function getPageNumberDisplay(){
		$str= "<div class=\"$this->pagedisplaydivname\">\nP&aacute;gina ";
		$str.=$this->currentpage+1;
		$str.= " de $this->totalpages";
		$str.= "</div>\n";
		return $str;
	}
////////////////////////////////////////////////////////////////////
  private function setTotalPages($totalrecords, $recordsperpage){
  	$this->totalpages=ceil($totalrecords/$recordsperpage);
  }
////////////////////////////////////////////////////////////////////
	private function checkRecordoffset($recordoffset, $recordsperpage){
		$bln=true;
		//if recordoffset=0 won't show error
		if($recordoffset%$recordsperpage!=0){
			$this->errorstring="Error - Offset not a multiple of records per page.";
			$bln=false;	
		}
		return $bln;
	}
////////////////////////////////////////////////////////////////////	
	private function calculateCurrentPage($recordoffset, $recordsperpage){
		$this->currentpage=$recordoffset/$recordsperpage;
	}
////////////////////////////////////////////////////////////////////
// not always needed but create anyway
////////////////////////////////////////////////////////////////////
	private function createInactiveSpans(){
		$this->spannextinactive="<span class=\"".
			"$this->inactivespanname\">$this->strnext</span>\n";
		$this->lastinactivespan="<span class=\"".
			"$this->inactivespanname\">$this->strlast</span>\n";
		$this->spanpreviousinactive="<span class=\"".
			"$this->inactivespanname\">$this->strprevious</span>\n";
		$this->firstinactivespan="<span class=\"".
			"$this->inactivespanname\">$this->strfirst</span>\n";
	}
////////////////////////////////////////////////////////////////////
// find start page based on current page
////////////////////////////////////////////////////////////////////
	private function calculateCurrentStartPage(){
		$temp = floor($this->currentpage/$this->maxpagesshown);
		$this->currentstartpage=$temp * $this->maxpagesshown;
	}
////////////////////////////////////////////////////////////////////
	private function calculateCurrentEndPage(){
		$this->currentendpage = $this->currentstartpage+$this->maxpagesshown;
		if($this->currentendpage > $this->totalpages)
			$this->currentendpage = $this->totalpages;	
	}
}//end class
////////////////////////////////////////////////////////////////////
?>
Muchas gracias de nuevo.

Etiquetas: columnas, dividir, paginar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:16.