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

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

Создание коллекции данных
Для начала создадим в Кодзиро коллекцию (таблицу) и настроем то, из каких полей она состоит.
В моём примере схема выглядит следующим образом:
| Свойство | Тип | Доп. настройки |
|---|---|---|
| sku | Число | Не может быть «0», Только уникальные значения |
| title | Текст | Не может быть пустым |
| stock | Число | Может быть «0» |
| price | Число | Не может быть «0», минимум «0.1» |
| image | URL | Может быть пустым |
Добавление данных
| 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 для этой колонки.
// Отсутствие шаблона означает, что значение будет вставлено как есть, без дополнительного форматирования.
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')
const widthSettings = table.getAttribute('data-table-width').split(';')
const columns = getColumnIdsOrdered(table)
if (!table || !columns.length) {
console.error('Не удалось найти таблицу или определить колонки. Проверьте правильность настроек и структуру таблицы на Тильде')
return null
}
const output = {
divWrapper,
table,
widthSettings,
columns
}
return output
}
const getColumnIdsOrdered = (tableNode) => {
const headers = tableNode.querySelectorAll('.t431__thead th')
const columns = [...headers].map(el => el.innerText)
const idValues = tableSyncConfig.columns
columns.forEach((header, i) => {
const id = Object.keys(idValues).find(key => idValues[key]?.title === header)
columns[i] = id || ''
})
return columns
}
const getTableBody = () => {
const tableBody = document.querySelector('#' + tableSyncConfig.tableRecId.replace('#', '')).querySelector('.t431__tbody')
return tableBody
}
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;" />'
},
}
Результат
Сохраняем страницу и открываем её. Демо-страница на Тильде

Как видим, контент автоматически попадает в таблицу Тильды. Больше не нужно возиться со сложным синтаксисом, который имеет большой потенциал для совершения ошибок 😉
Визуал вы можете менять как угодно в настройках самой таблицы Тильды, скрипт не влияет на него, а лишь получает данные и вставляет строки в таблицу.
Примеры задач
Какие ещё задачи можно решать таким способом:
- Каталог услуг с ценами и описанием
- Прайс-лист (таблица с артикулами, остатками)
- Расписание мероприятий / вебинаров / тренировок
- Портфолио проектов с фильтрацией по категориям
- Меню ресторана (блюда, цены, состав)
- Список партнёров / дилеров с контактами
- Блог / новости (краткий список с ссылками)
- Отзывы клиентов (с рейтингом и фото)
То есть любая информация, которую удобно представить в виде таблицы или карточек.
Если у вас возникли проблемы, напишите мне в Телеграм, я с радостью помогу вам ✌️