entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Implementar la clase "Simple Pagination" para paginar resultados (php y mysql)

Que tal!, bueno aquí estoy nuevamente, lo que pasa es que después de consultar como paginar resultados me decidí por usar lo que hacen en el siguiente enlace:

http://www.desarrolloweb.com/articulos/paginacion-mysql-showresult.html

Me pareció un poco mas sencillo y limpio,

Pero a la hora de implementarlo no consigo los resultados, esta es mi clase donde hago el query y lo guardo en un arreglo, que se supone que es el que le voy a pasar a la clase que hace la paginacion:

class Catalogo {

public function get_catalogos_dep($idcat) {
    $conn = Conexion::db_connect();

    $sql = "SELECT * FROM bienes WHERE id_cat=$idcat";
    $result = $conn->query($sql);

    if (!$result)
        return false;

    $prod_array = array();

    while ($reg = $result->fetch_assoc()) {
        $prod_array[] = $reg;
    }
    return $prod_array;
}

A continuación muestro la parte donde muestro los datos y me traigo el arreglo de la función anterior:

<?php
                require_once 'class/Catalogo.php';
                require_once 'class/Generales.php';
                require_once 'class/pagination.class.php';

                $obj = new Catalogo();

                $idcat = $_GET['idcat'];

                $nom_dep = $obj->get_nombre_dep($idcat);
                ?>

                <h3><?php echo $nom_dep; ?></h3>

                <?php
                $bienes_array = $obj->get_catalogos_dep($idcat);
                $pagination = new pagination();

                if (is_array($bienes_array) && count($bienes_array) > 0) {

                    $pagination->createPaging($bienes_array,10);
                    ?>

                    <div class="panel panel-default">
                        <div class="panel-body">

                            <table width ="100%" class="table">
                                <?php
                                foreach ($bienes_array as $row) {
                                    $url = "detalles_catalogo.php?num_inv=" . $row['num_inv'];
                                    ?>
                                    <tr>

                                        <td width="100">
                                            <a href="<?php echo $url; ?>">
                                                <img src="<?php echo $row['img']; ?>" border="0" class="img-thumbnail">     
                                            </a>
                                        </td>

                                        <td>    
                                            <?php
                                            $title = $row['titulo'];
                                            Generales::do_html_URL($url, $title);
                                            ?>  
                                        </td>

                                    </tr>

                                    <?php
                                }
                            } else {
                                echo "<strong>No Hay Catalogos para este municipio.</strong><br><br><br>";
                                echo "<a href='insertar_catalogo.php'>
        <img src='images/agregar.png' border=0></a>";
                            }
                            ?>

Como pueden ver cree el objeto de la clase pagination y le pase el query, pero hasta ahí es donde me quede, intente hacer el bucle pero no se como implementarlo de acuerdo a como recorro y presento el arreglo actualmente.

Ojala puedan echarme una mano, gracias.

1 Respuesta

1voto

Leonardo-Tadei Puntos227300

Hola iphp,

la clase trabaja directamente sobre la query y no sobre un vector. Lo que tenés que hacer es integrar esta clase dentro del catalogo:

class Catalogo {
public function get_catalogos_dep($idcat) {
    $conn = Conexion::db_connect();
    $sql = "SELECT * FROM bienes WHERE id_cat=$idcat";
    //$result = $conn->query($sql); La query ahora no la hacés vos
   $pagination = new pagination();
   $pagination->createPaging($sql,10); // Acá se ejecuta la query

    if (!$pagination->resultpage)
        return false;

    $prod_array = array();

    // while ($reg = $result->fetch_assoc()) { // el bucle lo determina el paginador
    while($reg=mysql_fetch_object($pagination->resultpage)) { 
        $prod_array[] = $reg;
    }
    return $prod_array;
}

}

Tendrías que agregar un método que devuelva la salida de $pagination->displayPaging(); para poder mostrar al paginador... Para esto podés implementar un atributo a Catálogo que tenga este resultado, y pedirlo luego:

class Catalogo {

  $paginador = '';

