IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

dataTables + extra colonnes et tri sur les colonnes !


Sujet :

jQuery

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 165
    Points : 39
    Points
    39
    Par défaut dataTables + extra colonnes et tri sur les colonnes !
    Bonsoir,

    Me revoici avec mon dataTables et mes péripéties (...suite et fin, sûrement !).
    Et j'ai encore besoin de votre aide.
    Pourrez-vous me consacrer un peu de votre temps pour m'aider ?
    C'est un problème JSON, apparemment (... à l'aide, je n'y connais rien en JSON !)

    Pour (presque) y arriver ?), j'utilise cette source du fichier server_processing adaptée. Elle vient d'ici...
    Pas mal cette source, mais cela ne fonctionne pas !!!

    Maintenant, je m'explique.
    J'ai une table avec 18 colonnes (dont 4 sont des extra colonnes, des colonnes dynamiques)
    Ces extra-colonnes sont en 1ere, 15e et 16e, 18e position dans la dataTables.
    Sur toutes les colonnes de la dataTables (donc sur les 18 colonnes), je souhaiterais bénéficier du tri croissant et décroissant.

    Voici la structure de ma dataTable
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
                                <th align='center' style='width:25px;'></th>
                                <th align='left'>&nbsp;idreference</th>
                                <th align='left'>&nbsp;forme</th>
                                <th align='right' style='width:30px;'>&nbsp;carat</th>
                                <th align='left'>&nbsp;taille</th>
                                <th align='center' style='width:45px;'>&nbsp;couleur</th>
                                <th align='center' style='width:45px;'>&nbsp;pureté</th>
                                <th align='center' style='width:45px;'>&nbsp;poli</th>
                                <th align='center' style='width:45px;'>&nbsp;sym</th>
                                <th align='center' style='width:45px;'>&nbsp;prof</th>
                                <th align='center' style='width:45px;'>&nbsp;table</th>
                                <th align='center' style='width:45px;'>&nbsp;fluo</th>
                                <th align='right' style='width:45px;'>&nbsp;prix/ct</th>
                                <th align='center' style='width:45px;'>&nbsp;colette</th>
                                <th align='right' style='width:45px;'>&nbsp;Lg/lg</th>
                                <th align='right'>&nbsp;délai</th>
                                <th align='right'>&nbsp;prix</th>
                                <th>&nbsp;détail</th>

    Et voici maintenant les problèmes (du json, à mon avis...) :
    - en fait quand je clique sur la demande de tri de la 1er colonne, rien n'a l'air de se faire !
    - quand je veux du tri sur la 2e col, c'est la 3e qui est triée (et cela jusqu'à la colonne 13 comprise)
    - quand je veux du tri sur la 14e col, le tri est loin d'être efficace,
    - quand je veux du tri sur la 15e, 16e, 17e et 18e col, et j'obtiens, pour ces 4 colonnes, un message JSON ...et le tri n'est pas sûr du tout...!!!
    DataTables warning : JSON data from server could not be parsed. This is caused by a JSON formating error
    Pouvez-vous m'aider ?

    Je l'utilise dans cette page.
    J'utilise le server_processing, sous le nom de "js/dt/chargementdata.php",
    que voici :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
     
    <?php
    	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    	 * Easy set variables
    	 */
     
    	/* Array of database columns which should be read and sent back to DataTables. Use a space where
    	 * you want to insert a non-database field (for example a counter or static image)
    	 */
    	$aColumns = array( 'item_id', 'cut', 'carat', 'cut_grade', 'color', 'clarity', 'polish', 'symmetry', 'depth', 'table', 
    		'fluo_intensity', 'price_per_carat', 'culet_size', 'total_price');
     
    	/* Indexed column (used for fast and accurate table cardinality) */
    	$sIndexColumn = "item_id";
     
    	/* DB table to use */
    	$sTable = "diamant_data";
     
    	/* Database connection information */
    	$gaSql['user']       = "***";
    	$gaSql['password']   = "***";
    	$gaSql['db']         = "***";
    	$gaSql['server']     = "***";
     
    	/* REMOVE THIS LINE (it just includes my SQL connection user/pass) */
    	/* include( $_SERVER['DOCUMENT_ROOT']."/datatables/mysql.php" ); */
     
     
    	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    	 * If you just want to use the basic configuration for DataTables with PHP server-side, there is
    	 * no need to edit below this line
    	 */
     
    	/* 
    	 * MySQL connection
    	 */
    	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
    		die( 'Could not open connection to server' );
     
    	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
    		die( 'Could not select database '. $gaSql['db'] );
     
    mysql_set_charset( 'utf8' ); 	
    	/* 
    	 * Paging
    	 */
    	$sLimit = "";
    	if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' )
    	{
    		$sLimit = "LIMIT ".intval( $_GET['iDisplayStart'] ).", ".
    			intval( $_GET['iDisplayLength'] );
    	}
     
     
    	/*
    	 * Ordering
    	 */
    	$sOrder = "";
    	if ( isset( $_GET['iSortCol_0'] ) )
    	{
    		$sOrder = "ORDER BY  ";
    		for ( $i=0 ; $i<intval( $_GET['iSortingCols'] ) ; $i++ )
    		{
    			if ( $_GET[ 'bSortable_'.intval($_GET['iSortCol_'.$i]) ] == "true" )
    			{
    				$sOrder .= "`".$aColumns[ intval( $_GET['iSortCol_'.$i] ) ]."` ".
    					($_GET['sSortDir_'.$i]==='asc' ? 'asc' : 'desc') .", ";
    			}
    		}
     
    		$sOrder = substr_replace( $sOrder, "", -2 );
    		if ( $sOrder == "ORDER BY" )
    		{
    			$sOrder = "";
    		}
    	}
     
     
    	/* 
    	 * Filtering
    	 * NOTE this does not match the built-in DataTables filtering which does it
    	 * word by word on any field. It's possible to do here, but concerned about efficiency
    	 * on very large tables, and MySQL's regex functionality is very limited
    	 */
    	$sWhere = "";
    	if ( isset($_GET['sSearch']) && $_GET['sSearch'] != "" )
    	{
    		$sWhere = "WHERE (";
    		for ( $i=0 ; $i<count($aColumns) ; $i++ )
    		{
    			$sWhere .= "`".$aColumns[$i]."` LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ";
    		}
    		$sWhere = substr_replace( $sWhere, "", -3 );
    		$sWhere .= ')';
    	}
     
    	/* Individual column filtering */
    	for ( $i=0 ; $i<count($aColumns) ; $i++ )
    	{
    		if ( isset($_GET['bSearchable_'.$i]) && $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' )
    		{
    			if ( $sWhere == "" )
    			{
    				$sWhere = "WHERE ";
    			}
    			else
    			{
    				$sWhere .= " AND ";
    			}
    			$sWhere .= "`".$aColumns[$i]."` LIKE '%".mysql_real_escape_string($_GET['sSearch_'.$i])."%' ";
    		}
    	}
     
     
    	/*
    	 * SQL queries
    	 * Get data to display
    	 */
    	$sQuery = "
    		SELECT SQL_CALC_FOUND_ROWS `dimensions`, `country`, `".str_replace(" , ", " ", implode("`, `", $aColumns))."`
    		FROM   $sTable
    		$sWhere
    		$sOrder
    		$sLimit
    		";
    	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
     
    	/* Data set length after filtering */
    	$sQuery = "
    		SELECT FOUND_ROWS()
    	";
    	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
    	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
    	$iFilteredTotal = $aResultFilterTotal[0];
     
    	/* Total data set length */
    	$sQuery = "
    		SELECT COUNT(`".$sIndexColumn."`)
    		FROM   $sTable
    	";
    	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
    	$aResultTotal = mysql_fetch_array($rResultTotal);
    	$iTotal = $aResultTotal[0];
     
     
    	/*
    	 * Output
    	 */
    	$aColumns = array( 'zone1', 'item_id', 'cut', 'carat', 'cut_grade', 'color', 'clarity', 'polish', 'symmetry', 'depth', 'table', 
    		'fluo_intensity', 'price_per_carat', 'culet_size', 'zone2', 'zone3', 'total_price', 'zone4');
    	$output = array(
    		"sEcho" => intval($_GET['sEcho']),
    		"iTotalRecords" => $iTotal,
    		"iTotalDisplayRecords" => $iFilteredTotal,
    		"aaData" => array()
    	);
     
    	while ( $aRow = mysql_fetch_array( $rResult ) )
    	{
    		$row = array();
    		for ( $i=0 ; $i<count($aColumns) ; $i++ )
    		{
    			if ( $aColumns[$i] == "version" )
    			{
    				/* Special output formatting for 'version' column */
    				$row[] = ($aRow[ $aColumns[$i] ]=="0") ? '-' : $aRow[ $aColumns[$i] ];
    			}
    			else if ( $aColumns[$i] == "zone1" )
    			{
    				/* Special output formatting for 'version' column */
    				$comparer = trim($aRow[ 'item_id' ]);
    				$row[] = "<input type='checkbox' name='comparer[".$nbresultat."]' id='comparer".$comparer."' class='curseur' value='".$comparer."'> ";
     
     
    			}
    			else if ( $aColumns[$i] == "zone2" )
    			{
    				/* Special output formatting for 'version' column */
    				$dimensions = trim($aRow[ 'dimensions' ]);
    				$mesures = explode("x",$dimensions);
    				if ($mesures[0] != 0 AND $mesures[1] != 0) {
    					if ($mesures[0] > $mesures[1]) {
    						$rll = round($mesures[0] / $mesures[1], 2);
    					} else {
    						$rll = round($mesures[1] / $mesures[0], 2);
    					}
    				} else {
    					$rll = "nc";
    				}
    				$row[] = $rll;
    			}
    			else if ( $aColumns[$i] == "zone3" )
    			{
    				/* Special output formatting for 'version' column */
    				$pays = trim($aRow[ 'country' ]);
    				switch ($pays) {
    					case "IN":
    						$delai = "5 jours";
    						break;
    					case "FR":
    						$delai = "7 jours";
    						break;
    					default:
    						$delai = "15 jours";
    						break;
    				}
    				$delai = rand(1,99)." jours";
    				$row[] =$delai;
    			}
    			else if ( $aColumns[$i] == "zone4" )
    			{
    				/* Special output formatting for 'version' column */
    				$row[] = "<a href='index.php'><div class='voir'>Détails</div></a>";
    			}
    			else if ( $aColumns[$i] != ' ' )
    			{
    				/* General output */
    				$row[] = $aRow[ $aColumns[$i] ];
    			}
    		}
     
    		$output['aaData'][] = $row;
    	}
     
    	echo json_encode( $output );
    ?>

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 165
    Points : 39
    Points
    39
    Par défaut
    Je confirme que le problème
    est bien un problème JSON !!!

    Puis-je avoir de l'aide en JSON ?
    D'avance, je vous en remercie !

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Je ne connais pas le plugin datatable (vu le nombre de questions sur le sujet, il faudra que je m'y mette un jour) et très mal le PHP (je n'ai pas l'intention de m'y remettre).

    Ce que je voudrais voir c'est le résultat de echo json_encode( $output ); tel qu'il apparaît dans la console d'un navigateur.

  4. #4
    Membre averti Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Points : 390
    Points
    390
    Par défaut
    Bonjour jytest,

    Dans ton fichier "js/dt/chargementdata.php", la variable $aColumns est déclarée deux fois :
    - ligne 10
    - ligne 149

    Or dans la déclaration ligne 10 il n'y a que 14 colonnes renseignées tandis qu'à celle de la ligne 149 il y a bien les 18 colonnes renseignées.

    Vue que tu boucles une fois avec l'une et une fois avec l'autre ton problème ne viendrait-il pas de ça ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 165
    Points : 39
    Points
    39
    Par défaut
    A l'heure actuelle, j'ai un problème de tri ascendant ou descendant !
    A l'aide.

    Au niveau du JSON... C'est résolu...
    J'ai trompé l'espion sur certaines thead...
    J'ai mis plusieurs fois la même variable id...
    Cela a l'air de fonctionner à ce niveau-là !!!

  6. #6
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par jytest Voir le message
    Au niveau du JSON... C'est résolu...
    J'ai trompé l'espion sur certaines thead...
    J'ai mis plusieurs fois la même variable id...
    Cela a l'air de fonctionner à ce niveau-là !!!

  7. #7
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 664
    Points
    66 664
    Billets dans le blog
    1
    Par défaut
    Que veux tu que l'on fasse avec les indices que tu nous donnes ???
    Ce charabia ne nous permet nullement de cerner ton souci.
    Donc soit tu te décides à nous indiquer des sympotmes clairs et précis, soit tu abandonnes l'idée de trouver de l'aide ici...
    J'ai mis plusieurs fois la même variable id...
    ???
    ça veut dire quoi ça ? si tu parle des id de balises html, un id doit être unique sur une page !!

Discussions similaires

  1. [PROC] Tri sur les colonnes pour chaque ligne
    Par san25 dans le forum SAS Base
    Réponses: 2
    Dernier message: 02/10/2013, 11h25
  2. Question sur les tableaux avec en-têtes fixes et tri sur les colonnes
    Par lolo5935 dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 29/07/2010, 15h50
  3. Récupérer les tris sur les colonnes d'un DataGrid
    Par ToniConti dans le forum Flex
    Réponses: 4
    Dernier message: 15/02/2010, 16h52
  4. [struts]: Pagination et tri sur les colonnes
    Par sleepy2002 dans le forum Struts 1
    Réponses: 3
    Dernier message: 09/07/2007, 15h16
  5. [MySQL] [PHP] Choix du tri sur les colonnes
    Par blueice dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 07/05/2007, 21h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo