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. Я хочу, чтобы отображался на страничках всех постов, но только на втором блоге.

Это можно сделать вот так:

{{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 поддерживает посты, которые находятся непосредственно на верхнем уровне сайта, а также посты могут быть внутри коллекции:

То есть, если у нас пост на верхнем уровне, то перебросить нас на /. А иначе (т.е. если пост принадлежит какой-то коллекции) перебрасываем на эту коллекцию. Например, мы зашли на /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”. А вот подсветка синтаксиса может ломаться.