@AlikDex

Как это оптимизировать?

В общем с блока, где можно отсортировать элементы вручную при помощи 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 сохраняя порядок?
Ответа не получил.
Дайте идею?!
  • Вопрос задан
  • 191 просмотр
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
UPDATE `table` 
  SET `position` = FIND_IN_SET(`image_id`, :image_ids_list)
  WHERE `news_id` = :news_id
    AND FIND_IN_SET(`image_id`, :image_ids_list) != 0
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы