JQuery, checkbox et pagination

et si tu remplaçais

par

edit: galère les copié/collé de code …

Bon en fait j’ai trouvé en cherchant y’avais des discutions là dessus donc j’ai trouvé pour récupérer les lignes cachés. Résultat, ça marche bien et ça coche sur toutes les pages. par contre à l’enregistrement, ça m’a l’air de sauvegarder que les changements de la page courante (la case à cocher est un champ de mes contacts)

La fonction :

[CODE]
$.fn.dataTableExt.oApi.fnGetHiddenNodes = function ( oSettings )
{
/* Note the use of a DataTables ‘private’ function thought the ‘oApi’ object */
var anNodes = this.oApi._fnGetTrNodes( oSettings );
var anDisplay = $(‘tbody tr’, oSettings.nTable);

 /* Remove nodes which are being displayed */
 for ( var i=0 ; i<anDisplay.length ; i++ )
 {
	 var iIndex = jQuery.inArray( anDisplay[i], anNodes );
	 if ( iIndex != -1 )
	 {
		 anNodes.splice( iIndex, 1 );
	 }
 }

 /* Fire back the array to the caller */
 return anNodes;

};
[/CODE]

Mon implémentation :

[CODE]
var oTable = $(’#contacttable’).dataTable();

    $('#checkall').click( function () {
	    $('input', oTable.fnGetNodes()).attr('checked',$('#checkall').is(':checked'));
	    $('input', oTable.fnGetHiddenNodes()).attr('checked',$('#checkall').is(':checked'));
    } );

[/CODE]

C’est normal, ton form ne valide que les elements contenus entre les 2 balises et , ie ce qui est dans le code html au moment ou tu cliques sur le bouton enregistrer.

Il faut que tu envoies à ton form l’intégralité de ton tableau, pour cela , t’as plusieurs solutions

  • serialiser ton tableau complet et passer le resultat lors du submit (dans une variable hidden par ex) et retraiter cette variable coté serveur
  • afficher tout le tableau complet avant de submit ton form (virer la pagination donc)

Yep merci :). Le site de datatables est vraiment complet. J’ai vu et exemple :

[CODE]
var oTable;
$(document).ready(function() {
$(’#form’).submit( function() {
var sData = $(‘input’, oTable.fnGetNodes()).serialize();
alert( “The following data would have been submitted to the server: \n\n”+sData );
return false;
} );

oTable = $(’#example’).dataTable();
} );
[/CODE]

Chez eux ça semble marcher. Chez moi, en cliquant sur le bouton enregistrer, ça m’affiche pas l’alerte. Doit y avoir un truc avec le formulaire salesforce. Je vais tenter de voir ça :).

Parceque l’id de ton form n’est pas myForm mais j_id0:myform

