Разработчики часто наступают на грабли с Matrix Field в Craft CMS: то N+1 запросы кладут сервер, то редакторы просят «а можно ещё один тип блока». Однажды к нам пришёл клиент с сайтом, где страница 'О компании' содержала 25 блоков, каждый с изображением. Загрузка страницы занимала 8 секунд — из-за 25 отдельных запросов к медиа. После правильной настройки Matrix Field с eager loading время сократилось до 1.2 секунды. Мы переделали десятки проектов на Craft и выработали подход, при котором Matrix не тормозит и не бесит команду.
Как спроектировать блоки, чтобы не переделывать через месяц
В типовом корпоративном сайте поле pageBody может содержать 6–10 типов блоков. Каждый блок — это микроструктура: текст, изображение, ссылка, цитата, код, статистика. Важно заранее продумать не только названия, но и набор полей — потом добавить поле сложнее, чем убрать.
Пример оптимальной структуры для лендинга:
pageBody (Matrix) ├── hero │ ├── heading, subheading, backgroundImage, ctaButton ├── richTextContent │ └── content (Redactor) ├── imageWithCaption │ ├── image, caption, alignment ├── twoColumns │ ├── leftContent, rightContent (Redactor) ├── testimonial │ ├── quote, author, role, avatar ├── stats │ └── items (Table field внутри) ├── ctaBanner │ ├── heading, text, buttonLabel, buttonUrl └── codeSnippet ├── language, code Мы рекомендуем использовать Table field для списков (статистика, тарифы) — это быстрее, чем вложенный Matrix, и проще кэшируется.
Twig-рендер: switch vs include vs component
Большинство проектов используют {% switch %} внутри цикла — это надёжно и читаемо. Но при 10+ блоках шаблон раздувается. Альтернатива — вынести каждый блок в отдельный include с именем по хендлу. Это упрощает поддержку, но немного медленнее из-за множественных вызовов include. Оптимальный вариант — рендерить блоки через компонентный подход с кэшированием фрагментов.
| Подход | Скорость | Сопровождаемость | Кэширование |
|---|---|---|---|
| switch | высокая | низкая (громоздкий) | легко кэшировать целиком |
| include | средняя | высокая | каждый шаблон кэшируется отдельно |
| components | высокая | высокая | фрагментарное кэширование |
Наш опыт: для страниц с 15+ блоками выигрыш в 40-50 мс при включении cache-тегов.
Почему N+1 убивает производительность и как этого избежать
Без eager loading каждый блок с полем Assets генерирует отдельный запрос. Например, блок image ищет картинку, блок testimonial — аватар. Если на странице 10 блоков, получаем 10 запросов к БД, плюс сам запрос списка блоков. Решение — один вызов with(): {% set blocks = entry.pageBody.with(['image', 'avatar', 'backgroundImage']).all() %}.
Для блоков, содержащих вложенные Matrix (например, табы с контентом внутри), используйте .with()['subMatrixField.childField'] — Craft поддерживает глубокий eager loading. Подробнее читайте в официальной документации Craft CMS.
Что делать, если Matrix Field стал тормозить панель управления
Matrix с 50+ блоками в CP — частый кошмар. Причина: каждый блок рендерит свои поля. Решение — фрагментировать матрицу на несколько полей: например, отдельный Matrix для «шапки», отдельный для «тела» и «футера». Либо использовать Neo Field от McDowell — аналог Matrix с поддержкой вложенности, но без проблем с производительностью CP.
Выбор инструмента: когда Matrix, когда Neo, когда Table
| Критерий | Matrix (штатный) | Neo (плагин) | Table Field | SuperTable (плагин) |
|---|---|---|---|---|
| Типы блоков | Любые, статичные | Любые, вложенные | Один тип строк | Один тип, поля гибко |
| Производительность CP | Средняя (при 20+ блоках) | Хуже (сложнее) | Отличная | Хорошая |
| Вложенность | Только 1 уровень (через Table) | Многоуровневая | Нет | 1 уровень |
| Стоимость | Бесплатно | $99 | Бесплатно | $59 |
| Подходит для | Page builder с 5-10 блоками | Сложные структуры (атомарный дизайн) | Таблицы, прайсы | Списки с разными полями (характеристики) |
Matrix — лучшее решение для 80% проектов. Neo стоит брать только если нужна вложенность более двух уровней (например, сайт с вариативными секциями). Table и SuperTable — для табличных данных, где количество полей фиксировано.
Кэширование блоков: стратегии для Matrix
Matrix-блоки ломают кэширование страниц, если не продумать стратегию. Решение — кэшировать каждый блок отдельно с тегами. В Twig:
{% cache globally using key 'block-' ~ block.id tags 'matrixBlock:' ~ block.id %} {% include 'matrix/_' ~ block.type.handle %} {% endcache %} При изменении блока Craft инвалидирует только его кэш. Для статических блоков (richText) можно кэшировать на день, для медиа — на час.
Пример структуры pageBody для быстрого старта
pageBody (Matrix): - hero (heading, subheading, backgroundImage, ctaButton) - richTextContent (content Redactor) - imageWithCaption (image, caption, alignment) - twoColumns (leftContent, rightContent Redactor) - testimonial (quote, author, role, avatar) - stats (items Table field) - ctaBanner (heading, text, buttonLabel, buttonUrl) - codeSnippet (language, code) Этот набор покрывает 90% типовых страниц.
Что вы получите в результате настройки Matrix Field
После завершения работы вы получаете:
- Сконфигурированное Matrix Field с 5–8 типами блоков.
- Twig-шаблоны с поддержкой адаптивной вёрстки (мобильная версия определяется через
craft.app.request.isMobileпри необходимости). - Настроенный eager loading для всех внешних полей (Assets, Categories, Entries).
- Документацию по добавлению новых блоков и обучение редакторов (1 час).
- Гарантию производительности: загрузка страницы с 10 блоками менее 1.5 секунд.
Типичные ошибки и их решения
| Ошибка | Решение |
|---|---|
| Использование Matrix для простых списков | Используйте Channel или Table |
| Забыли eager loading для изображений | Добавьте .with() для всех релейшенов |
| Слишком много типов блоков (более 10) | Ограничьте до 5–8, вынесите редкие блоки в отдельное поле |
Не установлен maxBlocks |
Установите лимит (например, 20) |
| Нет кэширования фрагментов | Оберните каждый блок в {% cache %} с тегом |
Когда стоит отказываться от Matrix
Matrix неудобен для:
- Сайтов с одним типом контента (блог) — хватит Rich Text.
- Сайтов с жёсткой сеткой (например, портфолио) — лучше структурировать через Entry Type.
- Высоконагруженных проектов (миллионы блоков) — Matrix плохо масштабируется, рассмотрите Headless CMS или кастомные решения.
В остальном — это стандартный инструмент Craft CMS, с которым мы делаем 90% проектов. Опыт нашей команды — 5+ лет и 50+ проектов на Craft, поэтому мы гарантируем оптимальную настройку Matrix под ваши задачи. Если хотите ускорить проект — получите консультацию бесплатно.
Настройка Matrix с 5–8 типами блоков и шаблонами занимает 2–4 дня. Стоимость зависит от количества типов и сложности дизайна, обычно от $700 до $1500.







