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

Problema AJAX

Hola, estoy haciendo un sistema de votación (que el usuario seleccione cuantas estrellas le dá) y tengo un problema al guardar los datos.
El código es el siguiente:
<pre>
$(".stars").children("li:not(.voted)").click(function()
{
if (!$(this).hasClass("voted"))
{
var li=$(this);
var ul=$(this).closest("ul");

            var txt=ul.find("span").data("txtoriginal");
            var id=ul.data("id");
            var valor=li.data("vote");

            alert("Voy a votar "+id+" con un valor de "+valor+" y el texto original era "+txt);
            $.getJSON("voto.php", { id: id, voto: valor } )
            .done(function( json ) 
            {
                /* mostramos mensaje */
                ul.find("span").html(json.estado);
                /* actualizamos data */
                ul.find("span").data("txtoriginal",json.value+"/5 en "+json.votes+" votos");
                ul.addClass("ul_voted");
                ul.children("li").addClass("voted");
                /* cambiamos tama�o del div */
                var maximo_posible=5*json.votes;
                var porciento=json.suma*100/maximo_posible;
                porciento=porciento.toFixed(2);
                var txt=ul.find(".voted_percent").css("width",porciento+"%");
                setTimeout(function() { ul.find("span").html(ul.find("span").data("txtoriginal")); }, 3000);
            })
            .fail(function( jqxhr, textStatus, error ) {
                var err = textStatus + ', ' + error;
                ul.find("span").text(err);
            });
        }
    });
</pre>

El problema es que al hacer click para votar me dá un error: "error, Not Found".
Creo que el problema viene de esta línea (porque en el alert muestra bien los datos):
$.getJSON("voto.php", { id: id, voto: valor } )

Si ejecuto el archivo voto.php por separado (pasandole manualmente por la url las variables) me actualiza bien los datos y me devuelve los nuevos datos en formato JSON:
{"estado":"¡Votado! Gracias","suma":"10","value":"2.00","votes":"5","id":"1"}

Es como si no encontrara el archivo voto.php, pero el archivo que lo llama y voto.php estan en la misma carpeta, asique no debería haber problema.

A ver si alguien puede darme una idea de porque puede ser.

Muchas gracias y un saludo!.

0voto

Peter comentado

Por favor selecciona cual es la respuesta correcta de todas las que pusiste y lo demás lo pasamos a comentario.

Gracias.

0voto

Nebur comentado

Hola,
Ya marqué ayer como "mejor respuesta" la de leonardo-tadei. Que fué la que me solucionó el problema de las rutas por el que hice la pregunta.
Lo otro que comenté fué un problema secundario que me dió y como encontré solución la puse por si acaso. Pero solo puedo marcar una respuesta no?

Un saludo.

0voto

Peter comentado

Gracias por aclararlo, al leerlo rápido parecía que las segundas respuestas eran las correctas, por eso convenía ponerlas como comentario, pero ya que lo comentas, queda claro :D

Gracias!

4 Respuestas

2votos

Leonardo-Tadei Puntos227020

Hola Nebur,

por lo que comentás, es un problema de rutas. Si bien el script voto.php y el código JS que lo llaman están en el mismo directorio, WordPress, sobre todo si está usando URLs amigables, está mostrando el contenido a través de un wrapper, con lo que la ruta debe ser siempre la relativa al wrapper para que funcione.

Lo más cómo es poner la ruta relativa a voto.php pero desde la raíz pública del sitio web, como por ejemplo /directorio/voto.php con lo que al menos podrás cambiar de nombre de dominio y que todo siga funcionando y además te independizás de la reescritura de URL que las reglas .htzccess de WorPress puedan estar haciendo.

Repecto a tu problema de refresco, lo que debe estarte pasando es que $.post no está interpretando las respuestas como JSON, cosa que no hará salve que explícitamente las conviertas. Sabiendo que es un problema de rutas, lo más simple y efectivo es volver al $.getJSON que recibe y parsea al mismo tiempo.

Saludos!

0voto

Nebur comentado

Hola,
Muchas gracias por la ayuda. Pues si era cosa de wordpress lo de las rutas, y funcionó lo que me dijiste (que poco me gustan los CMS jeje). Gracias!