tu dois avoir une fonction qui permet de recup le node du form via ton plugin, remplace cette appel avec $(’#myForm’)

Yep j’ai essayé avec le #j_id0:myform mais ça semble pas marcher non plus, c’est vraiment bizarre. Je continue de cherche si y’a moyen de récupérer le formulaire autrement :slight_smile:

faut p’tet rajouter

oTable = $(’#example’).dataTable();
dan ta fonction

var oTable;
$(document).ready(function() {
$(’#form’).submit( function() {
oTable = $(’#example’).dataTable(); <---------------

var sData = $(‘input’, oTable.fnGetNodes()).serialize();
alert( “The following data would have been submitted to the server: \n\n”+sData );
return false;
} );

oTable = $(’#example’).dataTable();
} );

Nope c’est pas ça, elle est définie avant, je l’utilise pour une autre fonction. Le truc c’est que je pense que ça merde avec le $(’#form’).submit(function() car je n’ai pas l’alerte donc la fonction doit pas être appelé, ce qui s’expliquerait si l’id est pas bon ou un truc du genre

oui il faudrait l’appeler

$('#j_id0:myform').submit( function() {

et ça marche pas avec ça d’après ce que tu dis

Oui déjà essayé avec ça et ça marche pas mais ça doit venir de là. J’ai pas encore eu le temps de chercher cet après midi mais je vais investiguer.

bon, essaie autre chose

dans la balise rajoute un rel=“monform” et appelle le comme ca avec JQuery $(“form[rel=‘monform’]”)

autre idee, ton plugin intercepte deja le submit du form. donc tente deja de faire apparaitre l’alert du le simple click du bouton
$(’#TheButton’).click(alert(‘toto’));

si ca marche, alors remplace l’alert par une fonction qui submit le form, ca devrait declencher l’event submit et voit ou tu passes (install FireBug pour executer le JS pas à pas)

Alors :

  • J’ai regardé la console d’erreur et il m’en met une quand je fais $(’#maPage:monForm’), yant remplacé le pas beau j_id0. Erreur me disant qu’il accepte pas les « : ».
  • je peux pas utiliser le rel=« monform » car étant dans un context salesforce, je suis obligé d’utiliser leur balise qui se transforme en html à l’affichage (apex:form) et rel n’est pas un attribue supporté. Par contre y’a du [background=rgb(243, 243, 236)]onsubmit[/background] donc y’a peut être moyen d’appeler une fonction contenant le code
  • sinon quand je remplace le $(’#myForm’).submit par $(’#theButton’).click, l’alerte est déclenché et contient bien mes données donc le code marche mais n’est pas appelé au submit.

Donc la solution serait bien d’appeler une méthode lors du onsubmit. Je remanie le code comment ? En tout cas merci de prendre tout ce temps pour m’aider ! :slight_smile:

tu peux remplacer $(’#maPage:monForm’) par $(’#maPage:monForm’) ?

Nope toujours pas :

Uncaught Error: Syntax error, unrecognized exp<b></b>ression: unsupported pseudo: myForm

Bon j’ai trouvé !

$("form[id='thePage:myForm']").submit( function() {

Plus qu’à tester en live.

GG ! j’avais une autre méthode plus degueu :

$(’#maPage’+’:’+‹ monForm ›)

:slight_smile:

Héhé :). Bon par contre, que je comprenne bien, le code :

$("form[id='thePage:myForm']").submit( function() {
var sData = $('input', oTable.fnGetNodes()).serialize();
alert( "The following data would have been submitted to the server: \n\n"+sData );
return false;
} );

oTable = $('#contacttable').dataTable();

il est sensé passer la table entière lors du submit ou y’a quelque chose de plus à faire ?
Bon sinon l’action qui est normalement associé à mon bouton enregistrer, qui post automatiquement le formulaire au serveur pour mettre à jour la classe qui sert de controler à ma page, se déclenche pas. Le jquery doit prendre le pas dessus. Bon par contre j’ai un moyen d’appeler la classe avec du javascript. Je l’ai jamais fait mais je vais essayer histoire d’appeler ma méthode « enregister » dans ma classe

Quelle merde, tout ça pour essayer d’améliorer l’expérience utilisateur… J’aurais du laisser les écrans de loading :stuck_out_tongue:

le submit ne fait que serialiser ton tableau et l’afficher dans une alert, il renvoit meme false à la fin pour arreter le submit.

Donc virer le return false, affecter la valeur de la variable sData à un type hidden et coté serveur tu traites la serialisation passé par cette variable.

Arf ouai bon je suis pas équipé pour faire ça. Disons qu’en natif, le tableau est une liste d’objet qui sont automatiquement bindé avec le serveur. En temps normal, un submit met automatiquement à jour les modifications dans les objets de la classe côté serveur. Du coup, si je veux pas à avoir à manipuler moi même les données (et encore une fois c’est pour que ça aille plus vite à l’affichage que je met du jquery, pas pour me compliquer la vie de l’autre côté ^^) autant trouver une solution alternative, comme afficher l’ensemble du tableau en virant la pagination ou je ne sais quoi au moment du submit. J’essaierais ça la semaine prochaine :slight_smile:

Pour info, le ‘:’ devait t’embêter parce que jquery devait penser qu’il s’agit d’une pseudo-classe (comme :first pour n’avoir que le premier élément), donc en effet en indiquant sans équivoque que ça fait partie de l’id ça marche bien.

Sinon pour que jquery ne crie pas avec les “:” il faut mettre \ devant (oui deux, c’est pas une faute de frappe) et là, plus de problème!