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

2votos

Como evitar que un a href = $_SERVER['PHP_SELF'] cambie de pagina

Hola a todos:

Espero me ayuden por favor ya que apenas estoy aprendiendo php y jquery, llevo varios días y no le encuentro una posible solución a lo siguiente:

Resulta que estoy desarrollando una pagina web que en el lado izquierdo muestra una lista con varios productos y al darle clic en cualquier producto, aparece una tabla con los productos seleccionados (los productos se encuentran en una base de datos de mysql) tuve que hacer una paginación (que en este caso el script lo saque de Internet) y filtrar los resultados de 20 en 20 ya que hay veces que los resultados que aparecen son mas de 1000 productos, todo funciona muy bien, el problema surge cuando aparece la paginacion y al darle clic a los vínculos para cambiar de pagina(que en este caso la pagina de los productos es productos.html), carga la pagina de paginacion.php y la lista de los productos desaparece.

He estado investigando y he descubierto que las variables de los vínculos de la lista, se pasan por el método .post() a paginacion.php y en la pagina de paginacion.php en la parte de los vínculos para cambiar de pagina tengo lo siguiente:

$centerPages = "";
$sub1 = $pn - 1;
$sub2 = $pn - 2;
$add1 = $pn + 1;
$add2 = $pn + 2;
if ($pn == 1) {
    $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
    $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
} else if ($pn == $lastPage) {
    $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
    $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
} else if ($pn > 2 && $pn < ($lastPage - 1)) {
    $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub2 . '">' . $sub2 . '</a> &nbsp;';
    $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
    $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
    $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
    $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add2 . '">' . $add2 . '</a> &nbsp;';
} else if ($pn > 1 && $pn < $lastPage) {
    $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
    $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
    $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
}

con lo cuál al ser un a href = $_SERVER['PHP_SELF']; es lógico que siga el vinculo y me cambie de pagina.

Ya trate de ponerle un prevenDefault(); a los vínculos pero pues con esto dejan de funcionar, también ya trate de poner todo en una sola pagina pero no me muestra la tabla.

Como lo comento anteriormente, todo funciona a la perfección solo es esa cuestión de los vínculos de la paginacion, como le puedo hacer para que no me cambie de pagina ?

http://i59.tinypic.com/30stvtj.png ------> Así es como se ve la pagina web

http://i60.tinypic.com/2jbv821.png -------> Así es como se ve después de hacerle clic en pagina 2, 3 , 4, etc. de la paginacion.

Quedo en espera de sus respuestas.

Gracias.

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola elektrogil,

Cómo ya estuviste investigando, la raíz de tu problema está en que hay dos archivos, uno productos.html y otro pagination1.php y la variable de entorno $_SERVER['PHP_SELF'] tiene el valor del proio script que es pagination1.php

Lo que te falta contarnos es cómo se ve el script PHP en el script HTML: es un FRAME? es un IFRAME? Se carga un DIV dinámicamente con JQuery AJAX?

Dependiendo de esto es cómo tenés que plantear la solución.