    public function get_catalogos_dep($idcat) {
        .. el mismo código
        $pagination->createPaging($sql,10);
        $this->paginador = $pagination->displayPaging();  // esto implica cambiar el método displayPaging() para que devuelva un string en vez de ese diseño horrible de que el método tenga los echo adentro.
        ... el resto del código

Luego para mostarr el paginador harías:

print($obj->paginador);

Como ves, requiere algo de trabajo de integración, pero es normal por el tipo de implementación que estás usando.

Saludos!

0voto

iphp comentado

Que tal Leonardo!,

Entiendo, entonces mi "clase" Catalogo quedaría de la siguiente manera:

class Catalogo {

private $paginador = '';

public function get_catalogos_dep($idcat) {
    $conn = Conexion::db_connect();
    $sql = "SELECT * FROM bienes WHERE id_cat=$idcat";

    $pagination = new pagination();
    $pagination->createPaging($sql, 10);

    $this->paginador = $pagination->displayPaging();

    if (!$pagination->resultpage)
        return false;

    $prod_array = array();

    while ($reg = mysql_fetch_object($pagination->resultpage)) {
        $prod_array[] = $reg;
    }
    return $prod_array;
}

}

Así solo resta agregar al archivo donde muestro los datos, la linea que imprime el paginador:

print($obj->paginador);

Por lo que quedaría:

bienes_dep

 <?php
                require_once 'class/Catalogo.php';
                require_once 'class/Generales.php';

                $obj = new Catalogo();

                $idcat = $_GET['idcat'];

                $nom_dep = $obj->get_nombre_dep($idcat);
                ?>

                <h3><?php echo $nom_dep; ?></h3>

                <?php
                $bienes_array = $obj->get_catalogos_dep($idcat);

                if (is_array($bienes_array) && count($bienes_array) > 0) {
                    ?>

                    <div class="panel panel-default">
                        <div class="panel-body">

                            <table width ="100%" class="table">
                                <?php
                                foreach ($bienes_array as $row) {
                                    $url = "detalles_catalogo.php?num_inv=" . $row['num_inv'];
                                    ?>
                                    <tr>

                                        <td width="100">
                                            <a href="<?php echo $url; ?>">
                                                <img src="<?php echo $row['img']; ?>" border="0" class="img-thumbnail">     
                                            </a>
                                        </td>

                                        <td>    
                                            <?php
                                            $title = $row['titulo'];
                                            Generales::do_html_URL($url, $title);
                                           print($obj->paginador);
                                            ?>  
                                        </td>

                                    </tr>

        <?php
    }
} else {
    echo "<strong>No Hay Catalogos para este municipio.</strong><br><br><br>";
    echo "<a href='insertar_catalogo.php'>
        <img src='images/agregar.png' border=0></a>";
}

Cierto? o entendí mal la ultima parte, el horrible diseño de los echo te refieres a mi código o al del ejemplo del link? D:

Saludos

0voto

Leonardo-Tadei comentado

Hola iPHP,

el código, si veo mal, quedaría tal como decís, con una salvedad: al definir el atributo $paginador como privado, la línea

print($obj->paginador);

no funciona. Tendrías que hacer un getter para devolver este valor o hacer el atributo público.

Con respcto a los echo, me refería al código original de la clase: cuando un método tiene un echo o print adentro, al llamarlo se ve en pantalla, pero es mucho más interesante que devuelva un string para poder llamarlo en un momento y mostrarlo en otro, que es juntamente lo que te hace falta ahora: llamarlo adentro del método de la clase Catalogo y mostrarlo más tarde en tu script.

Saludos!

0voto

iphp comentado

Bien Leonardo,

Hice publico al atributo $paginador, con esto ya lo estoy llamando en la clase Catalogo verdad?, pero no funciono :(

0voto

Leonardo-Tadei comentado

y cambiaste la clase Paginador para que no haga echo y devuelva un string?
Podés poner la clase completa en algún URL para verla?

0voto

iphp comentado

La clase Paginador?, es decir la librería que sugirieron en el link? o cual clase te refieres?

0voto

iphp comentado

Aquí esta la clase original, esa clase no la e modificado, creo que no te entendí esa parte :/

https://www.dropbox.com/s/yzfo3h2wgblrvdw/pagination.class.php

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta