Как сделать отображение рандомных кейсов в Тильде

Не надеюсь, что по такому заголовку кто-то эту статью найдет. Надеюсь она кому-то пригодится. Я большинство заметок пишу для себя с надеждой, что помогу хоть одному человеку.

Проблема

У меня на сайте Remake.space есть ~50 кейсов. Для каждого их них есть отдельная страница с подробным рассказом о проекте.

Как сделать отображение рандомных кейсов в Тильде 1

Я придумал в каждом из кейсов сделать блок, который предлагает лидам ознакомиться с новыми кейсами.

Как сделать отображение рандомных кейсов в Тильде 2

И далее раскопировал этот блок на все страницы кейсов. Это просто картинки с ссылками в zero-code Тильды.

Проблема в том, что это одни и те же 6 работ на всех кейсах. Если пользователь будет перемещаться только по кейсам из этого блока через 5 страниц он упрется в то, что новых работ тут не появляется.

Идея

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

Так как в Тильде нет баз данных, приходится делать это через код. Я придумал, что у меня будет массив данных с ссылками на кейсы и картинку. Ведь это ему и придется заменять.

Попытка решить

Я дал класс блоку с проектами и попросил ChatGPT написать код, который бы реализовал мою идею.

Как сделать отображение рандомных кейсов в Тильде 3
И к

И он конечно выдал результат. Но не понял что конкретно там в коде менять. Бывает.

Как сделать отображение рандомных кейсов в Тильде 4

Чтобы помочь ему, у картинок я нашел общие элементы. Это класс tn-elem.

Как сделать отображение рандомных кейсов в Тильде 5

Внутри лежит tn-atom где ссылка и tn-atom__img где изображение.

Как сделать отображение рандомных кейсов в Тильде 6

Вкинул уточнения, он выдал код и появилась первая проблема.

Проблема — меняются только 3 картинки

Проверяю, работает! Только наполовину. Понять ничего не могу, кидаю в ChatGPT новые запросы, что не работает, он ничего не может найти и продолжает отправлять код, который меняет только 3 картинки.

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

Как сделать отображение рандомных кейсов в Тильде 7

Начал смотреть, чем отличаются картинки от других элементов tn-elem. Это атрибут data-elem-type="image". У других блоков он shape или text.

Проблема — менялись 5 из 6 картинок

Думаю «Да что не так-то! Все же правильно по коду настроил!». Опять достаю ChatGPT, он ничего внятного не дает. Пошел смотреть блок и нахожу такого шпиона. Поржал конечно)

Как сделать отображение рандомных кейсов в Тильде 8

То есть он в этой лишней картинке менял содержание, а в последней ДартиДи не менял, потому что я ему дал задачу менять только 6 картинок.

Проблема — блоки в отрыве друг от друга

После этого я решил пойти и поставить этот блок в 50 страниц кейсов. На 20 блоке я уже так заебался и понял, что если я что-то в нем изменю, мне снова их менять. Пошел делать alias блок.

Alias — это блок, который ссылкается на оригинал. То есть отображает тот блок, айдишник которого вы туда поставите.

Заходим в блок, копируем айдишник.

Как сделать отображение рандомных кейсов в Тильде 9

В новой странице создаем новый блок: другое → alias. Или в поиске «213»

Как сделать отображение рандомных кейсов в Тильде 10

Заходим в контент и ставим айдишник.

Как сделать отображение рандомных кейсов в Тильде 11

Важно! После этого ставим класс, как у нашего оригинального блока. Класс не подтягивается в alias блок.

Как сделать отображение рандомных кейсов в Тильде 12

После этого можно копировать получившийся блок на другие страницы.

Ещё не забудьте, если у вас этот блок лежит в шаблонной странице, при её копировании будет копироваться оригинальный блок.

Нюанс

Ещё не забыл попросить ChatGPT сделать так, что если текущая ссылка уже является кейсом, то этот кейс мы не показываем. Чтобы не было так, что вы смотрите Кейс Музторга, а внизу вам предлагают посмотреть кейс Музторга снова.

Решение

1. Ставим блоку с дополнительными проектами класс uc-other-projects.

2. Заходим в Footer и создаем блок с кодом. T123 в поиске.

<script>
document.addEventListener("DOMContentLoaded", function() {

    // Массив объектов с ссылками на изображения и страницы
    const projects = [
        {
            imgSrc: "https://static.tildacdn.com/tild6234-6135-4237-b436-306463353364/15.png",
            pageLink: "/grandsecret"
        },
        {
            imgSrc: "https://static.tildacdn.com/tild6235-3531-4632-a231-643561643761/image.png",
            pageLink: "https://remake.space/diskill"
        },


        //
        // Добавьте больше объектов по необходимости
    ];
    
    
    // Получаем текущий URL страницы
    const currentUrl = window.location.href;

    // Фильтруем проекты, исключая текущий URL
    const filteredProjects = projects.filter(project => !currentUrl.includes(project.pageLink));

    // Функция для случайного выбора уникальных элементов
    function getRandomElements(arr, count) {
        const shuffled = arr.sort(() => 0.5 - Math.random());
        return shuffled.slice(0, count);
    }

    // Получаем 6 случайных элементов или меньше, если их меньше 6
    const selectedProjects = getRandomElements(filteredProjects, Math.min(6, filteredProjects.length));

    // Проверяем количество выбранных проектов
    console.log("Выбранные проекты:", selectedProjects.length);

    // Заменяем элементы в блоке .uc-other-projects
    const projectElements = document.querySelectorAll('.uc-other-projects .tn-elem[data-elem-type="image"]');

    projectElements.forEach((element, index) => {
        // Обрабатываем только первые 6 элементов
        if (index < selectedProjects.length) {
            const linkElement = element.querySelector('a.tn-atom');
            const imgElement = element.querySelector('img.tn-atom__img');

            if (linkElement && imgElement) {
                console.log("Меняем проект", selectedProjects[index]);

                // Обновляем href и src
                linkElement.href = selectedProjects[index].pageLink;
                imgElement.src = selectedProjects[index].imgSrc;
            }
        } else {
            console.log("Пропускаем элемент", index);
        }
    });
});
    
</script>    

3. Заполняем верхний блок кода. В imgSrc вставляем url картинки, в pageLink ссылку на страницу. Можете прям с этого же сайта копировать. Я с главной страницы все скопировал и вставил.

Круто то, что вы можете управлять тем, какие именно работы там показывать. Просто удаляйте или добавляйте пункты в массив данных.