Le contexte
J’ai une base de données qui contient des éléments rangés par catégorie. Chaque élément:
- possède titre: champ libelle
- a id unique (entier, non-signé): champ id
- appartient à une catégorie: champ cat
- possède un champ pour ordonner (entier, non-signé): ord
Avant, j’utilisais mes enregistrement en les classant par ordre alphabétique. Il m’a été demandé de faire un ordre différent. Du coup, j’ai combiné PHP et Scriptaculous pour que cela soit plus facile à faire. On peut ré-arranger les éléments sur une page HTML par simple glisser-déposer et la base de données est mise à jour derrière.
Mise en garde
J’ai réalisé ce script pour me simplifier la vie mais en aucun cas pour le faire tourner sur un serveur de production (il n’est pas sécurisé, pas paramétrable, …)
Utilisation
Je suppose que dans chacun des deux fichiers sort.php et sort.ajax.php, un tableau $config existe et contient les valeurs suivantes:
- $config[‘sort_table’]: table à utiliser
- $config[‘sort_libelle’]: nom du champ qui contient le libellé
- $config[‘sort_ord’]: requête de tri pour la sélection (par exemple: ord ASC, libelle ASC)
- $config[‘sort_where’]: éventuelle clause WHERE (si on travaille seulement sur une partie de la table; dans mon cas: cat=5)
- $config[‘db_host’]: host pour la connexion MySQL
- $config[‘db_user’]: user pour la connexion MySQL
- $config[‘db_psw’]: password pour la connexion MySQL
- $config[‘db_db’]: base de données à utiliser
Fichier principal, sort.php:
<?php require 'sort.class.php'; $sort = new Sort( ); if( !$sort->MySQLConnect( $config['db_host'], $config['db_user'], $config['db_psw'], $config['db_db'] ) ) die( '!MySQL Connect' ); $sort->MySQLGetItems( $config['sort_table'], $config['sort_libelle'], $config['sort_ord'], $config['sort_where'] ); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Sort</title> <meta http-equiv="content-type" content="text/html;charset=iso-8859-1" /> <meta name="generator" content="Geany 1.22" /> <script src="resources/scriptaculous/lib/prototype.js" type="text/javascript"></script> <script src="resources/scriptaculous/src/scriptaculous.js?load=builder,effects,dragdrop,controls" type="text/javascript"></script> </head> <body> <?php echo $sort->BuildUL( ); ?> <script type="text/javascript"> Sortable.create( "sortable", { onUpdate: function( ) { new Ajax.Request( "sort.ajax.php", { method: "post", parameters: { data: Sortable.serialize( "sortable" ) } } ); } } ); </script> </body> </html>
Fichier sort.class.php:
<?php class Sort { public $error = NULL; private $items = array( ); // [ ] = id, libelle public function MySQLConnect( $host, $user, $psw, $db ) { if( !@mysql_connect( $host, $user, $psw ) || !@mysql_select_db( $db ) ) { $this->error = 'MYSQL_CONNECT'; return false; } return true; } public function MySQLGetItems( $table, $libelle, $order, $where ) { if( !( $ret = mysql_query( 'SELECT id, ' . $libelle . ' FROM ' . $table . ( empty( $where ) ? '' : ' WHERE ' . $where ) . ( empty( $order ) ? '' : ' ORDER BY ' . $order ) ) ) ) { $this->error = 'GET_DATA'; return false; } while( $row = mysql_fetch_row( $ret ) ) $this->items[ ] = $row; } public function BuildUL( $ULid = 'sortable', $LIprefix = 'item_' ) { $buffer = '<ul id="' . $ULid . '">'; foreach( $this->items as $item ) $buffer .= '<li id="' . $LIprefix . $item[0] . '">' . $item[1] . '</li>'; $buffer .= '</ul>'; return $buffer; } } ?>
Fichier sort.ajax.php
<?php require 'sort.class.php'; require 'resources/conf.inc.php'; $config['sort_table'] = 'c_communs'; $config['sort_libelle'] = 'libelle'; $config['sort_ord'] = 'ord ASC, libelle ASC'; $config['sort_where'] = 'cat=5 AND libelle<>\'\''; if( !isset( $_POST['data'] ) ) die( '!Data' ); $sort = new Sort( ); if( !$sort->MySQLConnect( $config['db_host'], $config['db_user'], $config['db_psw'], $config['db_db'] ) ) die( '!MySQL Connect' ); parse_str( $_POST['data'] ); $query = ''; $max = count( $sortable ); for( $i = 0; $i < $max; $i++ ) { if( !mysql_query( 'UPDATE ' . $config['sort_table'] . ' SET ord=' . $i . ' WHERE id=' . $sortable[ $i ] ) ) die( '!Update: ' . 'UPDATE ' . $config['sort_table'] . ' SET ord=' . $i . ' WHERE id=' . $sortable[ $i ] . '<br />' . mysql_error( ) ); } ?>
Laisser un commentaire