Il drag and drop linkato da telegio consente di variare manualmente l'ordine delle righe di una tabella ma non risolve il problema nel caso dell'inserimento di un nuovo record con campo ordine=1, in tal caso si creerebbe un duplicato.
io mi sono creato una classe PHP (che sto ancora sistemando visto che non è così intuitiva da utilizzare) che mi permette di ordinare arbitrariamente i dati di qualunque tabella, mantenendo l'ordine corretto anche in casi di delete, update o insert.
In pratica non solo permette di spostare la posizione dei record tra loro tramite comode freccette, ma riaggiorna anche correttamente l'ordine sequenziale quando un record viene cancellato o quando ne viene inserito uno nuovo.
Posto il codice utilizzato, se qualcuno è interessato si potrebbe provare a migliorarlo.
Codice PHP:
class CustomOrder {
public function balancePosition($action, $table, $primarykey, $whereclause='') {
switch ($action) {
case 'add':
$counter = 2;
break;
case 'clean':
$counter = 1;
break;
}
$sql = "SELECT ".$primarykey." FROM ".$table.$this->setWhereClause(1, $whereclause)." ORDER BY position";
$result = mysql_query($sql);
while($row = mysql_fetch_array($result)) {
$usql = "UPDATE ".$table." SET position='".$counter."' WHERE ".$primarykey."='$row[$primarykey]'".$this->setWhereClause(2, $whereclause)."";
$uresult = mysql_query($usql);
$counter++;
}
}
public function movePosition($direction, $position, $table, $whereclause='') {
switch ($direction) {
case 'up':
$swap = ($position > 1) ? $position-- : 1;
break;
case 'down':
$sql = "SELECT count(*) FROM ".$table.$this->setWhereClause(1, $whereclause);
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$max = $row[0];
$swap = ($position < $max) ? $position++ : $max;
break;
default:
$swap = $position;
}
$sql = "UPDATE ".$table." SET position = CASE position WHEN ".$position." THEN ".$swap." WHEN ".$swap." THEN ".$position." END WHERE position IN (".$position.", ".$swap.")".$this->setWhereClause(2, $whereclause);
$result = mysql_query($sql);
}
private function setWhereClause($type, $whereclause) {
if ($whereclause!='') {
switch ($type) {
case 1:
$whereclause = " WHERE ".$whereclause;
break;
case 2:
$whereclause = " AND ".$whereclause;
break;
}
}
return $whereclause;
}
}