Respecto a lo del problema de refresco tienes razón que $.post creo recordar que solo interpretaba xml y html. Quería pasar los datos por post mejor que por get por tema de seguridad (la verdad es que soy poco amigo del get ;) ). ¿Conoces algun link con documentacion de como convertirlo a JSON para echarle un ojo?. Sino ya miraré a ver que me dice "San google".

Gracias de nuevo

0voto

Leonardo-Tadei comentado

Hola Nebur,

JQuery va a parsear una respuesta JSON si viene en ese formato:

Ejemplo con test.php que devuelve contenido en formatto JSON

<?php echo json_encode(array("name"=>"John","time"=>"2pm")); ?>

La llamada con $.post y el parseo auitomágico de los valores en data

$.post( "test.php", { func: "getNameAndTime" }, function( data ) {
console.log( data.name ); // John
console.log( data.time ); // 2pm
}, "json");

Fuente: http://api.jquery.com/jquery.post/

PD: recuerda marcar alguna respuesta como "la mejor" para que el tema quede marcado como solucionado.

0voto

Nebur Puntos1140

Me respondo a mi mismo con una solución momentanea al problema ;).
Si pongo la ruta absoluta de donde esta el archivo todo funciona correctamente, pero no me funciona poniendo solo el nombre del archivo (a pesar de que estan en la misma ruta).

Aun asi apreciaria la ayuda si alguien sabe porque no funciona poniendo solo el nombre del archivo. El código es el mismo, tan solo he cambiado la ruta a una absoluta y en vez del método getJson (que use para hacer pruebas) ahora uso el $.post

0voto

Leonardo-Tadei comentado

y con $.post te funciona la ruta relativa o tampoco?

0voto

Nebur comentado

Tampoco funciona. He pensado que puede ser cosa del Wordpress, porque no estoy muy acostumbrado a programar para CMS y lo mismo pueda venir por ahi el problema. Al menos he conseguido hacerlo funcionar con la ruta absoluta.

Lo unico que no me habia dado cuenta que al cambiar el getJSON por el $.post no me actualiza bien los datos, aunque se guardan correctamente en la base de datos.
El problema esta en esta linea:
<pre>
ul.find("span").data("txtoriginal",json.value+"/5 en "+json.votes+" votos");
</pre>
Al darle click a votar tiene que recargar los datos sin recargar la pagina y me sale: "undefined/5 en undefined votos". No esta cogiendo el json.value y el json.votes. Con getJSON si funcionaba, y se supone que con $.post se recogen igual los datos.

0voto

Nebur Puntos1140

Ok, muchas gracias!. Mañana le echo un ojo más detallado, pero si tengo el archivo para que devuelva el contenido en JSON:
<pre>
$mensaje=array();
$mensaje["estado"]="¡Votado! Gracias";
//recuperamos datos nuevos
$consulta = "select from wp_galeria where id='".$_POST["id"];
$votando = $wpdb->get_results($consulta);
//$votando=$db->query("select
from galeria where id='".intval($_POST["id"])."' limit 1");
foreach ( $votando as $filas )
{
$cuenta=0;
if ($filas->total_votes>0) $cuenta=$filas->total_value/$filas->total_votes;

        $mensaje["suma"]=$filas->total_value;
        $mensaje["value"]=number_format($cuenta,2);
        $mensaje["votes"]=$filas->total_votes;
        $mensaje["id"]=$filas->id;

        echo json_encode($mensaje);
    }

</pre>
Mañana haré unas pruebas entre los distintos tipos de $.post para ver si viene por ahi el problema. Muchas gracias por la ayuda!.

Un saludo!.

P.D: Marco tu primera respuesta como "la mejor" porque al fin y al cabo fue la que me dió la solución al problema por el que abrí el tema

0voto

Nebur Puntos1140

Al final encontré también una solución para el problema del refresco. La pongo por si a alguien le sirve. En vez de llamar al método $.post que por defecto no admite que se devuelva un JSON use este método:
<pre>
$.ajax({
url:"miurl",
type:"POST",
data:{ id: id, voto: valor },
dataType:"json",

})

</pre>
Basicamente hace los mismo que el $.post (ya que este método llama al $.ajax), pero le puedo decir el tipo de datos que va a recibir.

Un saludo

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