вторник, 16 ноября 2010 г.

[Blogger.com] Как сделать, чтобы на разных страницах отдельные элементы блога были разными

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

1. Находим в шаблоне место, куда будем вписывать код. В моём примере я буду издеваться над подзаголовоком в шапке блога, у меня в шаблоне он изначально выглядел вот так:
  <div class='descriptionwrapper'>
    <p class='description'><data:description/></p>
  </div>
Чуток переформатируем его для удобства дальнейшего восприятия:
  <div class='descriptionwrapper'>
    <p class='description'>
      <data:description/>
    </p>
  </div>
2. Итак, тег <data:description/> подставляет в шаблон подзаголовок из настроек блога, а нам надо, чтобы на некоторых страницах вместо него выводился нужный нам текст. В этом нам поможет условная конструкция:
<b:if cond='условие'>
  тут текст, который будет показан, если условие выполняется
<b:else/>
  тут текст, который будет показан, если условие НЕ выполняется
</b:if>
В качестве условия используем проверку на равенство некоторому URL: 'data:blog.url == &quot;адрес&quot;'.

Собираем всё вместе: вместо <data:description/> ставим условную конструкцию, а прежний <data:description/> загоняем под <b:else/>:
  <div class='descriptionwrapper'>
    <p class='description'>
      <b:if cond='data:blog.url == &quot;адрес&quot;'>
         какой-то текст
      <b:else/>
        <data:description/>
      </b:if>
    </p>
  </div>
Вместо 'адрес' подставить конкретный URL нужной страницы/поста.
Теперь на странице с указанным адресом в подзаголовке будет «какой-то текст», а на остальных — подзаголовок, взятый из настроек блога.

3. Чтобы добавить текст подзаголовка для еще одной страницы, повторяем предыдущий шаг, добавляя еще одно условие:
  <div class='descriptionwrapper'>
    <p class='description'>
      <b:if cond='data:blog.url == &quot;адрес&quot;'>
         какой-то текст
      <b:else/>
        <b:if cond='data:blog.url == &quot;второй адрес&quot;'>
           еще какой-то текст
        <b:else/>
          <data:description/>
        </b:if>
      </b:if>
    </p>
  </div>
Теперь у нас предусмотрены варианты текста для двух адресов.

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

Однако, тут есть некоторая проблема. Как видите, на каждом шаге конструкция лесенкой растёт «вглубь». Я не знаю, есть ли у движка blogspot ограничение на количество вложенных условных конструкций, но вполне возможно, что добавив так определённое число условий, вы столкнётесь с тем, что blogspot откажется работать с вашим шаблоном. Впрочем, думаю, гораздо раньше вас просто утомит писать эту многоступенчатую «лесенку».
В нормальных языках программирования можно легко создавать многозвенные условные конструкции любой длины, но в blogspot авторы решили использовать такой вот странный синтаксис шаблонов.
Поэтому, если вам нужно создать варианты для 5-6 страниц, это имеет смысл, а если больше — это превращается в крайне утомительное занятие.

Еще несколько рекомендаций:

1. Имейте ввиду, что else-часть писать не обязательно, если вам она не нужна, например:
<b:if cond='data:blog.url == &quot;адрес&quot;'>
 текст
</b:if>

2. Этим способом можно создать разные варианты метатега description для разных страниц!. Хотел написать об этом отдельную заметку, но раз уж зашла речь об использовании условий в шаблоне, упоминаю об этом тут. ;)

3. Бывает, нужно добавить в блог виджет/агджет, но сделать так, чтобы он отображался только на отдельных страницах. Находим в шаблоне данный виджет, находим внутри него фрагмент, начинающийся с <b:includable id='main'> и выносим его содержимое в условие.
Было:
<b:widget id='HTML6' locked='false' title='' type='HTML'>
<b:includable id='main'>
  <!-тут какие-то внутренности виджета-->
</b:includable>
</b:widget>
Стало:
<b:widget id='HTML6' locked='false' title='' type='HTML'>
<b:includable id='main'>
<b:if cond='data:blog.url == &quot;адрес&quot;'>
  <!-тут какие-то внутренности виджета-->
</b:if>
</b:includable>
</b:widget>

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

5. Если у вас есть набор условий, для которого не нужен вариант типа «а для всего остального, не подходящего под условия, сделать так-то» (т.е. самый внутренняя else-часть пустая или отсутствует) и все условия взаимоисключающие (т.е., как раз рассмотренный выше случай: если URL страницы равнен одному значению, то он уже не может быть для этой страницы равен какому-то другому значению), то можно «лесенку» переделать в последовательность одиночных условий:

  <div class='descriptionwrapper'>
    <p class='description'>
      <b:if cond='data:blog.url == &quot;адрес1&quot;'>
         какой-то текст1
      </b:if>
      <b:if cond='data:blog.url == &quot;адрес2&quot;'>
         какой-то текст2
      </b:if>
      <b:if cond='data:blog.url == &quot;адрес3&quot;'>
         какой-то текст3
      </b:if>
      <b:if cond='data:blog.url == &quot;адрес4&quot;'>
         какой-то текст4
      </b:if>
    </p>
  </div>

В этом случае так можно вполне удобно записать множество разных условий, не путаясь у лесенке вложенных if-else.

15 комментариев

FUSESOUND

... Быстро, спасибо!
Наверно попробую сделать для некоторых ярлыков...
Но вообще на блогспот не возможно сделать вывод титлов страницы в описании в шапке?
И хочу поинтересоваться, у нас возможно нормально реализовать как на полноценном сайте для каждого ярлыка своё описание...
Кстати спасибо за

текст

полезный скрипт, ни где раньше не встречал...

FUSESOUND
Этот комментарий был удален автором.
Clr

Для вывода тайтла страницы попробуйте такие теги:
<data:blog.pageName/> — выводит заголовок страницы
<data:blog.pageTitle/> — выводит заголовок страницы с названием блога
При помощи тега data можно вставить в страницу любое содержимое, которое передаётся движком blogspot через переменные. Правда, часть переменных доступна только внутри определённых виджетов.

FUSESOUND

Отлично!
Извиняюсь не совсем понятно, тег титлов куда надо поместить?!

Clr

В любое место шаблона, где требуется выдать титл. Например, туда, где у меня в примерах написано "какой-то текст". Или вместо <data:description/>, если не нужен обычный подзаголовок.

FUSESOUND

Работает, но получается что надо добавить урл каждой страницы?!
Или я что то не понял?!

И у меня в шаблоне присутствует тег span, код выглядеть так p class='description' span data:description/ /span /p (скобки убрал).

Clr

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

FUSESOUND

Нет, я имею ввиду что в место "адрес" надо вписать урл страницы!
А должно в автоматом присваиваться...
То есть что бы не вписывать все свои страницы!

FUSESOUND

Извиняюсь у Вас поинтересоваться ещё можно - как можно закрыть определённые слова, фразы на странице. Может скриптом для бота указать ненужные слова в ноуиндекс?! Я пробовал закрывать тегом ноуиндекс в самом посте но от поста оставалось только название - хотя тег был применён только для некоторых фраз :)

Clr

На всякий случай проверил: qwerty <noindex>qwerty</noindex> qwerty — нормально постится в сообщении. Даже не знаю, где в вашем случае могла возникнуть проблема. Попробуйте еще раз, возможно, что-нибудь сглючило.
Впрочем, этот тег действует только на Яндекс. Закрыть часть текста от гугла способа нет.

Clr

Ну или, как вариант, вместо текста сделать картинку с текстом. Тогда точно не проиндексируют. :)

FUSESOUND

С картинкой интересный вариант :) Спасибо за ответ!

Ash

Очень полезная информация!
Большое Вам спасибо за нее!

Скажите, пожалуйста, а как сделать, чтобы виджет не отображался на опредиленных страницах? Как указать в коде запрещенные страницы?

тико

полезно , спасибо вам

Игорь ВАРНИК

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

Отправить комментарий