-
Notifications
You must be signed in to change notification settings - Fork 86
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[#153] add footer login page #155
base: main
Are you sure you want to change the base?
Conversation
@amirhraj Привет! Футер - это такой блок, который должен быть на каждой странице сайта, а не только на странице регистрации. При подходе "в лоб" разметку футера придется копировать на каждую страницу сайта и не забывать добавлять ее при появлении новых. А если захотим что-то изменить в футере, опять же придется править каждую страницу. Чтобы этого избежать, всю общую для всех страниц разметку выносят в отдельный шаблон - layout. А сами страницы содержат только уникальную для каждой страницы разметку. Затем эти уникальные фрагменты "вставляются" в общий шаблон. Посмотри пожалуйста, как это сделано в нашем демо приложении. Это общий шаблон, в котором есть плейсхолдеры. На их место будут вставляться конкретные фрагменты разметки. А вот сама страница. При рендере этой страницы в шаблонизаторе этот фрагмент будет подставлен на место плейсхолдера в шаблоне и получится такая вот комбинированная разметка. Таким образом получается, что вся общая разметка находится в одном месте, ее не приходится дублировать и без труда можно поправить. Попробуй сделать по аналогии здесь |
И здорово будет потом задеплоить полученный результат куда-нибудь, например на railway или render. Чтобы можно было потыкать, посмотреть, как работает приложение |
Принято буду исправлять |
Задеплоить не получилось выдало такие ошибки Dockerfile:19 |
@@ -84,6 +84,6 @@ | |||
</div> | |||
</div> | |||
</main> | |||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Футер должен быть не только на странице входа, но вообще любой, где пользователь сидит. К примеру такая логика на Хекслете, код бейзиксе (на хекслете футера нет только в практиках)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я почти везде добавил, чтобы посмотреть как это все выглядет и потыкать мы можем связаться в телеграм или еще где, я его у себя соберу и дам IP что бы смогли зайти посмотреть.
@amirhraj локально выглядит криво. |
@@ -54,5 +54,6 @@ <h5 class="card-title mb-1">Workspaces</h5> | |||
</tbody> | |||
</table> | |||
</main> | |||
<footer th:replace="~{fragments/footer :: foot}"></footer> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Посмотрите, есть ли в шаблонизаторе механизм наследования шаблонов, чтобы не дублировать футер во все страницы подряд.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно немного подробнее про этот момент, я вроде и так получается использую шаблоный футер и передаю его с помощью шаблонизатора
@@ -5,5 +5,6 @@ | |||
<div class="alert alert-success"> | |||
<span>Сообщение об ошибке успешно отправлено. Спасибо!</span> | |||
</div> | |||
<footer th:replace="~{fragments/footer :: foot}"></footer> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
В данном файле футер не нужен. Это кусочек виджета
@@ -45,5 +45,6 @@ | |||
} | |||
}; | |||
</script> | |||
<footer th:replace="~{fragments/footer :: foot}"></footer> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
В данном файле футер не нужен. Это кусочек виджета
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Как минимум нужно поправить отображение футера. Если возможно - использовать наследование шаблонов.
@amirhraj Привет! Идем в верном направлении, переиспользуем футер и уже не дублируем код футера. Это хорошо. Давай пойдем еще дальше и сделаем именно наследование шаблонов. Представь такую ситуацию, мы захотим добавить на страницы помимо футера еще общие элементы. Например, флеш-сообщения, панель навигации и тд. При нынешнем подходе придется делать отдельные файлы для навигации, для флеш сообщений. А затем вставлять их на каждую страницу, где они должны быть при помощи th:replace. А страниц ведь могут быть сотни. Легко запутаться и что-нибудь забыть. При наследовании этого получится избежать. То есть у нас будет одна страница - костяк, например layout.html. Она будет содержать все общие элементы - футер и тд. А также точки, которые мы позже заменим соответствующими фрагментами из конкретных страниц. А конкретные станицы будут содержать только уникальные фрагменты - контент. Почитай про Теперь, когда мы будем рендерить конкретную страницу, он возьмет костяк - шаблон layout с общими вещами и "навтыкает" туда фрагментов конкретной страницы в те места, которые мы указали в шаблоне. И получится итоговая станица - такое сочетание базовой и конкретной. При таком подходе становится гораздо проще добавлять новые общие элементы - достаточно будет поменять один раз layout, а все остальные страницы, использующие этот layout, останутся неизменными |
@amirhraj Привет! Нужна еще какая-то помощь с ПРом? |
Привет послезавтра примусь за реализацию, не подскажешь мне все фрагменты нужно будет так реализовать? |
Ну да. Нужно будет сделать один layout - костяк страницы со всеми общими элементами, а затем на отдельных страницах сделать фрагменты, которые в этот layout будут подставляться |
@amirhraj Привет! Вот наш layout - костяк страницы: <!DOCTYPE html>
<html lang="en" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1" name="viewport">
<title>Hexlet Typo Reporter</title>
<link rel="stylesheet" th:href="@{/webjars/bootstrap/css/bootstrap.min.css}" type="text/css" />
<script th:src="@{/webjars/bootstrap/js/bootstrap.bundle.min.js}" type="text/javascript"></script>
</head>
<body>
<main class="container">
<section layout:fragment="content"></section>
</main>
<footer class="bg-dark text-light fixed-bottom">
<div class="container-xl">
<div class="row justify-content-lg-around">
<div class="col-sm-6 col-md-3 col-lg-auto">
<a class="text-dark px-0 py-0 text-decoration-none " href="https://ru.hexlet.io">
<p class="h3 mb-2 text-light">© Hexlet</p>
</a>
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light" href="https://sicp.hexlet.io/ru/pages/about">
О проекте
</a>
</li>
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light" href="https://github.com/Hexlet/hexlet-correction"
target="_blank">
Исходный код
</a>
</li>
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light" href="https://t.me/hexletcommunity/12"
target="_blank">
Telegram Hexlet канал Волонтеры
</a>
</li>
</ul>
</div>
<div class="col-sm-6 col-md-3 col-lg-auto">
<p class="h5 mb-3">Помощь</p>
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light" href="https://ru.hexlet.io/blog">
Блог
</a>
</li>
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light" href="https://ru.hexlet.io/knowledge">
База знаний
</a>
</li>
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light"
href="https://ru.hexlet.io/pages/recommended-books">
Рекомендуемые книги
</a>
</li>
</ul>
</div>
<div class="col-sm-6 col-md-3 col-lg-auto">
<p class="h5 mb-3">Другие open-source проекты</p>
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light" href="https://github.com/Hexlet/hexlet-cv">
Хекслет-резюме
</a>
</li>
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light" href="https://github.com/Hexlet/hexlet-editor">
Хекслет-редактор
</a>
</li>
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light" href="https://github.com/Hexlet/hexlet-friends">
Друзья Хекслета
</a>
</li>
</ul>
</div>
<div class="col-sm-6 col-md-3 col-lg-auto">
<p class="h5 mb-3">Дополнительно</p>
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light" href="https://ru.code-basics.com/">
Code Basics
</a>
</li>
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light" href="https://codebattle.hexlet.io/">
Кодбаттл
</a>
</li>
<li class="nav-item">
<a class="nav-link px-0 py-1 text-light" href="https://guides.hexlet.io/">
Гайды Хекслета
</a>
</li>
</ul>
</div>
</div>
</div>
</footer>
</body>
</html> Тут у нас все общие для всех страниц элементы, в данном случае футер. Обрати внимание на кусок кода <section layout:fragment="content"></section> Это то место, куда будет вставлен контент конкретной страницы |
Дальше сама страница регистрации <!DOCTYPE html>
<html lang="en" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{fragments/layout.html}">
<section layout:fragment="content">
<div th:replace="~{fragments/header :: head}"></div>
<div style="padding-top: 4.5rem">
<div th:replace="~{fragments/panels :: mainNavbarTop}"></div>
<div class="row">
<div class="col">
<div class="alert alert-danger" role="alert" th:if="${param.error}">
Bad credential
</div>
<div class="alert alert-warning" role="alert" th:if="${param.logout}">
You have been logged out.
</div>
<form method="post" th:action="@{/login}">
<div class="form-floating mb-3">
<input autofocus class="form-control" id="inputUsername"
name="username" placeholder="Username" required type="text">
<label for="inputUsername">Username</label>
</div>
<div class="form-floating mb-3">
<input class="form-control" id="inputPassword" name="password"
placeholder="Password" required type="password">
<label for="inputPassword">Password</label>
</div>
<button class="btn btn-primary" type="submit">Login</button>
</form>
</div>
</div>
</div>
</section>
</html> Тут мы указываем, от какого шаблона наследуемся: <html lang="en" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{fragments/layout.html}"> И указываем фрагмент, который будет вставлен в layout:
|
Такие же фрагменты делаем в остальных страницах |
|
|
Pom.xml добавил эту библиотеку
|
Добавляю и понижая версию этой библиотеки так же не дает результата, я не знаю куда смотреть где посмотреть логи и ошибки связанные с этой библиотекой и почему не отображается фотер |
А бин LayoutDialect не забыл подключить? @Bean
public LayoutDialect layoutDialect() {
return new LayoutDialect();
} |
Да он у меня подключен, хотел спросить ты вроде его у себя запускал и у тебя footer отобразился, не подскажешь какие у тебя там конфигурация была ? Версия этой Таймлиф библиотеки плюс Бин? |
Ещё импорт в файл Таймлиф конфигурации |
Я как будто гадаю и собираю комбинации чтобы у меня заработала |
Нашел такую запись Бин @bean |
Привет, не получилось |
что то я у себя не увидел зеленой кнопки по добавлении ПР |
Привет! Изменения автоматом попадают в открытый ПР, когда ты пушишь в эту ветку |
Посмотри пожалуйста, как коллега ваш вот тут делает https://github.com/RedGradient/hexlet-correction/blob/add-footer/src/main/resources/templates/application.html. Это наш макет страницы. Тут уже есть общиэ элементы для всех страниц - А вот конкретная страница https://github.com/RedGradient/hexlet-correction/blob/37ffe126eb62b9c5425761388c14e9ce52bf586c/src/main/resources/templates/login.html#L5 Вот этот фрагмент будет вставляться на место "дырки" в наш макет |
Вышел в отпуск, две недели не смогу что-то сделать, если спешит , можете передать другому коллеге |
No description provided.