Что такое шаблонизатор
Перейти к содержимому

Что такое шаблонизатор

  • автор:

Шаблонизатор

Шаблонизатор (в web) — это программное обеспечение, позволяющее использовать html-шаблоны для генерации конечных html-страниц. Основная цель использования шаблонизаторов — это отделение представления данных от исполняемого кода. Часто это необходимо для обеспечения возможности параллельной работы программиста и дизайнера-верстальщика. Использование шаблонизаторов часто улучшает читаемость кода и внесение изменений во внешний вид, когда проект целиком выполняет один человек.

Использование шаблонизаторов часто отождествляют с парадигмой MVC. Эти понятия связаны, но не тождественны.

Популярные шаблонизаторы

Java

PHP

  • Возможности самого языка PHP
  • Smarty
  • Twig
  • TinyButStrong
  • XTemplate
  • Histone

Python

Perl

  • Template Toolkit
  • HTML::Template

Ruby/Rails

JavaScript

Примечания

  1. (Histone Template Engine)
  2. Jinja2 (The Python Template Engine)

См. также

Ссылки

  • Enforcing Strict Model-View Separation in Template Engines
  • A Double-Model Approach to Achieve Effective Model-View Separation in Template Based Web Applications
  • Сравнение PHP-шаблонизаторов (с графическими диаграммами) (англ.)
  • Дополнить статью (статья слишком короткая либо содержит лишь словарное определение).
  • Добавить иллюстрации.
  • Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
  • Шаблонные системы

Wikimedia Foundation . 2010 .

  • Шаблон сайта
  • Шаблыкинская волость

Полезное

