Блог

13.04.2026

Подтягиваем контент из Kodzero в таблицу Тильды

Алексей Тур

Основатель Кодзиро

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

В моей практике был случай, когда заказчику нужно было обновлять доступность позиций и цен в прайс-листе чуть ли не каждый день. Отправлять менеджеров редактировать вручную значения в Тильде так часто — утомительно и рискованно: легко случайно сломать вёрстку или внести опечатку в цену.

Сегодня, я покажу как можно сделать простую модификацию для стандартного блока Тильды, которая позволит вставлять данные из таблицы Кодзиро в стандартный блок Тильды и получить удобный инструмент работы с данными.


  • Проблема: редактировать контент таблицы Тильды не удобно, работать с большими объемами тяжело.
  • Решение: сделаем скрипт, который будет подгружать данные из админки Кодзиро в стандартный блок Тильды
  • Плюс вайб: менять содержимое таблицы (добавлять строки, править цифры, картинки) можно будет в админке Кодзиро, а данные будут автоматически проверяться и мгновенно попадать на сайт.

Почему Кодзиро подходит для этой задачи

  • Кодзиро — это конструктор бэкенда: создаёте коллекцию данных (таблицу) с любыми полями → получаете готовый API и удобную админку.
  • Вы можете настроить поля: текст, число, картинка, дата, выпадающий список и т.д. Риск ошибки снижается.
  • Данные легко получать на API на вашем сайте. Мгновенно.
  • Менять содержимое просто – отлично для клиентов или менеджеров. Необходимость разбираться с Тильдой отпадает.

Начало

Для примера, сделаем небольшой каталог/прайс-лист футболок с принтами котиков. Вместо футболок может быть что угодно: услуги, цены, список партнёров, меню ресторана, расписание занятий, портфолио проектов – логика одна и та же.

Создание коллекции данных

Для начала создадим в Кодзиро коллекцию (таблицу) и настроем то, из каких полей она состоит.

В моём примере схема выглядит следующим образом:

| Свойство | Тип | Доп. настройки |

| --------------- | ------- | --------------- |

| sku | Число | Не может быть «0», Только уникальные значения |

| title | Текст | Не может быть пустым |

| stock | Число | Может быть «0» |

| price | Число | Не может быть «0», минимум «0.1» |

| image | URL | Может быть пустым |

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

Добавление данных

|sku|title|stock|price|image|

|--|------|-----|-----|-----|

|100001|Футболка «Тёмный маг»|65|1299|https://s3.twcstorage.ru/b3c41028-d393b949-52c0-4ce6-8017-ca2f7d617e15/kodcats-tshirts/black-800.webp|

|...|...|...|...|...|

|100010|Футболка «Магический кот»|1|2490|https://s3.twcstorage.ru/b3c41028-d393b949-52c0-4ce6-8017-ca2f7d617e15/kodcats-tshirts/wizard-800.webp|

Настройка API

API-эндпоинт уже готов. Зайдём в «Настройки API», чтобы узнать адрес, куда отправлять запросы, чтобы получить данные нашей таблицы.

Важно! Необходимо отключить методы API, которые нам не нужны. Оставим включенным только «View All» и «View»:

Копируем адрес и всё почти готово:


https://api.kodzero.pro/v1/10000/100014

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

Создание таблицы в Тильде

Теперь подготавливаем всё на стороне Тильды. Создаём таблицу (Блок CL46) и указываем во вкладке «Контент» какие колонки в ней будут:


Изображение;Артикул;Название;Остаток;Цена;

Размещение скрипта

Теперь добавляем на страницу блок HTML-код (блок T123). Сюда мы добавим скрипт, который будет обращаться к API Кодзиро и вставлять данные в таблицу.

Содержимое этого блока можно скопировать и вставить:

<script>
(function () {
    const tableSyncConfig = {
        // ID блока Тильды с таблицей
        tableRecId: '#rec2144224941',

        // URL для получения данных из Kodzero
        collectionUrl: 'https://api.kodzero.pro/v1/10000/100014',

        // Настройки колонок
        //
        // template — шаблон, который определяет,
        // как будет отображаться значение в ячейке.
        //
        // В шаблоне {value} будет заменено на фактическое
        // значение из данных Kodzero для этой колонки.
        //
        // Отсутствие template означает, что значение
        // будет вставлено как есть, без дополнительного форматирования.
        columns: {
            image: {
                title: 'Изображение',
                template: '<img src="{value}" alt="image" style="max-width: 180px; max-height: 180px;">'
            },
            sku: {
                title: 'Артикул',
                template: '<strong>{value}</strong>'
            },
            title: {
                title: 'Название'
            },
            stock: {
                title: 'Остаток',
                template: '{value} шт.'
            },
            price: {
                title: 'Цена',
                template: '{value} ₽'
            }
        }
    }

    // =======================================================
    // Далее находятся технические функции.
    //
    // Их можно не трогать, если не нужно менять
    // логику работы скрипта.
    // =======================================================

    const fetchKodzeroData = async () => {
        try {
            const result = await fetch(tableSyncConfig.collectionUrl)
            const json = await result.json()

            return json.ok && json.result
                ? json.result.found
                : []
        } catch (error) {
            console.error(
                'Ошибка при получении данных из Kodzero:',
                error
            )

            return []
        }
    }

    const getTable = () => {
        const divWrapper = document.querySelector(
            '#' + tableSyncConfig.tableRecId.replace('#', '')
        )

        const table = divWrapper.querySelector('table')

        if (!table) {
            console.error(
                'Не удалось найти таблицу. Проверьте правильность настроек ' +
                'и структуру таблицы на Тильде'
            )

            return null
        }

        const widthSettings = table
            .getAttribute('data-table-width')
            .split(';')

        const columns = getColumnIdsOrdered(table)

        if (!columns.length) {
            console.error(
                'Не удалось определить колонки. Проверьте правильность ' +
                'настроек и структуру таблицы на Тильде'
            )

            return null
        }

        return {
            divWrapper,
            table,
            widthSettings,
            columns
        }
    }

    const getColumnIdsOrdered = (tableNode) => {
        const headers = tableNode.querySelectorAll('.t431__thead th')

        const columns = [...headers].map(
            (el) => el.innerText
        )

        const columnSettings = tableSyncConfig.columns

        columns.forEach((header, i) => {
            const id = Object.keys(columnSettings).find(
                (key) => columnSettings[key]?.title === header
            )

            columns[i] = id || ''
        })

        return columns
    }

    const getTableBody = () => {
        const table = document.querySelector(
            '#' + tableSyncConfig.tableRecId.replace('#', '')
        )

        return table.querySelector('.t431__tbody')
    }

    const insertRows = (records, tableData) => {
        clearTable()

        const tableBody = getTableBody()

        records.forEach((record, i) => {
            const tr = document.createElement('tr')

            tr.classList.add(
                i % 2 === 0
                    ? 't431__oddrow'
                    : 't431__evenrow'
            )

            tableData.columns.forEach((col) => {
                const template =
                    tableSyncConfig.columns[col]?.template || '{value}'

                const value = template.replace(
                    '{value}',
                    record[col] || ''
                )

                const td = document.createElement('td')

                td.classList.add('t431__td')
                td.classList.add('t-text')

                td.innerHTML = value

                tr.appendChild(td)
            })

            tableBody.appendChild(tr)
        })
    }

    const clearTable = () => {
        const tableId =
            '#' + tableSyncConfig.tableRecId.replace('#', '')

        const tableBody = document
            .querySelector(tableId)
            ?.querySelector('.t431__tbody')

        if (!tableBody) return

        tableBody.innerHTML = ''
    }

    const syncTableWithKodzero = async () => {
        try {
            clearTable()

            const records = await fetchKodzeroData()

            if (!records.length) {
                return console.warn(
                    'Нет данных для отображения в таблице'
                )
            }

            const tableData = getTable()

            if (!tableData) {
                return console.warn(
                    'Обработка данных таблицы невозможна из-за ошибок ' +
                    'в структуре или настройках'
                )
            }

            insertRows(records, tableData)
        } catch (error) {
            console.error(
                'Неожиданная ошибка при синхронизации таблицы:',
                error
            )
        }
    }

    document.addEventListener(
        'DOMContentLoaded',
        syncTableWithKodzero
    )
})()


Кстати, дополнительно скрипт позволяет указать шаблон того, как данные каждого столбца будут вставлены. Например, здесь мы вставляем URL изображения в тег img. {value} будет заменено на реально значение.

{
    'image': {
        title: 'Изображение',
        template: '<img src="{value}" alt="image" style="max-width: 180px; max-height: 180px;" />'
    }
}

Результат

Сохраняем страницу и открываем её. Демо-страница на Тильде

Как видим, контент автоматически попадает в таблицу Тильды. Больше не нужно возиться со сложным синтаксисом, который имеет большой потенциал для совершения ошибок 😉

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

Примеры задач

Какие ещё задачи можно решать таким способом:

  • Каталог услуг с ценами и описанием
  • Прайс-лист (таблица с артикулами, остатками)
  • Расписание мероприятий / вебинаров / тренировок
  • Портфолио проектов с фильтрацией по категориям
  • Меню ресторана (блюда, цены, состав)
  • Список партнёров / дилеров с контактами
  • Блог / новости (краткий список с ссылками)
  • Отзывы клиентов (с рейтингом и фото)

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


Если у вас возникли проблемы, напишите мне в Телеграм, я с радостью помогу вам ✌️

Попробуйте — это бесплатно

Создайте бэкенд для вашего проекта за 10 минут. Без кода, без настройки серверов, без боли.