Hopp til innholdet

cjohansen.no

Semantisk HTML med eZ Publish

eZ Publish er et veldig fleksibelt publiseringssystem mht maler og generert kode. Men for å virkelig få på plass finsemantikken i innholdet som produseres gjennom XML-feltene må du justere litt på standardoppsettet.

eZ Publishs XML-format

En av de store styrkene til eZ Publish (heretter eZP) er at innholdet ikke lagres som et bruddstykke av et HTML-dokument. Innholdet lagres heller som eZXML, en XML-dialekt laget av eZ Systems for eZP. De fleste innholdsfelter i eZP bruker denne typen, og innholdet her transformeres til HTML ved hjelp av Smarty-lignende maler når siden skal vises.

Custom Tags

eZXML har støtte for de mest vanlige elementene så som headinger, lenker, lister osv. Men, skal man ha mer detaljert semantikk i dokumentene sine må man ty til eZPs "custom tags". Disse lar deg definere vilkårlige tagger som innholdsforfatterne kan benytte seg av. En custom tag kan være en tag som mapper 1:1 mot en HTML-tag, eller en helt egen sak som viser for eksempel en faktaboks med noe mer kompleks HTML bak. Alt bestemmes av malene.

Hvordan konfigurere?

For å ta i bruk dette må du gjøre noen få konfigurasjonsinngrep. Den første er å definere hvilke tagger som er tillatt. Disse navnene kan være hva som helst, de trenger ikke å ha tilknytning til HTML-standarden eller andre standarder, de er foreløpig kun interne navn. Definisjonene må legges i content.ini(.append(.php)), på et sted som adminen har tilgang til, for eksempel settings/override/content.ini.append:

[CustomTagSettings]
AvailableCustomTags[]=q
AvailableCustomTags[]=blockquote
AvailableCustomTags[]=cite
AvailableCustomTags[]=del
AvailableCustomTags[]=ins
AvailableCustomTags[]=code
AvailableCustomTags[]=dfn
AvailableCustomTags[]=abbr
AvailableCustomTags[]=acronym
AvailableCustomTags[]=span

Merk at selv om alle disse navnene tilfeldigvis er HTML-tagger kunne de ha vært hva som helst. Jeg har inkludert span til slutt fordi span kan være nyttig når du trenger å angi språk på et uttrykk midt i en setning eller lignende uten at du ønsker annet trykk på det.

Videre må det defineres hvorvidt taggene er inline eller blokk-elementer (gjøres under samme CustomTagSettings-seksjon):

IsInline[q]=true
IsInline[blockquote]=false
IsInline[cite]=true
IsInline[del]=true
IsInline[ins]=true
IsInline[code]=true
IsInline[dfn]=true
IsInline[span]=true
IsInline[abbr]=true
IsInline[acronym]=true

Når dette er gjort kan vi opprette en blokk per tag for å gi dem attributter. Fortsatt samme fil:

[q]
CustomAttributes[]
CustomAttributes[]=cite
CustomAttributes[]=title
CustomAttributes[]=classification
CustomAttributes[]=id
CustomAttributes[]=lang

Legg merke til at det ikke finnes noe xml:lang-attributt. Dette kan vi dedusere fra lang-attributtet i templaten, dersom det er XHTML vi bruker.

Malene

Neste skritt er å lage maler for disse taggene. I eXML vil disse taggene lagres som <custom class="q" cite="..." lang="...">...</custom>. Uten at vi trenger å gjøre noe som helst så vil eZP spørre etter en mal content/datatype/view/ezxmltags/<tagnavn>.tpl når den møter på slike.

Alt vi da trenger å gjøre er å legge malene på eksempelvis design/mittdesign/templates/content/datatype/view/ezxmltags/<tag>.tpl. Ønsker du ikke å bruke denne plasseringen kan du lage overrides i override.ini og angi en annen plassering. MatchFile er da content/datatype/.../<tag>.tpl

Siden alle disse malene skal fungere helt likt: oversette en custom-tag til sin tilsvarende HTML-tag, og siden navnet på taggene er helt like kunne vi ha klart oss med en mal for dette. Desverre har ikke jeg vært i stand til å finne dokumentasjon som forteller meg hvordan jeg henter tag-navnet i malen, så jeg har ikke vært i stand til å lage kun én mal. Det jeg heller gjorde var å lage en generell mal som alle de andre inkluderer.

design/mittdesign/templates/content/datatype/view/ezxmltags/custom.tpl:

{def $attr_str=''}
{if not(is_set($attributes))}{def $attributes=hash()}{/if}
{foreach $attributes as $key => $value}
    {if $value|trim|ne('')}
        {set $attr_str=concat($attr_str, ' ', $key, '="', $value, '"')}
        {if $key|eq('lang')}
            {set $attr_str=concat($attr_str, ' xml:lang="', $value, '"')}
        {/if}
    {/if}
{/foreach}
<{$tagname}{$attr_str}>{$content}</{$tagname}>

Denne malen tar som input $tagname, $content og hash-en $attributes. Den brukes fra tag-malene på følgende måte:

design/mittdesign/templates/content/datatype/view/ezxmltags/q.tpl

{include uri='design:content/datatype/view/ezxmltags/custom.tpl'
         name='html_q'
         tagname='q'
         content=$content
         attributes=hash('cite', $cite,
                         'title', $title,
                         'class', $classification,
                         'id', $id,
                         'lang', $lang)}

Editoren/admin

Når dette er gjort kan du bruke taggene fra <?>-knappen i editoren, eller manuelt ved å skrive <custom class="<tagnavn>" [attributter]>...</custom>. Bruker du custom tags ofte vil du etterhvert spare tid på å skrive eZXML selv fremfor å bruke editoren.

Bruker du editoren vil du helt sikkert ha et ønske om å visuelt markere de forskjellige custom taggene. Dette kan du gjøre ved å åpne extension/ezdhtml/design/standard/stylesheets/ezdhtml/editor_classes.css og legge inn stiling av taggene der. Hvordan du gjør det er forklart i toppen av filen.

Voila! Semantisk HTML i alle ledd med eZ Publish (forutsatt at du har laget malene selv).

Muligens relatert

2006 - 2012 Christian Johansen Creative Commons Lisens