Смотреть что такое «Шаблонизатор» в других словарях:

  • Pylons — Тип Программный каркас для создания веб приложений Разработчик Бен Бангерт, Джеймс Гарднер Операционная система Кроссплатформенный Последняя версия 1.3 ( … Википедия
  • LIMB — Limb3 PHP Web Application Framework Тип CMF Написана на PHP Операционная система Кроссплатформенное программное обеспечение Последняя версия … Википедия
  • PHP Compiler — карточка программы name = PHP Compiler logo = screenshot = caption = Админпанель PHPC developer = Dagdamor latest release version = 2.4.5 latest release date = 24 сентября, 2007 genre = CMF operating system = Кроссплатформенное программное… … Википедия
  • TinyButStrong — Тип Обработчик шаблонов Операционная система Кроссплатформенное программное обеспечение Последняя версия 3.8 (3 апреля 2011 г.) Лицензия GNU LGPL … Википедия
  • UMI.CMS — Тип Система управления сайтом Разработчик ООО «Юмисофт» Операционная система Кроссплатформенное программное обеспечение Последняя версия 2.8 Лицензия … Википедия
  • FreeMarker — Тип Шаблонизатор Разработчик Jonathan Revusky, Attila Szegedi, Dániel Dékány и другие Написана на Java Операционная система Крос … Википедия
  • Jinja — (произносится как дзиндзя) это шаблонизатор для языка программирования Python. Он подобен шаблонизатору Django, но предоставляет Python ические выражения, обеспечивая исполнение шаблонов в песочнице. Это текстовой язык шаблонов и, таким… … Википедия
  • Smarty — Тип Компилирующий обработчик шаблонов Разработчик New Digital Group, Inc … Википедия
  • TYPO3 — TYPO3 … Википедия
  • TBS — TBS: Tokyo Broadcasting System телевизионная станция в Токио, Япония Turner Broadcasting System медиа компания, владеющая сетями CNN, TBS, TNT, Cartoon Network, Adult Swim, Boomerang, truTV и сетью Turner Classic Movies TBS (телеканал) кабельный… … Википедия
  • Обратная связь: Техподдержка, Реклама на сайте
  • �� Путешествия

Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.

  • Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
  • Искать во всех словарях
  • Искать в переводах
  • Искать в ИнтернетеИскать в этой же категории

Что такое шаблонизатор? значение термина шаблонизатор в интернете

Шаблонизатор (в вебе) – это ПО, которое позволяет использовать html-шаблоны для генерации уже конечных html-страниц. Главная цель использования шаблонизатора – это отделение представления данных от исполняемого кода. Очень часто эта необходимость может возникнуть для обеспечения параллельной работы дизайнера, верстальщика и программиста. Применение шаблонизаторов часто улучшает читаемость кода и внесение изменений во внешний вид, когда проектом занят один человек.

Помогло? Делись!

Реклама:

Представляем
систему управления сайтами
NetCat

CMS NetCat — профессиональная коммерческая система управления Интернет-сайтами, один из лидеров на российском рынке веб-разработок.
Наша компания является сертифицированным партнером и рекомендуемым разработчиком сайтов на NetCat во Владивостоке.
В настоящее время большинство новых сайтов мы создаем на основе ее программной платформы.

Быстрый поиск по сайту:

© Аниматика 2005 — 2023

690002 , г.Владивосток , пр-т Острякова, 5, оф.306

Тел.: +7 (423) 206-00-23
E-mail: info@animatika.ru

Что такое и зачем нужны шаблонизаторы HTML

Есть много способов сэкономить время и упростить жизнь разработчика. Но они кажутся такими сложными и непонятными, что знакомство с ними постоянно откладывается. И зря: сегодня мы расскажем, как автоматизировать работу, используя вспомогательные инструменты.

Шаблонизаторы для HTML — один из таких способов.

Что такое шаблонизаторы

Шаблонизатор — это инструмент, который позволяет проще писать разметку, делить её на компоненты и связывать с данными.

Главное преимущество шаблонизаторов — они избавляют от необходимости писать повторяющийся код несколько раз. Это кажется не такой большой проблемой, но всё же разработчикам часто приходится тратить на это время.

Зачем нужны шаблонизаторы

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

  • создание базовой разметки страниц;
  • внесение правок одновременно на нескольких страницах или компонентах;
  • изменение контента в блоках;
  • добавление, удаление или перенос блоков на страницах сайта;
  • создание повторяющегося контента, например карточки товара в каталоге.

Какие проблемы решают шаблонизаторы?

При вёрстке шаблонов принято выделять повторяющиеся блоки в компоненты, чтобы использовать их на других страницах, но иногда один из них требуется изменить. Если речь идёт о внешнем виде компонента, всё просто: вы меняете его CSS-код, и он обновляется везде. Но как быть, если нужно переделать HTML-код сложного компонента? Сначала придётся внести правку в код на одной странице, а затем найти все подобные компоненты и провести аналогичные изменения с каждым.

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

Такие изменения могут касаться не только сложной разметки, но и более простых элементов вроде контента в ссылках. Типовая задача — разметить главное меню так, чтобы при клике на ссылку открывались соответствующие шаблоны страниц. Это упрощает процесс разработки и демонстрации. Но если у вас в проекте 30 страниц и вы вносите правку в ссылку в главном меню, то вам придётся делать это 30 раз.

Эти ситуации не катастрофичны, но приводят к следующим проблемам:

  • Приходится постоянно держать в голове контекст проекта. То есть помнить, где есть похожие компоненты, чтобы вносить правки везде. Особенно неудобно, если вы вернулись к проекту после перерыва.
  • Возникают ошибки на этапе разработки и внесения правок. Можно забыть применить изменения на все компоненты, и где-то появятся баги. Причём не из-за плохой вёрстки, а просто потому, что вы забыли скопировать код.
  • Увеличивается время разработки и внесения правок, особенно при потере контекста.

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

Как шаблонизаторы помогают решать проблемы?

Рассказывать про работу шаблонизаторов будем на примере принципа их работы, без отсылки к конкретному инструменту.

Создание шаблонов

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

Рассмотрим это на условном, несуществующем синтаксисе.

Файл раскладки
     Сайт про сайт    

Здесь мы определяем основной шаблон всего сайта, с шапкой и подвалом, и указываем конструкцию, которая будет указывать, куда должен размещаться контент.

Файл каталога и новостей
  

Страница каталога

Карточка 1
Карточка 2
Карточка 3

Страница новостей

Новость 1
Новость 2
Новость 3

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

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

Создание компонентов

Компоненты — это как шаблоны, но наоборот. В случае с шаблоном мы указываем, где он будет использоваться для необходимого контента. При работе с компонентами мы сначала его определяем, а потом указываем место, где его надо вызвать.

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

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

В качестве примера абстрактной реализации рассмотрим реализацию каталога.

В отдельном файле описываем саму карточку товара со всей структурой.

А уже в другом файле, в котором необходимо подключать компонент, вызываем его.

Каталог магазина

Благодаря этому становится проще использовать компоненты и собирать из них более сложные блоки. При изменении компонента в одном месте он будет обновляться везде, а значит, мы не забудем внести в него правки.

Работа с данными

Не может же быть так, чтобы при вставке девяти карточек проекта они все стали одинаковыми? Что делать, если мы хотим видеть разный контент в одинаковых компонентах?

Создавать новые компоненты под разный контент или копировать его не придётся. Шаблонизаторы умеют разделять данные и их внешний вид, вставляя полученные данные в код компонента.

То есть мы можем не использовать данные внутри компонента, а передать их при вызове, чтобы они подставились в нужные места. Разберёмся, что это значит.

При описании компонента мы говорим, что его контент не статичный, а берётся из объекта с данными, которые будут в него переданы.

  
alt=>
>

И при вызове компонента мы передаём ему эти данные, чтобы на выходе у нас был компонент в нужной структуре, но с разным содержанием.

Каталог магазина

Благодаря этому мы можем использовать разный контент в одинаковых компонентах, при необходимости менять классы у разных блоков и легко управлять интерфейсом.

Интерактивность

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

Условные выражения позволяют менять что-то внутри компонента в зависимости от данных внутри. Это делает компоненты более гибкими. Например, у вас есть компонент кнопки в трёх цветах. Вместо создания трёх отдельных компонентов изменение класса цвета можно сделать внутри одного, и он будет меняться в зависимости от условий.

Циклические конструкции освобождают от копирования повторяющихся компонентов. Вы указываете данные, которые надо перебрать, и компонент, в который их надо вывести. На выходе вы получаете нужное количество данных в нужном компоненте. Это удобно при создании карточек товаров и списков — новостных и прочих.

Эти возможности позволяют писать код ещё быстрее и более гибко, избегая при этом лишних ошибок.

Какие шаблонизаторы бывают

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

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

Pug — написан на Node.js и компилирует строгий синтаксис в конечный HTML-файл. То есть он не работает на лету и по факту всё равно превращается в HTML. Его надо собирать через сборщик. Инструмент представляет собой довольно нестандартный синтаксис, который непривычен в начале, но быстро осваивается и даёт хороший профит.

Twig — шаблонизатор, написанный на PHP, часто используется при вёрстке шаблонов. Он собирается на сервере и не требует предварительной сборки, но работает в окружении локального сервера.

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

Подготовка к работе с шаблонизаторами

Шаблонизаторы не выглядят сложным инструментом, но с ними всё не так просто.

  • Первое, чему необходимо научиться, — правильно использовать принципы. Верно выделять шаблоны, компоненты и правильно их комбинировать. В нужный момент использовать условия и циклы, чтобы процесс написания и поддержки становился проще.
  • У шаблонизаторов есть особенности синтаксиса, которые не всегда очевидны, и некоторые функции не всегда работают так, как от них ожидается.
  • И самое важное — необходимо правильно использовать возможности для разных типовых задач, чтобы не усложнять работу.

Всё это постигается опытом и позволяет существенно упростить процессы производства и дальнейшей поддержки проекта.

Какие выводы можно сделать

Шаблонизаторы делают написание кода проще и избавляют разработчика от хранения в голове большого количества контекста. Это позволяет тратить силы на более полезные вещи.

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

Главное — использовать шаблонизаторы правильно, чтобы действительно оптимизировать работу.

Шаблонизаторы¶

В Node.js для генерации и отдачи HTML-страниц используются шаблонизаторы. Node.js шаблонизатор представляет собой специальный модуль, использующий более удобный синтаксис для формирования HTML на основе динамических данных и позволяющий разделять представление от контроллера.

Настройка Node.js шаблонизатора осуществляется заданием двух параметров:

  • views — путь к директории, в которой находятся шаблоны;
  • view engine — указание самого шаблонизатора.

Для задания этих параметров используется метод Express set() .

app.set('views', './views'); app.set('view engine', 'handlebars'); 

Шаблонизаторов очень много, но наибольшее распространение получили Handlebars и Pug.

Handlebars¶

Начнем с установки Node.js handlebars.

npm install --save express-handlebars 

И сразу рассмотрим пример.

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
const express = require('express'); const app = express(); const handlebars = require('express-handlebars'); const host = '127.0.0.1'; const port = 7000; app.engine( 'handlebars', handlebars.engine( defaultLayout: 'main' >) ); app.set('views', './views'); app.set('view engine', 'handlebars'); app.get('/', (req, res) =>  res.render('home',  title: 'Greetings form Handlebars', >); >); app.listen(port, host, function ()  console.log(`Server listens http://$host>:$port>`); >); 
h1>>>h1> 
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
 html lang="en"> head> meta charset="utf-8" /> meta name="viewport" content="width=device-width, initial-scale=1" /> title>Node js Handlebarstitle> head> body> >> body> html> 

С помощью метода engine() задается настройка Node.js handlebars, конкретно в примере указывается шаблон по умолчанию, в который будут подгружаться шаблоны страниц.

Генерация и отдача представления осуществляется с помощью метода render() , который принимает два параметра:

  • шаблон;
  • данные для шаблона в виде объекта (если необходимо).

Если директория с шаблонами не задана явно, то поиск представлений по умолчанию будет осуществляться в директории views , а макеты — в views/layouts .

Шаблоны Node.js handlebars представляют собой обычные файлы HTML в формате handlebars, в которых с помощью специального синтаксиса выводятся передаваемые данные. Для отображения значения свойства переданного объекта используется запись <<<(название свойства)>>> .

В макете /views/layouts/main.handlebars запись >> определяет место, куда при запросе определенной страницы будет вставлено соответствующее ей представление.

Чтобы сгенерировать представление без макета, в объекте, передаваемом функции render() укажите свойство layout со значением false . Если хотите использовать макет, отличный от макета по умолчанию, просто укажите его имя. Помните, что макеты должны находиться в директории layouts директории с представлениями.

1 2 3 4 5 6
app.get('/', (req, res) =>  res.render('home',  title: 'Greetings form Handlebars', layout: false, >); >); 

Node.js handlebars гибкий шаблонизатор с обширным функционалом.

Кэширование¶

В handlebars предусмотрен механизм кэширования представлений в режиме production . Шаблонизатор самостоятельно следит за режимом запуска приложения и управляет кэшированием. Но для этого сперва необходимо активировать кэширование с помощью Express.

app.enable('view cache'); 

Условия¶

В представлениях Node.js handlebars предусмотрен механизм отображения той или иной части шаблона в зависимости от определенного условия.

1 2 3 4 5 6
app.get('/', (req, res) =>  res.render('home',  title: 'Greetings form Handlebars', content: 'Description how to use it handlebars', >); >); 
1 2 3 4 5
h1>>h1> > p>>p> > 

Циклы¶

Для вывода данных переданного массива в Node.js шаблонизаторе handlebars предусмотрена конструкция, аналогичная работе обычного цикла.

1 2 3 4 5 6
app.get('/', (req, res) =>  res.render('home',  title: 'Greetings form Handlebars', advantages: ['simple', 'flexible', 'powerful'], >); >); 
 1 2 3 4 5 6 7 8 9 10 11
h1>>h1> > p>Advantagesp> ul> > li>>li> > ul> > 

Частичные представления¶

Для переиспользования повторяющейся части шаблона без ее дублирования при каждом использовании имеются частичные представления.

1 2 3 4 5
ul> > li>>li> > ul> 
1 2 3 4 5
h1>>h1> > p>Advantagesp> advantages>> > 

Вспомогательные функции¶

Под вспомогательными функциями в Node.js handlebars подразумеваются функции, которые могут быть вызваны прямо в представлении для обработки отображаемых данных. Такие функции могут быть определены глобально для всех шаблонов или только для одного конкретного и задаются в свойстве helpers .

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
app.engine( 'handlebars', handlebars.engine( defaultLayout: 'main', helpers:  getTitle: () => 'Greetings form Handlebars', >, >) ); app.set('views', './views'); app.set('view engine', 'handlebars'); app.get('/', (req, res) =>  res.render('home',  helpers:  getAdvantages: () => [ 'simple', 'flexible', 'powerful', ], >, >); >); 
1 2 3
h1>>h1> p>Advantages: >p> 

Вспомогательные функции, определенные локально в методе render() конкретного запроса, могут использоваться только в шаблоне, обрабатываемом этим запросом.

Если имя локально определенной вспомогательной функции совпадает с глобальной, то в представлении, где описана локальная, будет использоваться локальная.

Pug¶

Еще один популярный Node.js шаблонизатор — Pug. Сразу установим его.

npm install pug --save 

И сразу пример с Node.js Pug в качестве шаблонизатора.

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
const express = require('express'); const app = express(); const host = '127.0.0.1'; const port = 7000; app.set('views', './views'); app.set('view engine', 'pug'); app.get('/', (req, res) =>  res.render('main',  title: 'Greetings from Pug' >); >); app.listen(port, host, function ()  console.log(`Server listens http://$host>:$port>`); >); 
1 2 3 4 5 6
html(lang="en") head title Node js Pug meta(charset="utf-8") body h1 #title> 

В Node.js Pug представления имеют расширение .pug и подобно шаблонизатору Handlebars генерируются с помощью метода объекта ответа render() , принимающего первым параметром имя шаблона, а вторым — данные для этого шаблона в виде объекта.

Шаблонизатор использует крайне необычный подход к построению представления. Каждая строка в файле полностью описывает одни HTML-элемента. Сначала идет имя тега, затем через пробел — его значение. Для использования в значении тега (или его атрибута) внешних данных, применяется механизм интерполяции. Так, свойство переданного объекта, значение которого необходимо использовать, заключается в # < и >.

h1 #title> 

Если HTML-тег не указан, то по умолчанию будет использоваться div .

Атрибуты HTML-элементов задаются в следующем формате.

тег(имя*атрибута='значение*атрибута') 

Вложенность тегов HTML в Node.js Pug шаблоне реализуется через отступ табуляции относительно родителя, причем эта вложенность соблюдается в файле и визуально. Для компиляции HTML-кода в одну строку без соблюдения визуальной иерархии используйте следующую запись.

1 2 3
p: span //Результат: ' ' 

Гибкость работы с Node.js Pug обеспечивается рядом специальных инструментов и конструкций.

Переменные¶

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

1 2 3 4 5 6 7 8
-var title = 'New greetings from Pug' html(lang="en") head title Node js Pug meta(charset="utf-8") body h1 #title> 

Условия Pug¶

Node.js шаблонизатор Pug для реализации условий использует конструкции, аналогичные JavaScript операторам if и switch .

1 2 3 4 5 6
app.get('/', (req, res) =>  res.render('index',  title: 'Greetings from Pug', content: 'Node js Pug description', >); >); 
 1 2 3 4 5 6 7 8 9 10 11
html(lang="en") head title Node js Pug meta(charset="utf-8") body h1 #title> if content p #content> else p No content 

Пример со switch .

1 2 3 4 5 6
app.get('/', (req, res) =>  res.render('index',  title: 'Greetings from Pug', type: 'h3', >); >); 
 1 2 3 4 5 6 7 8 9 10 11 12
html(lang="en") head title Node js Pug meta(charset="utf-8") body case type when 'h1' h1 #title> when 'h2' h2 #title> when 'h3' h3 #title> 

Циклы Pug¶

Отображение массива данных или вывод какой-либо части шаблона заданное количество раз осуществляется с помощью конструкций each и while .

1 2 3 4 5 6 7 8
html(lang="en") head title Node js Pug meta(charset="utf-8") body ol each vl, index in ['One', 'Two', 'Three'] li #vl> (#index>) 

Переиспользование шаблонов¶

Для переиспользования представления в Node.js Pug имеется оператор include , в указанное место вставляет содержимое файла заданного шаблона.

1 2 3 4 5 6
html(lang="en") head title Node js Pug meta(charset="utf-8") body include includes/_list.pug 
1 2 3
ol each vl, index in ['One', 'Two', 'Three'] li #vl> (#index>) 

Если указанного файла не существует, то в HTML-документ значение оператора include будет вставлено обычной строкой.

Наследование¶

Node js Pug реализует принцип наследования для шаблонов, за которое отвечают операторы block и extends . С помощью block в представлении описывается какая-либо его часть, которая может быть заменена при наследовании (через extends ) шаблона другим шаблоном. В родительском представлении блок может иметь значение по умолчанию, но если дочернее представление имеет собственную реализацию, то будет использоваться она.

1 2 3
app.get('/', (req, res) =>  res.render('home'); >); 
 1 2 3 4 5 6 7 8 9 10 11 12
html(lang="en") head title Node js Pug meta(charset="utf-8") body block nav ul li Home li About li Contacts block content block footer 
 1 2 3 4 5 6 7 8 9 10
extends index.pug block nav ul li Home li About li Contacts block content div Content text block footer footer Footer information 

Также Node.js Pug позволяет “расширять” значение по умолчанию, а не заменять его. Для этого имеются операторы append и prepend , которые добавляют указанное содержимое после или до значения, заданного по умолчанию.

1 2 3 4 5 6 7
extends index.pug block prepend nav a: img(src="/assets/images/logo.svg" alt="Logo") block content div Content text block footer footer Footer information 

Миксины¶

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

mixin button(label, cssClass) button(class =cssClass) #label> 
1 2 3 4 5 6 7 8
include mixins/_button.pug html(lang="en") head title Node js Pug meta(charset="utf-8") body +button('Cancel', 'red') +button('Send') 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *