Google Blogger - Koden i layout för att identifiera sida och typ av sida

2010-05-02

Google Blogger behandlar egentligen inte inlägg, bloggens startsida eller sidor med etiketter annorlunda. Aktuell Blog widget använder en global datatyp som innehåller alla inlägg och Blogger går igenom denna lista tills de tar slut. Hur många inlägg som finns i listan går inte att avgöra på något självklart sätt.

Om särbehandling krävs mellan olika typer av sidor måste man explicit kontrollera var man befinner sig på en sådan sida via if-satser.

Globala variabler för olika typer av sidor

För att se om man befinner sig på ett inlägg som visas på en egen sida, är i pagination (d.v.s. en etikett) eller på en Blogger sida finns ett antal globala variabler.

Hjälpsidorna har dokumenterat dessa enligt:

"pageType: The type of the current page. One of 'item', 'archive', or 'index'."

I praktiken finns dock fler och en av de tre ovan bör inte användas (diskuteras längre fram).

För att få den globala variabeln returneras anropas:

<data:blog.pageType>

Värdet på denna kommer vara index om vi är i pagination och det inkluderar etiketter, startsidan m.m. där flera inlägg visas.

static_page för att se om vi är på en Blogger sida?

Blogger införde nyligen sidor d.v.s. de har inte datum i URL och de ingår inte i pagination. För dessa sätts den globala variabeln till static_page.

I exemplet nedan kontrolleras först att vi inte befinner oss på en Blogger sida och därefter att det är tillåtet att kommentera. Koden rörande kommentarer togs dock inte.

<b:if cond='data:blog.pageType != "static_page"'>
<b:if cond='data:post.allowComments'>

</b:if>
</b:if>

Att identifiera startsidan

För att särskilja startsidan finns en funktion som returnerar URL för denn. Denna kan vi jämföra med URL för den sida vi befinner oss på. Detta bör göras med data:blog.url och inte data:post.link eftersom data:post.link inte kommer fungera i varje aktuellt fall.

Vill vi se om vi befinner oss på startsidan kan vi göra det enligt:

<b:if cond='data:blog.url == data:blog.homepageUrl'>

</b:if>

Att se om du är i ett inlägg

Om vi befinner oss i ett inlägg d.v.s. en sida som har en permanent länk och som inte är startsidan eller en Blogger sida kommer värdet data:blog.pageType returnerar vara item.

Exempel:

<b:if cond='data:blog.pageType == "item"'>
Vi är i ett inlägg och denna text skrivs bara ut för inlägg.
</b:if>

Archive är problematisk

Den sista av värdena som data:blog.pageType kan ge och som här diskuteras är archive. Problemet med archive är att den inte sätts intuitivt.

Vissa saker som är datumarkiv d.v.s. borde ha archive angivet är också pagination och får därför värdet satt till index.

Ett exempel på det är följande sida jag kommer till när 2009 klickas på i officiell widget för att visa datumarkiv:

www.nyhetsbloggen.com/search?updated-min=2009-01-01T00:00:00%2B01:00&updated-max=2010-01-01T00:00:00%2B01:00&max-results=50

Klickar man därefter vidare och når den sista noden i datumträdet (december) sätts variabeln korrekt till archive:

www.nyhetsbloggen.com/2009_12_01_archive.html

December är också pagination i den mening att flera inlägg visas tillsammans. Dock visas samtliga av dessa inlägg på en sida. Det är detta som är den praktiska skillnaden mellan archive och index. Kan du bläddra mellan flera sidor via färskare och äldre inlägg och vad du tittar på inte är ett inlägg där dess permanenta URL visas högst upp är det index och inte archive.

Ställer du däremot in din pagination för att visa ett inlägg i taget kommer dessa fortfarande vara index trots att det är en item snarare än flera item tillsammans.

Hur särskiljer Blogger archive?

Exakt hur Blogger bestämmer vad som är archive och index kan jag inte avgöra men jag skulle tro att detta är implementerat utanför själva grundalgoritmen genom att de kontrollerar om URL är en permanent länk utan datum.

Detta är vad jag tror sker även för item där en item helt enkelt är en sida med en URL utan search i sig och som inte är ett archive.

Det är av denna anledning jag tror de ger Blogger sidor en URL motsvarande en "underkatalog". Exempelvis:

www.nyhetsbloggen.com/p/sociala-natverk-och-media.html

Anledningen till att de valde en bokstav för detta tror jag är att en item har en siffra där.

Att jämföra t.ex. med:

www.nyhetsbloggen.com/2010_05_01_archive.html

Eller följande sida som är index och precis som alla andra sådana har search efter domänen:

www.nyhetsbloggen.com/search?updated-max=2010-04-30T19:09:00%2B02:00&max-results=3

Relaterat

Fler guider och tips som hjälper dig utveckla din Blogger blogg vidare:

Facebook Like knappen till Google Blogger
StumbleUpon knapp till Blogger steg för steg
Skapa "Sidor" till Google Blogger
Börja blogga i 14 enkla steg
Facebook Like knappen på din sajt steg för steg

Facebook Like med URL till inlägg även på startsidan för Google Blogger

När jag lade till Facebook Like knappen till Google Blogger och skrev guiden gjorde jag en sämre lösning än nödvändigt.

Koden jag skrev för att sätta URL till sidan som ska gillas skrev jag enligt:

<iframe expr:src='"http://www.facebook.com/plugins/like.php?href=" + data:blog.url + "&layout=button_count&action=like&width=100&show_faces=false"' frameborder='0' height='20' width='100px'>
</iframe>

data:blog.url är en funktion i Blogger som returnerar URL till aktuell sida vi befinner oss på. För bloggens startsida innebär det att när Like knappen klickas är det denna URL snarare än inlägget knappen visats med som skickas. Klickar man på knappen när man är på en sida där bara inlägget visas blir det däremot rätt URL.

Exakt samma problem finns med Googles knappar för Buzz. Att lösa problemet för dessa kan vara möjligt men kräver en större insats eftersom de ligger i en stor javascript fil hos Google.

För Facebook Like kan vi lösa det genom att byta ut data:blog.url mot data:post.link. Vad data:post.link gör är att returnera URL till det inlägg Blogger just då pekar på i den lista över inlägg som den stegar sig igenom för att skriva ut. Funktionen går att använda i en widget av typen Blog som det normalt bara finns en av.

Koden blir i detta fall:

<iframe expr:src='"http://www.facebook.com/plugins/like.php?href=" + data:post.link + "&layout=button_count&action=like&width=100&show_faces=false"' frameborder='0' height='20' width='100px'>
</iframe>

Mer om Facebook

Fler guider och tips om Facebook på Nyhetsbloggen:

Facebook Like knappen till Google Blogger
Facebook Like knappen på din sajt steg för steg
Tipsa om länkar i Facebook med bookmarklet direkt från sidan du besöker
Facebook har RSS strömmar att prenumerera på