В общем с блока, где можно отсортировать элементы вручную при помощи jquery sortable приходит список айдишников в нужном порядке.
$( "#save_order" ).click(function() {
var order = $( "#sortable" ).sortable("toArray", {
attribute: 'data-id',
key: 'order[]',
expression: /(.+)/
});
$.post( "{$_SERVER['PHP_SELF']}", {
'order': order,
'news_id': "{$news_id}",
'action': "save_order",
}, function(data){
if ( data.status == "success" ) {
parent.toastr.success(data.message);
} else {
parent.toastr.error(data.message);
}
}, "json");
});
Принимающий скрипт такой:
// Определим правила валидации пришедших данных.
$args = [
'order' => [
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_FORCE_ARRAY,
'options' => [
'min_range' => 1,
'default' => 0,
],
],
];
// проверим на правильность и запишем в переменные для работы скрипта.
$filtered = filter_var_array($_POST, $args);
// Очистим пустые значения (которые не прошли валидацию).
$order = array_filter( array_values($filtered['order']) );
$db->beginTransaction();
try {
foreach ($order as $key=>$id) {
$position = (int) $key + 1;
$sql = "UPDATE `" . PREFIX . "_images` SET `position` = '{$position}' WHERE `image_id`='$id' AND `news_id`={$news_id}";
$db->query($sql);
}
$db->commit();
$response['status'] = "success";
$response['message'] = "Текущий порядок сохранен.";
} catch (\Exception $e) {
$db->rollBack();
$response['status'] = "error";
$response['message'] = $e->getMessage();
$logger->error("Cannot update order items. News id: " . $news_id . " | Exception: " . $e->getMessage());
}
echo json_encode($response);
exit();
Вот. Как оптимизировать это г-нище?
Ранее задавал вопрос:
Как обновить id сохраняя порядок?
Ответа не получил.
Дайте идею?!