Введите поисковый запрос

drag and drop для ajax сортировки элементов Битрикс

На одном из проектов, у меня появилась задача добавить возможность сортировки фотографий с помощью drag and drop. Какждая фотография это отдельный элемент инфоблока.

<ul id="sortable-list" class="bl_ft_aj_o_nas">
<ul id="sortable-list" class="bl_ft_aj_o_nas">
<?
$arSelect = Array("ID", "NAME", "PREVIEW_PICTURE");
$arFilter = Array("IBLOCK_ID"=>IntVal(42), "ACTIVE"=>"", "PROPERTY_SALON_ID"=>$id_orgiginal);
$res = CIBlockElement::GetList(Array("SORT"=>"asc"), $arFilter, false, Array("nPageSize"=>500), $arSelect);
while($ob = $res->GetNextElement())
{
$arFields = $ob->GetFields();
$file = CFile::ResizeImageGet($arFields['PREVIEW_PICTURE'], array('width'=>161, 'height'=>161), BX_RESIZE_IMAGE_EXACT, true);
$sl_img = $file['src'];
echo '



<li class="sortable-item" data-id="'. $arFields['ID'].'"   data-sort="'. $arFields['SORT'].'">
<img src="'.$sl_img.'" alt=""  >
<a href="" class="dell_img" rel="'. $arFields['ID'].'"><i class="fas fa-trash-alt blue_icon"></i> Удалить картинку</a><br>
</li>

'
}
?>
</ul>

Далее добавляем стили



<style>
#sortable-list{
display: flex;
list-style-type: none;
padding: 0;
margin: 0;
justify-content: flex-start;
flex-wrap: wrap;
}

.sortable-item {
width: 150px;
height: 150px;
margin: 20px;
border: 1px solid #ccc;
cursor: move;
}

</style>

Ajax сортировка

После перетаскивания фотографии, мне необходимо поменять сортировку файлов. Для этого создадим файл change_sort.php и добавлю его в папку ajax.

содержания файла change_sort.php


<?
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
CModule::IncludeModule("iblock");

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $data = json_decode(file_get_contents("php://input"), true);
    foreach ($data as $item) {
        $id = $item['id'];
        $sort = $item['sotr'];
        if (!$sort) $sort = 500;
        $el = new CIBlockElement;
        $arLoadProductArray = Array(
            "SORT" => $sort
        );
        if ($PRODUCT_ID = $el->Update($id, $arLoadProductArray))
            echo "Обновлен элемент с ID $id и новым значением сортировки $sort<br>";
    }
}


?>


для проверки работы, я добавил еще дополнительно вывод информации. При необходимости можно его убрать
Осталось на все это дело навесить скрипт.

Код скрипта


        const sortableList = document.getElementById("sortable-list");
        let draggedItem = null;

        sortableList.addEventListener("dragstart", function(event) {
            const target = event.target.closest(".sortable-item");
            if (!target) return;
            draggedItem = target;
            event.dataTransfer.setData("text/plain", null);
        });

        sortableList.addEventListener("dragover", function(event) {
            event.preventDefault();
            const target = event.target.closest(".sortable-item");
            if (!target) return;
            const targetRect = target.getBoundingClientRect();
            const draggedItemRect = draggedItem.getBoundingClientRect();
            const afterElement = event.clientX < targetRect.left + targetRect.width / 2 ? target : target.nextElementSibling;
            const draggable = document.querySelector(".dragging");
            if (afterElement == null) {
                sortableList.appendChild(draggedItem);
            } else {
                sortableList.insertBefore(draggedItem, afterElement);
            }
        });

        function getDragAfterElement(container, y) {
            const draggableElements = [...container.querySelectorAll(".sortable-item:not(.dragging)")];
            return draggableElements.reduce((closest, child) => {
                const box = child.getBoundingClientRect();
                const offset = y - box.top - box.height / 2;
                if (offset < 0 && offset > closest.offset) {
                    return { offset: offset, element: child };
                } else {
                    return closest;
                }
            }, { offset: Number.NEGATIVE_INFINITY }).element;
        }

        sortableList.addEventListener("dragend", function(event) {
            const items = [...sortableList.querySelectorAll('.sortable-item')];
            const newSortOrder = items.map((item, index) => {
                item.setAttribute('data-sort', index + 1);
                return {
                    id: item.getAttribute('data-id'),
                    sotr: item.getAttribute('data-sort')
                }
                console.log(items);

            });

            // Отправляем запрос AJAX на сервер с новыми значениями data-id
            const xhr = new XMLHttpRequest();
            xhr.open('POST', '/profile/moderator/ajax_new/change_sort.php');
            xhr.setRequestHeader('Content-Type', 'application/json');
            xhr.onload = function() {
                if (xhr.status === 200) {
                    console.log('Sort order updated successfully');
                } else {
                    console.error('Error updating sort order');
                }
            };
            xhr.send(JSON.stringify(newSortOrder));
        });



Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий


Стоимость разработки сайта

Я не оцениваю работу в часах, так как в итоге, Вы все равно захотите узнать общую стоимость и срок выполнения.

При оценке проекта или работ я сразу называю стоимость и срок выполнения. Стоимость моих работ не обсуждается. Я называю реальную стоимость за которую готов взяться за ваш проект. Не торгуюсь и не объясняю "а почему это стоит столько?"
Денис Бунаков

Узнать точную стоимость разработки сайта или приложения: Для этого я могу попросить Вас заполнить какой нибудь бриф, но зачем Вам это надо?:

Оставить заявку

И мы все спокойно обсудим либо по телефону, либо удобным для Вас способом например в месенджере

Часто задаваемые вопросы

  • На какой CMS создаете сайты в Новосибирске?
    Обычно мы используем для работы CMS-систему «1С-Битрикс» т.к это наиболее надежная и удобная CMS. Так же она достаточно гибка для разработки на котором можно от обычных сайтов визиток до полноценный масштабных порталов и даже маркетплейсов
  • Какие гарантии есть на создание сайта в Новосибирске?
    Я предлагаю гарантию на исправление ошибок и техническую поддержку в течение 12 месяцев (1 года) после запуска сайта. Это включает в себя устранение багов и обеспечение корректной работы всех функций. Я также гарантируем соблюдение сроков и качества выполнения работ. Я на столько уверен в качестве своих работ, что готов давать такую большую гарантию
  • Можно ли в дальнейшем менять самостоятельно информацию или только с помощью вас?
    Да, вы сможете самостоятельно изменять информацию на сайте, либо загружать их в электронном виде пакетными методами. Предоставляем подробные инструкции и обучающие материалы как всем пользоваться, чтобы вы могли легко управлять контентом. Однако, если у вас возникнут сложности или потребуется помощь, наша команда всегда готова помочь.
  • Вы оказываете услуги по созданию сайта и технической поддержки по договору ?
    Да, мы работаем только по договору как с юридическими, так и с физическими лицами. Вся необходимая бухгалтерская отчетность предоставляется своевременно.
  • Можно ли перенести уже существующий сайт на платформу 1С-Битрикс?
    Да, перенос сайта на другую платформу возможен, но это сложный процесс, который требует внимательной подготовки. Важно сохранить все данные (контент, изображения, SEO-настройки) и перенести функционал без потерь. Процесс может включать переписывание части кода и настройку новой платформы. Это особенно актуально, если текущая платформа не поддерживает новые функции или технологии. В моем портфолио есть сайт CибНИА имени С. А. Чаплыгина который как раз я полностью перенес на систему 1С битрикс с сохранением всего функционала
  • Чем отличается разработка сайта на шаблоне от индивидуального проекта?
    Сайт на шаблоне создается на основе готового дизайна, что снижает стоимость и ускоряет процесс разработки. Любой шаблон можно кастомизировать под себя НО! Иногда кастомизация может выйти дороже чем индивидуальная разработка. Дополнительно, в шаблонном решение может не быть нужного функционала. Индивидуальный проект создается с нуля по уникальному дизайну и потребностям клиента, что позволяет гибко настраивать функционал, но требует больше времени и ресурсов.
  • Следите ли вы за скоростью загрузки сайта?
    Да на всех этапах скорость загрузки сайта, чистота и оптимизация кода проходят тестирование и правки при ошибках, если хотите, то вы можете принимать активное участие на всех этапах.
  • Какая стоимость разработки сайта в Новосибирске и Москве?
    Стоимость создания и разработки сайта варьируется в зависимости от его сложности и функциональности. Например, базовый вариант может стоить от 100 000 рублей, в то время как более сложные проекты, например сайты интернет-магазинов или корпоративные порталы, могут стоить от 550 000 рублей и выше. Я готов обсудить требования и предложить оптимальное решение, соответствующее вашему бюджету. От региона присутствия сайта стоимость моих работ не меняется. Я не считаю что стоимость сайта в Москве должна превышать стоимость сайта в Новосибирске
  • Как будет работать мой сайт на мобильном телефоне?
    Я разрабатываю сайты с учетом адаптивного дизайна, что обеспечивает их корректное отображение и функциональность на всех устройствах, включая мобильные телефоны и планшеты. Это означает, что сайт будет автоматически подстраиваться под размер экрана, обеспечивая удобство использования и быстрое время загрузки на мобильных устройствах. Мои сайты отличаются доступным и привлекательным юзабилити, которые работают корректно и максимально профессионально увеличивают вашу прибыль.
  • Сколько времени уходит на создание сайта под ключ?
    Сроки разработки интернет-ресурса зависят от сложности проекта, в среднем, создание нового сайта занимает от 4 до 15 недель. Более сложные сайты могут потребовать больше времени. Но бывают проекты которые занимают до 1 года на разработку. Все очень индивидуально и примерные сроки я смогу озвучить после знакомства с Вами