Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » jQuery » Как сделать свой порядок вывода новостей и их смену через drag drop?

Как сделать свой порядок вывода новостей и их смену через drag drop?


     19.12.2022    jQuery, MySQL    357

вопрос
Всем привет, пожалуйста, помоги реализовать смену порядка "новостей" через drag & drop, естественно с AJAX обновлением БД.

Что уже мной сделано:
1) Есть страница на которой пользователь видит только свои "новости", только он имеет доступ к их редактированию и добавлению в данной категории.
2) Страница вывода сделана просто
  • title>
  • title
  • ...

3) В таблице dle_post создана ячейка в которой числовым значением указана позиция сортировки.
4) В шаблон вывода custom добавлена опция сортировки по этому полю.
--- на этом этапе все работает ---
5) Внесены все необходимые правки в добавление новости. Т.е., когда юзер добавляет новость на сайт, то после нажатия на кнопку "сохранить", скрипт считает количество строк в таблице в данной категории (мульти отключена), затем добавляет единицу и записывает новую строку с этим значением.
--- все еще работает :) ---
6) Если вдруг решил сменить категорию или ошибочно выбрал не ту, т.е. механизм редактирования уже существующего материала. После нажатия "сохранить", проверяем сменил ли категорию, если нет, оставляем индекс сортировки в покое, если да, то смотрим на ту категорию, которую он выбрал, берем массив постов оттуда в порядке нашего индекса, переписываем этим постам индекс сортировки заново с 1 до n (на случай если есть пробелы, например, если что-то было удалено), как всегда добавляем 1 к редактируемому и записываем в БД.
--- и тут все работает :) :) --
7) На странице вывода сделал js по подобию с одного из сайтов. Drag & drop работает, но не совсем так, как мне хотелось бы. Он меняет порядок, той, что drag на ту, что drop. А хотелось бы, что бы она падала "между" теми, где drop. Например, как в админке на страничке редактирования категорий. Там их можно перетаскивать, меняя порядок таким образом.

В какой помощи нуждаюсь:
1) Помогите, пожалуйста, с реализацией перетаскивания на позицию между других элементов, вместо замены мест одного с другим.
2) Самое важное, помогите, пожалуйста, с AJAX в связке с этим js кодом, что бы после события drop, порядок элементов перезаписывался по тем правилам, которые у меня получилось сделать - обновление индекса сортировки в созданной мной ячейке в БД.

Спасибо большое.

Ответа пока нет


6 комментариев

svbox
Юзер

svbox - 19 декабря 2022 20:14 -

Продолжая поиск ответа на свой вопрос, пришел к выводу, что хороший способ реализации - jquery-iu. С библиотекой разобрался.

Возник вопросы, подскажите, пожалуйста, как прикрутить вывод своей ячейки из БД. Например, аналогичной {news-id}. В моей ячейке содержится только число, предположим я хочу сделать тег {sort-index} для shortstory.

Спасибо.

svbox
Юзер

svbox - 20 декабря 2022 11:53 -

Получилось самостоятельно найти решение, свою задачу выполнил, код работает. Перетаскивание с помощью jquery-ui и сохранение в БД с помощью ajax. Делал вот по этому уроку.

Сохранение порядка естественно получилось довольно топорное - из этого примера, поэтому может кто-то подскажет, как переписать php код под "язык dle"? Что бы не было лишнего соединения с БЛ, как в примере, прикрыты дыры и т.д.


$dbh = new PDO('mysql:dbname=имябд;host=localhost', 'логин', 'пасс');

if (!empty($_POST['sort'])) {
	foreach ($_POST['sort'] as $i => $row) {
		$sth = $dbh->prepare("UPDATE dle_post SET sortid = :sort WHERE id = :id");
		$sth->execute(array('sort' => ++$i, 'id' => intval($row)));
	}
}


Он полностью у меня работает, просто хотелось бы написать его красиво. Спасибо.

TeraMoune
Эксперт

TeraMoune - 20 декабря 2022 20:31 -

Удалить
$dbh = new PDO('mysql:dbname=имябд;host=localhost', 'логин', 'пасс');


Поменять

$sth = $dbh->prepare("UPDATE dle_post SET sortid = :sort WHERE id = :id");
$sth->execute(array('sort' => ++$i, 'id' => intval($row)));


На

$row = intval($row);
$db->query("UPDATE ".PREFIX."_post SET sortid = '{$i}' WHERE id = '{$row}'");
$i++;

svbox
Юзер

svbox - 21 декабря 2022 18:46 -

Не сработало. Я не знаток внутренностей DLE, может где-то нужно сам php файл со скриптом объявить? Он просто лежит по адресу engine/ajax/. С Вашим исправлением код выглядит так.

if(!defined('DATALIFEENGINE')) {
	die( "Hacking attempt!" );
}

if (!empty($_POST['sort'])) {
	foreach ($_POST['sort'] as $i => $row) {
		$row = intval($row);
		$db->query("UPDATE ".PREFIX."_post SET sortid = '{$i}' WHERE id = '{$row}'");
		$i++;
	}
}

TeraMoune
Эксперт

TeraMoune - 22 декабря 2022 05:11 -

Обращаться к обработчику нужно через engine/ajax/controller.php?mod=file_name (без расширения).

svbox
Юзер

svbox - 22 декабря 2022 16:15 -

Все получилось, буду знать про вызов ajax.
Спасибо Вам большое.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

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

наверх