Lo más simple y prolijo sería que renombres productos.html a productos.php y donde sea que hagas aparecer el catálogo, copies y pegues el script de pagination1.php para integrar todo el código en un solo archivo. De esta manera la variable de entorno `$_SERVER['PHP_SELF'] apuntará a productos.php y todo va a funcinar.

Una forma menos correcta sería cambiar el código del paginador para que apunte directaemnte al archivo que quieras:

$centerPages = "";
$sub1 = $pn - 1;
$sub2 = $pn - 2;
$add1 = $pn + 1;
$add2 = $pn + 2;
$destino = 'productos.html';
if ($pn == 1) {
    $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
    $centerPages .= '&nbsp; <a href="' . $destino . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
...

es decir, creás una variable $destino con el nombre de la página a la que apuntar y luego reemplazar $_SERVER['PHP_SELF'] por $destino en todo el código.

Esto es menos correcto porque el paginador deja de ser genérico, y ahora para usarlo en otro lugar tenés que ajsuatr el valor de $destino cada vez, es decir, el código es menos reusable y menos genérico.

Saludos!

1voto

elektrogil comentado

Hola leonardo-tadei muchas gracias por tu pronta respuesta !!!

Te comento, el contenido de pagination1.php se carga en productos.html dentro de un div dinamico usando el método .post(); de jquery, es algo como esto :

function swapContent(lineas){
  var url = "pagination1.php"; 
  $.post(url,{contentVar:lineas},function(data){
    $("#productos").html(data).show();
  });

Y en cada vinculo tiene este código:

<li><a href="#" onmousedown="javascript:swapContent('abb');"> Abb </a></li>

Ahora bien, ya había hecho la prueba de pasar todo el código de pagination1.php a productos.html , lo puse entre la etiqueta <head>, renombre de productos.html a productos.php y la funcion de swapContent tambien la modifique quedo algo como esto:

function swapContent(lineas){
  var url = "productos.php"; 
  $.post(url,{contentVar:lineas},function(data){
    $("#productos").html(data).show();
  });

Solo que usando esta forma, cuando le doy clic en los vínculos, no sucede nada, hice un test:

 $lineas = $_POST['contentVar'];

    echo '<div>' . $lineas . '</div>;

y cuando le doy clic en los vinculos, si me aparece a que vinculo le di clic, pero inmediatamente se quita.

Que me recomiendas, ya que estoy totalmente perdido :-S.

Saludos!

0voto

Leonardo-Tadei comentado

Hola elektrogil,

no sigas por ese camino: es un código extremadamente complejo y hacerlo funcionar implica al menos usar un paginador que se integre con el código JavaScript para agregar el parámetro GET a la llamada POST que haces usando AJAX.

Al ser dos métodos de llamada distintos, POST los artículos y GET el paginador, tenés que hacer varias modificaciones en cada parte del proceso de llamadas y enlaces.

Si nos das el código completo de los dos archivos, podríamos integrarlos en uno solo muchísimo más simple que no use AJAX y que sí pagine. Si es muy largo para subirlo acá, poné los enlaces por ejemplo en pastebin.com o en otro servicio.

0voto

elektrogil comentado

Hola leonardo,

Ya subí los códigos de productos.html y pagination1.php, una disculpa por no haberlos subido antes pero mi Internet es una porquería hasta apenas ahorita regreso.

Estos son los links

pagination1.php -------------------------->>> http://pastebin.com/aV8iTpkE

productos.html -------------------------->>> http://pastebin.com/jdk4YEun

Los estilos están hechos un relajo porque he estado haciendo pruebas jeje, primero quiero arreglar este inconveniente, para posteriormente ordenar todo el css.

Saludos y nuevamente muchas gracias !!!.

0voto

Leonardo-Tadei comentado

Hola elektrogil,

perdoná, pero a tu código no hay de dónde agarrarlo para acomodarlo y hacerle hacer lo que querés... si algo anda ahora, es de pura casualidad.

Por ejemplo, el código PHP que será llamado vía AJAX devuelve una página HTML entera, pero en realidad será mostrado dentro de un DIV, con lo que estás generando código HTML inválido; en el menú llamás al contenido en el evento onmousedown en vez de en el evento click (supongo que porque no sabés como hacer que no se recargue la página al clickear, lo que se hace haciendo que la función llamada devuelva false); si cargara el contenido tendrías suplicado el footer; etc,etc.

Te sugiero sinceramente que lo mejor para este caso es empezar de nuevo con el código, no usar AJAX, y hacer que cada enlace recargue la página pasando por GET la marca y la página estando el código PHP que muestra los productos adentro del actual <div id="productos">

Si como sospecho estás comenzando con el apasionante mundo de la programación web, te sugiero hacer algún cursillo o leerte un libro bien didáctico sobre esto (en este sitio se nombran algunos): sería una pena que por comenzar con una mala base se malogre tu entusiasmo y tus ganas de resolver problemas.

Por favor, entendé que te comento esto con la mejor de las intenciones: en tu código aparecen varios errores de concepto, que son mucho más difícil de solucionar que alguna cuestión técnica puntual.

Saludos cordiales!

1voto

elektrogil comentado

Tan mal esta el código? U.U

Huy entonces tendré que reestructurarlo todo??? U.U , lo que no entiendo es como hacer para que cada vez que le doy clic a algún producto de la lista, este me devuelva la tabla, porque si le pongo una clase a cada item de la lista, es posible llamarlo mediante GET a php ? creo que no es posible o si ?

0voto

Leonardo-Tadei comentado

No es solo que el código esté mal, que sería lo de menos: tenés tantos errores conceptuales juntos en la implementación que de seguir así será muy difícil que funcione.

Mirá este ejemplo de una página que pagina los resultados, que usa solo PHP: http://nebaris.com/post/41/como-implementar-paginacion-en-php

En tu caso, solo habría que agregarle el parámetro con la marca a la llamada (que debería ser por su ID y no por su nombre) para implementar lo que te hace falta.

Saludos cordiales

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