0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Использование шаблонов значительно упрощает создание HTML-страниц на стороне сервера. Но у этого подхода есть и недостатки. Он порождает определенные неудобства, связанные с повторяющимися блоками. В этом уроке мы поговорим об этой проблеме и выясним, как предотвращать такие ситуации.</p>
1
<p>Использование шаблонов значительно упрощает создание HTML-страниц на стороне сервера. Но у этого подхода есть и недостатки. Он порождает определенные неудобства, связанные с повторяющимися блоками. В этом уроке мы поговорим об этой проблеме и выясним, как предотвращать такие ситуации.</p>
2
<h2>Инвертированный подход к повторяющимся блокам</h2>
2
<h2>Инвертированный подход к повторяющимся блокам</h2>
3
<p>Представьте себе типовой сайт. На большинстве сайтов есть верхнее меню, футер и еще немало повторяющихся блоков. Как с ними правильно работать? Кажется, что копировать все это в каждый шаблон - не самая лучшая идея.</p>
3
<p>Представьте себе типовой сайт. На большинстве сайтов есть верхнее меню, футер и еще немало повторяющихся блоков. Как с ними правильно работать? Кажется, что копировать все это в каждый шаблон - не самая лучшая идея.</p>
4
<p>Есть еще один подход - вынести общие куски в отдельные файлы и включить их в нужных шаблонах:</p>
4
<p>Есть еще один подход - вынести общие куски в отдельные файлы и включить их в нужных шаблонах:</p>
5
<p>Это простое решение, которые использовалось в самых ранних шаблонизаторах. Разработчики быстро поняли, насколько это неудобно. Проблема заключается в двух аспектах:</p>
5
<p>Это простое решение, которые использовалось в самых ранних шаблонизаторах. Разработчики быстро поняли, насколько это неудобно. Проблема заключается в двух аспектах:</p>
6
<ul><li>Разработчику приходится делать подобные включения абсолютно в каждом шаблоне вручную. В нашем примере их всего два. А что, если бы их были сотни? На работу с каждым отдельным шаблоном ушло бы очень много времени</li>
6
<ul><li>Разработчику приходится делать подобные включения абсолютно в каждом шаблоне вручную. В нашем примере их всего два. А что, если бы их были сотни? На работу с каждым отдельным шаблоном ушло бы очень много времени</li>
7
<li>Разработчику приходится вручную проверять разные файлы и искать незакрытые теги, потому что части одних и тех же тегов могут быть разбросаны по разным файлам. Отлаживать такие проекты очень сложно</li>
7
<li>Разработчику приходится вручную проверять разные файлы и искать незакрытые теги, потому что части одних и тех же тегов могут быть разбросаны по разным файлам. Отлаживать такие проекты очень сложно</li>
8
</ul><p>Эти проблемы решил<strong>инвертированный подход</strong>, в котором не куски сайта вставляются в шаблон, а шаблон вставляется в макет сайта. Принцип здесь такой:</p>
8
</ul><p>Эти проблемы решил<strong>инвертированный подход</strong>, в котором не куски сайта вставляются в шаблон, а шаблон вставляется в макет сайта. Принцип здесь такой:</p>
9
<ul><li>В одном месте описываем макет - основу сайта, которая не меняется по структуре</li>
9
<ul><li>В одном месте описываем макет - основу сайта, которая не меняется по структуре</li>
10
<li>Шаблонизатор делает так, чтобы шаблон конкретной страницы вставлялся в этот макет</li>
10
<li>Шаблонизатор делает так, чтобы шаблон конкретной страницы вставлялся в этот макет</li>
11
</ul><p>В этом случае шаблон ничего не знает об устройстве макета, а макет хранит все свои части в одном месте.</p>
11
</ul><p>В этом случае шаблон ничего не знает об устройстве макета, а макет хранит все свои части в одном месте.</p>
12
<h2>Инвертированный подход в JTE</h2>
12
<h2>Инвертированный подход в JTE</h2>
13
<p>Шаблонизатор JTE поддерживает работу с макетами. Посмотрим, как это работает. Для начала создадим макет<em>src/main/jte/layout/page.jte</em>:</p>
13
<p>Шаблонизатор JTE поддерживает работу с макетами. Посмотрим, как это работает. Для начала создадим макет<em>src/main/jte/layout/page.jte</em>:</p>
14
<p>Обратим внимание на ${content} - сюда JTE поместит шаблон конкретной страницы. Посмотрим, как выглядит шаблон списка пользователей:</p>
14
<p>Обратим внимание на ${content} - сюда JTE поместит шаблон конкретной страницы. Посмотрим, как выглядит шаблон списка пользователей:</p>
15
<p>Главное отличие здесь в том, что мы помещаем содержимое шаблона в специальную конструкцию, которая вставляет его в нужное место в макет:</p>
15
<p>Главное отличие здесь в том, что мы помещаем содержимое шаблона в специальную конструкцию, которая вставляет его в нужное место в макет:</p>
16
<p>Может показаться, что это избыточно. С другой стороны, создатели шаблонизатора хотели сделать чуть более продвинутую систему, чем подстановку в один блок. Такая конструкция позволяет вставлять в макет сразу несколько блоков и передавать туда данные конкретного шаблона. Посмотрим на пример такого макета и шаблона:</p>
16
<p>Может показаться, что это избыточно. С другой стороны, создатели шаблонизатора хотели сделать чуть более продвинутую систему, чем подстановку в один блок. Такая конструкция позволяет вставлять в макет сразу несколько блоков и передавать туда данные конкретного шаблона. Посмотрим на пример такого макета и шаблона:</p>
17
<p>Кроме content, в этом макете используется footer и page, которые придут из конкретного шаблона. По умолчанию footer равен null, поэтому мы можем его и не передавать. Соответствующий блок будет скрыт:</p>
17
<p>Кроме content, в этом макете используется footer и page, которые придут из конкретного шаблона. По умолчанию footer равен null, поэтому мы можем его и не передавать. Соответствующий блок будет скрыт:</p>
18
18