Templates
У меня задача подправить страничку <body id=“post”>. То есть, это страничка конкретного поста. Я оказываюсь на ней, когда кликаю в новостной ленте по названию поста. Для этого мне нужно подправить шаблон templates/collection-post.tmpl.
Если я добавлю в этот шаблон какой-нибудь новый элемент, то он появится на страничке всех постов, когда мы будем в них заходить. Тут всё просто.
Допустим мне нужно добавить что-то уникальное на страничку конкретного поста. Я создал пост с названием “Проба” и добавил туда немного бессмыленного текста.
Теперь у него вот такой адрес: https://my-domain.ru/blogname/proba. То есть, slug нашей записи сгенерировался такой: proba. Я хочу сделать так, чтобы когда я захожу в этот пост, на самом верху странички отображался элемент “<p>Hello World</p>”. Но чтобы на страничке других постов этого элемента не было. Открываем /opt/writefreely/writefreely/templates/collection-post.tmpl, находим место на страничке, куда мы хотим добавить элемент, и пишем:
{{if eq .Slug.String "proba"}}
<p>Hello, World!</p>
{{end}}
Перезагрузим WriteFreely. И теперь “Hello, World!” будет отображаться только на страничке https://my-domain.ru/username/proba. На остальных страничках – не будет.
А теперь другая задача. У моего аккаунта два блога: https://my-domain.ru/blog1 и https://my-domain.ru/blog2. Я хочу, чтобы отображался на страничках всех постов, но только на втором блоге.
- https://my-domain.ru/blog1/anypost1 – тут не отображаем;
- https://my-domain.ru/blog1/anypost2 – тут не отображаем;
- https://my-domain.ru/blog2/anypost1 – здесь отображаем Hello, World!;
- https://my-domain.ru/blog2/anypost2 – здесь тоже отображаем Hello, World!;
Это можно сделать вот так:
{{if eq .Collection.Alias "second-blog"}}
Hello, World!
{{end}}
Практическая задача
У меня два блога: blog1 и blog2. В первом блоге у меня есть закреплённый пост partitions: blog1/partitions. Когда я захожу в любой пост блога2 и кликаю по заговку h1, то попадаю на главную страницу блога2. Но я хочу изменить это поведение: чтобы когда я кликаю по h1 в любом посте во втором блоге, я попадал в первый блог на blog1/partitions.
Вот так выглядит HTML-код нашего заголовка h1 в шаблоне collection-post.tmpl:
<h1 dir="{{.Direction}}" id="blog-title">
<a rel="author" href="{{if .IsTopLevel}}/{{else}}/{{.Collection.Alias}}/{{end}}" class="h-card p-author">
{{.Collection.DisplayTitle}}
</a>
</h1>
Внутри href содержится вот эта конструкция:
{{if .IsTopLevel}}
/
{{else}}
/{{.Collection.Alias}}/
{{end}}
Здесь следует подметить, что WriteFreely поддерживает посты, которые находятся непосредственно на верхнем уровне сайта, а также посты могут быть внутри коллекции:
- https://my-domain/my-post – пост на верхнем уровне
- https://my-domain/blog1/my-post – внутри коллекции blog1
- https://my-domain/blog2/my-post – внутри коллекции blog2
То есть, если у нас пост на верхнем уровне, то перебросить нас на /. А иначе (т.е. если пост принадлежит какой-то коллекции) перебрасываем на эту коллекцию. Например, мы зашли на /blog1/my-post. Перебросить на коллекцию blog1, т.е. на главную страницу блога /blog1/*. А если у нас пост – на верхнем уровне /my-post. То перебросить на главную страницу сайта /.
Добавим в href ещё одно условие:
{{if eq .Collection.Alias "blog2"}}
/blog1/partitions
{{else if .IsTopLevel}}
/
{{else}}
/{{.Collection.Alias}}/
{{end}}
Полный HTML заголовка h1 будет выглядеть так:
<h1 dir="{{.Direction}}" id="blog-title">
<a rel="author" href="{{if eq .Collection.Alias "blog2"}}/blog1/partitions{{else if .IsTopLevel}}/{{else}}/{{.Collection.Alias}}/{{end}}" class="h-card p-author">
{{.Collection.DisplayTitle}}
</a>
</h1>
Здесь внутри href=“” используются повторно двойные ковычки. Это нормально. “blog2” – это строковый литерал внутри Go template. Браузер сначала получает результат работы Go template – до него не доходят внутренние “blog2”. А вот подсветка синтаксиса может ломаться.