Fehler ist, daß beim "bottom"-Sortieren plötzlich die Platzierungen wiederholen und ab sofort kein korrektes Sortieren mehr möglich ist.
Daher muß IMHO in folgendem Codeblock in _admin/manage_placeholder.php
Code: Alles auswählen
case 'bottom': // {{{
$q = "SELECT id, pos, templates_id FROM ".CPO_PLACEHOLDERS." "
."WHERE id=".(int)$_GET['id'];
$dbq = new DB;
$dbq->query($q);
$dbq->next_record();
$id = $dbq->v('id');
$pos = $dbq->v('pos');
$template_id = $dbq->v('templates_id');
$q = 'UPDATE '.CPO_PLACEHOLDERS.' '
.'SET pos=pos-1 '
.'WHERE templates_id='.(int)$template_id." "
.'AND pos>'.((int)$pos);
$dbq->query($q);
$q = 'UPDATE ' . CPO_PLACEHOLDERS . ' AS t1, ' .
'(SELECT MAX(pos) AS maxPos FROM ' . CPO_PLACEHOLDERS . ') AS t2 ' .
'SET t1.pos = t2.maxPos WHERE t1.id = ' . (int)$id;
$dbq->query($q);
$dbq->query(
'SELECT name FROM '.CPO_TEMPLATES.' '
.'WHERE id='.(int)$template_id
);
$dbq->next_record();
$templatename = $dbq->v('name');
$pholderpos = $pos+1;
$views = array('list');
break; // }}}
Code: Alles auswählen
$q = 'UPDATE ' . CPO_PLACEHOLDERS . ' AS t1, ' .
'(SELECT MAX(pos) AS maxPos FROM ' . CPO_PLACEHOLDERS . ') AS t2 ' .
'SET t1.pos = t2.maxPos WHERE t1.id = ' . (int)$id;
Code: Alles auswählen
$q = 'UPDATE ' . CPO_PLACEHOLDERS . ' AS t1, ' .
'(SELECT MAX(pos) AS maxPos FROM ' . CPO_PLACEHOLDERS . ') AS t2 ' .
'SET t1.pos = t2.maxPos+1 WHERE t1.id = ' . (int)$id;
Der Unterschied zu meinem ursprünglichen Code ist, daß ich die MAX-Position vor der Verschiebung ermittle (und somit +1 nicht erforderlich ist), im abgeleiteten Code in 4.1.x aber erst nach dem Verschieben aller anderen Platzhalter gezählt wird, wenn sich die aktuelle MAX-Position schon um 1 verringert hat, daher muß hier wieder 1 aufgeschlagen werden.
Und ich dachte schon, daß move_placeholders bereits diese Macke hätte...