Руководство: Добавление кнопки «Читать далее» для длинного описания товара или статьи в Cotonti CMF. Два варианта готового решения для реализации задачи.
Руководство: Добавление кнопки «Читать далее» для длинного описания товара или статьи в Cotonti CMF. Два варианта готового решения для реализации задачи.
📘 Введение
Если в вашем магазине на Cotonti (модуль Market) описание товара ({MARKET_TEXT}) превышает 750 символов, полезно скрыть его часть и показать кнопку «Читать далее». Это улучшает читаемость страницы и не вредит SEO, так как весь текст остаётся в HTML.
Ниже представлены два варианта реализации с поддержкой мультиязычности через языковые файлы Cotonti. Выберите тот, который лучше вписывается в вашу архитектуру.
🌐 Подготовка локализации
Сначала добавьте строки в языковые файлы модуля Market. Если вы используете другой модуль, путь будет аналогичным.
Почему здесь можно использовать {PHP.L.*} прямо в скрипте? Потому что скрипт находится внутри .tpl‑файла, и Cotonti обрабатывает его как часть шаблона, заменяя переменные на нужные строки перед выводом в браузер.
✅ Плюсы варианта 1
Всё в одном месте, легко найти и изменить.
Не нужно редактировать глобальные файлы темы.
❌ Минусы
Код шаблона становится громоздким.
При использовании агрессивного кэширования шаблонов (например, {SOME_TPL}) могут быть нюансы.
Вариант 2: разделение по файлам
Это более чистый подход: HTML остаётся в шаблоне, CSS – в общей теме, JavaScript – в общем скрипте. Языковые строки передаются через data-атрибуты кнопки, так как JS‑файл не обрабатывается шаблонизатором.
Обратите внимание: здесь высота в свёрнутом состоянии может отличаться от первого варианта (380px против 200px). Вы можете выбрать любую удобную величину.
⚙️ JavaScript
Добавьте в общий JS‑файл вашей темы (например, themes/index36/js/js.js) следующий код. Лучше всего разместить его как отдельный обработчик, не вмешиваясь в существующие скрипты:
Важно! Так как JavaScript находится в отдельном файле, шаблонизатор Cotonti не обрабатывает его, поэтому мы не можем писать {PHP.L.market_read_more} прямо в коде. Вместо этого строки читаются из атрибутов кнопки через btn.dataset.readMore и btn.dataset.collapse. Именно поэтому мы заранее добавили эти атрибуты в HTML.
✅ Плюсы варианта 2
Чистое разделение ответственности: HTML, CSS и JS не смешиваются.
CSS и JS могут кэшироваться браузером отдельно.
Подходит для крупных проектов с общей кодовой базой.
❌ Минусы
Требуется редактирование нескольких файлов.
Нужно помнить о передаче языковых строк через data-атрибуты.
🔄 Сравнение и рекомендации
Критерий
Вариант 1 (всё в шаблоне)
Вариант 2 (раздельные файлы)
Локализация
Прямые {PHP.L.*} в скрипте
Через data-атрибуты кнопки
Где хранятся стили
В том же .tpl файле
В общем CSS (например, default.css)
Где хранится скрипт
В том же .tpl файле
В общем JS (например, js.js)
Удобство поддержки
Проще, всё рядом
Лучше масштабируется
Производительность
Чуть быстрее (меньше HTTP‑запросов)
Кэширование статики эффективнее
Рекомендация: Если вы редко меняете скрипты и стили, а шаблон не слишком раздувается, используйте Вариант 1 – он самый простой в реализации. Если же у вас крупный проект с активной разработкой, предпочтительнее Вариант 2 – он обеспечивает лучшую организацию кода и повторное использование.
🧪 Проверка работы
После внесения изменений откройте любой товар с длинным описанием (более 750 символов). Вы должны увидеть обрезанный текст с затемнением внизу и кнопку «Читать далее». При клике текст развернётся, кнопка сменится на «Свернуть». Повторный клик вернёт всё обратно. В товарах с коротким описанием кнопка не появится.
Убедитесь, что при смене языка сайта текст кнопки также меняется.
Теперь вы можете выбрать подходящий способ и внедрить его в свой проект. Оба варианта полностью рабочие и не нарушают SEO, так как полный текст изначально присутствует в HTML‑коде.
Оказываю весь спектр услуг по CMF Cotonti. Разработка открытых и закрытых корпоративных интернет порталов, небольших социальных сетей, торговые площадки, маркетплейсы, биржи фриланса, каталоги товаров оптовых поставщиков, интернет-магазин под заказ, чтобы делать совместные покупки и групповые совместные продажи от имени нескольких продавцов.