Hola a todos!!
Tengo una duda que me está volviendo loco.... y es que tengo que enviar un conjunto de datos por post con jquery y no me acaba de funcionar como es debido. Llevo una semana con esto y oye que no sale!!
Me explico:
Dentro de un formulario que sirve para añadir canciones de diferentes discos mediante drag&drop de una columna a un recopilatorio representado en otra columna, tengo el siguiente código que envía mediante post a la BB.DD dichas canciones en el momento que las suelto dentro de la columna de recopilatorios.
El código del formulario donde aparecen las canciones en la columna izq listas para arrastrar:
Código PHP:
<div id="contentLeft">
<ul id="sortable1" class="connectedSortable">
<?php
if(isset($_POST['disc']) && $_POST['disc'] != '')
{
$query3 = mysql_query("SELECT nombreCancion, idCancion FROM `" . DBPREFIX . "canciones` WHERE idDisco = ". $_POST['disc']); // consulta a la bbdd
if(mysql_num_rows($query3)!=0)
{
while($fila_cancion = mysql_fetch_assoc($query3))
{
echo "<li id='recordsArray_".$fila_cancion['idCancion']."' class='list'>".$fila_cancion['nombreCancion']."<img id='eliminar' src='images/backgrounds/eliminar.png' alt='Borrar' class='eliminar' /></li>";
}
}
else
{
$msg = 'Actualmente no existen registros de canciones de este disco.';
}
?>
</ul>
</div>
El código que procesa la columna derecha correspondiente al recopilatorio cada vez que se deposita un canción:
Código:
$(document).ready(function(){
//$(function() {
$("#contentRight ul").sortable({ opacity: 0.6, cursor: 'move', update: function() {
var order = $(this).sortable("serialize") + '&action=updateRecordsListings';
$.post("scripts/update_order_recopilatorio.php", order, function(theResponse){
$("#contentMiddle").html(theResponse);
});
}
});
//});
});
$(function() {
$("#sortable1, #sortable3").sortable({
opacity: 0.6, cursor: 'move', connectWith: '.connectedSortable'
}).disableSelection();
});
Hasta aquí perfecto! Funciona todo, arrastro la canción a la columna del recopilatorio y se envían los datos por post recogiéndolos la BB.DD de forma correcta. Al tener que enviar un número indeterminado de registros en este caso canciones, los datos se tratan como un array por eso se almacena lo recogido en una variable y es la que enviamos por post, como he dicho ningún problema. Nota importante es que también sirve para ordenar las canciones entre ellas cuando hacemos drag&drop intercambiando las posiciones en la misma columna del recopilatorio, por lo tanto a cada cambio se vuelve a enviar un post con la info y la nueva posición de las canciones, esto, también funciona perfectamente!!
La cuestión viene en el momento en que se quiere eliminar de la columna de recopilatorios algunas de las canciones que hemos añadido. Aquí el código que lo hace:
Código:
$(document).ready(function(){
$(".list .eliminar").click(function(){
$(this).parents(".list").animate({ opacity: 'hide' }, 1000, "linear", function(){
var del = 'deleteRecordsListings';
var deldisco = $(".vardisco").attr("value");
var delid = $(this).attr("id");
$(this).remove();
if ( delid != "")
{
var env = $("#contentRight ul").sortable("serialize") + '&action=updateRecordsListings';
$.post("scripts/update_order_recopilatorio.php", {env, del:del, deldisco:deldisco, delid:delid}, function(theResponse){ $("#contentMiddle").html(theResponse); });
}
});
});
});
Bueno, esto lo que hace es: cada canción tiene una imagen añadida que es la asociada al evento click mediante la clase .eliminar. Cuando hacemos click la canción desparece de la lista lentamente y recogemos los datos que identificarán al registro eliminado para finalmente destruir del DOM dicho elemento. Hasta aquí perfecto!! El problema viene cuando al siguiente paso en el código quiero enviar los datos del elemento eliminado (id y mas cosas..) y los datos de los registros que quedan en la columna para actualizar en la BB.DD el orden de las canciones.
Por lo visto, la estructura para enviar por post es esta "$.post( url, [data], [callback], [type] ) " y en el código anterior así está hecho y funciona. Sin embargo en este último caso pues.... "medio-funciona". Tal y como yo he puesto el código está mal, lo se, pero he probado de todo y el problema está en esta línea:
Código:
$.post("scripts/update_order_recopilatorio.php", {env, del:del, deldisco:deldisco, delid:delid},....
Si lo pongo así envía los datos del registro eliminado:
Código:
$.post("scripts/update_order_recopilatorio.php", {del:del, deldisco:deldisco, delid:delid},.....
Si lo pongo así envía los datos de los registros que quedan en la columna excepto el eliminado claro:
Código:
$.post("scripts/update_order_recopilatorio.php", env,.....
En el momento que quiero enviar juntos todos estos datos, me da error en todos los casos siguientes o simplemente omite una información y envía la otra:
Código:
1--- $.post("scripts/update_order_recopilatorio.php", {env, del:del, deldisco:deldisco, delid:delid},.....
2--- $.post("scripts/update_order_recopilatorio.php", env, {del:del, deldisco:deldisco, delid:delid},.....
3--- $.post("scripts/update_order_recopilatorio.php", {del:del, deldisco:deldisco, delid:delid},env,.....
4--- $.post("scripts/update_order_recopilatorio.php", {env, del:del, deldisco:deldisco, delid:delid, env},.....
5--- $.post("scripts/update_order_recopilatorio.php", (env ,{del:del, deldisco:deldisco, delid:delid}),.....
6--- $.post("scripts/update_order_recopilatorio.php", {env + del:del, deldisco:deldisco, delid:delid},.....
7--- $.post("scripts/update_order_recopilatorio.php", env + {del:del, deldisco:deldisco, delid:delid},.....
Y un sinfín mas de pruebas que creo mejor no postear ahora, bastante larga es ya mi petición de ayuda ya... sorry!!
Se que no se pueden enviar varios post en un mismo evento ( tipo $.post()... $.post()... $.post()...), pero sé que esto que os comento sí que se puede hacer de alguna forma.... si alguién sabe qué puede estar pasando, desde ya MIL GRACIAS!!!
Sorry por el rollo y espero haberme explicado bien...
un saludo!!!