21/02/2024
At skabe en visuelt tiltalende og funktionel hjemmeside i Drupal handler i høj grad om dens tema. Et tema er fundamentet for din sides udseende og brugeroplevelse. Det definerer, hvordan indholdet præsenteres for dine besøgende, fra layout og farveskemaer til typografi og interaktive elementer. I denne dybdegående artikel vil vi udforske de mange facetter af Drupal theming, fra de grundlæggende principper til avancerede teknikker.

Hvad er et Drupal Tema?
Et Drupal tema er en samling af filer, der bestemmer sidens præsentationslag. Disse filer inkluderer typisk HTML-struktur, CSS til styling, JavaScript for interaktivitet og Twig-skabeloner til at definere, hvordan data vises. Temaet adskiller design og præsentation fra kernen af Drupal, hvilket giver dig mulighed for at ændre sidens udseende uden at påvirke den underliggende funktionalitet.
Du kan tænke på et tema som et digitalt 'outfit' til din Drupal-installation. Det er det, brugerne ser og interagerer med. Drupal er utroligt fleksibelt, når det kommer til theming, hvilket giver udviklere og designere friheden til at skabe alt fra enkle, minimalistiske designs til komplekse, dynamiske brugergrænseflader.
Grundlæggende Filstruktur og .info.yml
Ethvert Drupal tema starter med en .info.yml fil. Denne fil er hjertet i dit tema, da den indeholder vigtig metadata om temaet, såsom dets navn, beskrivelse, version, og hvilke regioner det understøtter. Uden en korrekt konfigureret .info.yml fil vil Drupal ikke genkende din filsamling som et gyldigt tema.
En typisk tema-mappestruktur kunne se således ud:
my_theme/ ├── css/ │ └── style.css ├── js/ │ └── script.js ├── templates/ │ ├── page.html.twig │ └── node--article.html.twig ├── logo.svg ├── my_theme.info.yml └── my_theme.libraries.yml
Filen my_theme.info.yml ville indeholde noget i stil med:
name: 'My Awesome Theme' description: 'Et brugerdefineret tema til min Drupal-side.' type: theme core_version_requirement: ^9 || ^10 # Angiver de regions, temaet understøtter regions: header: 'Header' primary_menu: 'Primary menu' content: 'Content' sidebar_first: 'Sidebar first' sidebar_second: 'Sidebar second' footer: 'Footer' # Afhængigheder til andre moduler eller temaer # dependencies: # - drupal/core_version_requirement # Angiver hvilke biblioteker der skal indlæses # libraries: # - my_theme/global-styling
Filen my_theme.libraries.yml bruges til at definere og gruppere temaets aktiver (assets) som CSS og JavaScript:
global-styling: version: 1.0 css: base: css/style.css: {} js: js/script.js: {} dependencies: - core/jquery - core/drupal Tilføjelse af Regioner
Regioner er specifikke områder på din side, hvor indhold kan placeres. Standard Drupal-installationer kommer med foruddefinerede regioner som 'Header', 'Content', 'Sidebar' og 'Footer'. Du kan definere dine egne regioner i din .info.yml fil for at skabe mere fleksibilitet i dit layout.
Når du har defineret regioner i din .info.yml fil, skal du også inkludere dem i din page.html.twig skabelonfil for at de bliver synlige. Dette gøres ved at bruge Twig-syntaksen:
<!-- Page template --> <header role="banner"> {{ page.header }} </header> <!-- Main navigation --> <nav role="navigation"> {{ page.primary_menu }} </nav> <!-- Main content area --> <main role="main"> {{ page.content }} </main> <!-- Sidebars --> <aside role="complementary"> {{ page.sidebar_first }} {{ page.sidebar_second }} </aside> <!-- Footer --> <footer role="contentinfo"> {{ page.footer }} </footer> Ved at placere indhold i disse regioner via Drupal's administrationsinterface (typisk under 'Structure' -> 'Block layout'), kan du nemt styre, hvor forskellige blokke af indhold vises på din side.
Tilføjelse af Aktiver (CSS & JS)
Som vist i eksemplet med my_theme.libraries.yml, er det den foretrukne metode at inkludere CSS- og JavaScript-filer i Drupal via bibliotekssystemet. Dette sikrer, at dine aktiver kun indlæses, når de rent faktisk er nødvendige, hvilket forbedrer sidens ydeevne.
Du kan definere forskellige biblioteker til forskellige formål. For eksempel kan du have et bibliotek til globale styles, et andet til specifikke komponenter, eller endda dynamisk indlæsning af JavaScript baseret på siden eller indholdstypen.
Inkludering af CSS
I din my_theme.libraries.yml fil kan du specificere stien til dine CSS-filer. Du kan også angive, om filen skal indlæses som 'base' (typisk i <head>), 'layout', 'component', eller 'state'.
Inkludering af JavaScript
Tilsvarende kan du angive stien til dine JavaScript-filer. Du kan også angive, om JavaScript skal indlæses i <head> eller før lukningen af </body> tagget. Det er generelt god praksis at indlæse JavaScript sidst på siden for at forbedre den indledende sideindlæsningstid.
Eksempel på inkludering af et specifikt JavaScript-bibliotek til en bestemt side:
my-special-js: version: 1.0 js: js/special-script.js: { weight: 0, defer: true } dependencies: - core/jquery Dette bibliotek kan derefter kaldes i din .theme fil eller i dine Twig-skabeloner ved hjælp af {{ attach_library('my_theme/my-special-js') }}.
Sub-Theming: Udvidelse af Eksisterende Temaer
En af de mest kraftfulde funktioner i Drupal theming er muligheden for at skabe sub-temaer. Et sub-tema arver alle egenskaber fra sit 'forældre'-tema, men giver dig mulighed for at overskrive og tilføje dine egne styles og skabeloner. Dette er ideelt, når du vil bygge videre på et eksisterende tema (som et distributions tema eller et tema fra tredjepart) uden at ændre direkte i kernen af det tema.
For at skabe et sub-tema, skal du blot definere et nyt tema med en .info.yml fil, der angiver `base theme` egenskaben:
name: 'My Sub Theme' description: 'Et sub-tema baseret på et andet tema.' type: theme core_version_requirement: ^9 || ^10 base theme: classy # Eller et andet tema, f.eks. stable9 regions: header: 'Header' content: 'Content' footer: 'Footer' libraries: - my_sub_theme/global-styling
I dette eksempel arver 'My Sub Theme' fra 'classy' temaet. Alle CSS, JS og skabeloner fra 'classy' vil være tilgængelige for 'My Sub Theme', medmindre de eksplicit overskrives.
Brug af Stable og Stable9 som Base Temaer
Drupal's 'Stable' og 'Stable9' temaer er designet til at tilbyde en stabil markup-struktur, der er mindre tilbøjelig til at ændre sig ved Drupal-opdateringer. Ved at bruge disse som base temaer i dine sub-temaer, kan du sikre en større fremtidssikring af din sides design.
Her er en oversigt over, hvilke egenskaber der typisk arves og ikke arves:
| Arves | Arves Ikke (Kan Overskrives) |
|---|---|
| CSS-filer og JS-filer defineret i base temaets libraries.yml | Temaets overordnede struktur, layout og specifikke Twig-skabeloner |
| Region-definitioner | Specifikke region-layouts og indholdet inden i dem |
| Klasser og attributter brugt i base temaets markup | Nye CSS-klasser, ID'er eller attributter tilføjet i sub-temaet |
Avancerede Theming Teknikker
Brug af Twig og Preprocessing
Drupal 8 og nyere versioner bruger Twig som standard templating engine. Twig er kendt for sin renere syntaks og sikkerhedsfunktioner sammenlignet med PHP-baserede templates.
Du kan påvirke outputtet af HTML via preprocess-funktioner i din .theme fil. Disse funktioner giver dig mulighed for at manipulere variabler, før de sendes til Twig-skabelonen.
Eksempel på en preprocess-funktion i my_theme.theme:
/** * Implements hook_preprocess_HOOK(). */ function my_theme_preprocess_node(&$variables) { // Tilføj en brugerdefineret klasse til alle node-visninger. $variables['classes_array'][] = 'my-custom-node-class'; // Ændre outputtet af en specifik variabel. if (isset($variables['content']['field_my_field'])) { $variables['content']['field_my_field']['#prefix'] = '<div class="custom-field-wrapper">'; $variables['content']['field_my_field']['#suffix'] = '</div>'; } } Brug af attributter i Twig:
Twig-skabeloner bruger attribut-objekter til at håndtere HTML-attributter som klasser og ID'er på en dynamisk måde. Dette gør det nemmere at styre, hvilke attributter der tilføjes til et element.
<!-- Eksempel på brug af attributter i en Twig-skabelon --> <div{{ attributes.addClass('my-custom-wrapper', 'clearfix') }} data-nid={{ node.id() }} > {{ title_prefix }} <h2><a href="{{ url }}">{{ label }}</a></h2> {{ title_suffix }} <div class="content"> {{ content }} </div> </div> Breakpoints
Breakpoints er definerede skærmbredder, hvor designet af din hjemmeside ændrer sig. Drupal's Breakpoints modul standardiserer brugen af breakpoints og gør det muligt for temaer og moduler at dele og bruge dem på tværs af hinanden.
Du kan definere breakpoints i din my_theme.yml fil (eller en separat breakpoints.yml fil) og derefter bruge dem i dine CSS-filer eller i billed-stilarter for at sikre responsivt design.
# Eksempel på breakpoints.yml my_theme.mobile: label: 'Mobile breakpoint' mediaQuery: min-width: 0 max-width: 767px group: mobile my_theme.tablet: label: 'Tablet breakpoint' mediaQuery: min-width: 768px max-width: 1023px group: tablet my_theme.desktop: label: 'Desktop breakpoint' mediaQuery: min-width: 1024px group: desktop
Tema Indstillinger
Du kan tilføje brugerdefinerede indstillinger til dit tema via administrationsinterfacet. Dette gøres ved at oprette en formular i din .theme fil (ved hjælp af `hook_form_alter` eller ved at definere en `theme_settings` funktion) og derefter gemme indstillingerne. Disse indstillinger kan bruges til at styre ting som logo, farver, eller andre visuelle præferencer direkte fra Drupal's administrationssektion (`/admin/appearance`).
Inkludering af Standard Billedstilarter
Drupal har et kraftfuldt billedbehandlingssystem, der giver dig mulighed for at oprette billedstilarter med forskellige effekter. Du kan inkludere disse stilarter direkte i dit tema, så de er tilgængelige for brugere, der opretter indhold.
Forskelle i Theming mellem Drupal Versioner
Theming-landskabet har udviklet sig markant gennem Drupal's historie:
| Drupal Version | Primære Ændringer i Theming |
|---|---|
| Drupal 6/7 | PHP-baserede temaer (.tpl.php filer), Phptemplate templating engine. Mindre standardiseret asset-håndtering. |
| Drupal 8 | Overgang til Twig templating engine. Introduktion af .info.yml og .libraries.yml. Stærkere fokus på objekter og OOP. Ændringer i kerne-klasser. |
| Drupal 9/10 | Fortsat udvikling af Twig. Bedre understøttelse af moderne webteknologier. Stable9 som base tema. Forbedret API for theming. |
Opgradering af Klasser fra Drupal 7 til Drupal 8+: Mange af de CSS-klasser og HTML-strukturer, der blev brugt i Drupal 7, er ændret i Drupal 8 og nyere versioner. Det er vigtigt at være opmærksom på disse ændringer, når man opgraderer temaer.
Twig Konvertering: Processen med at konvertere .tpl.php filer til .html.twig filer er afgørende for at udnytte Drupal 8+'s theming-system fuldt ud.
Automatisering af Theming
For at strømline udviklingsprocessen kan man bruge automatiske værktøjer som Gulp.js. Gulp kan automatisere opgaver som:
- Kompilering af Sass/Less til CSS
- Minificering af CSS og JavaScript
- Billedoptimering
- Live reloading af browseren under udvikling
Dette kan betydeligt øge effektiviteten, især i større projekter.
Ofte Stillede Spørgsmål (FAQ)
Hvad er forskellen på et tema og et sub-tema?
Et tema er et selvstændigt design. Et sub-tema arver fra et andet tema (base temaet) og kan derefter tilpasse eller udvide det uden at ændre det originale tema.
Hvordan tilføjer jeg et nyt logo til mit tema?
Du kan typisk placere en logo.svg eller logo.png fil i din tema-mappe. Alternativt kan du definere logoet i din .info.yml fil eller via temaets indstillingsside.
Hvornår skal jeg bruge et sub-tema?
Brug et sub-tema, når du vil bygge videre på et eksisterende tema, enten et du selv har lavet tidligere, et tema fra en distribution, eller et tredjeparts tema. Det fremmer genbrug og vedligeholdelse.
Kan jeg bruge PHP direkte i mine Twig-skabeloner?
Det er generelt ikke anbefalet at bruge kompleks PHP-logik direkte i Twig. Brug i stedet preprocess-funktioner i din .theme fil til at forberede variabler og logik, før de sendes til Twig.
Hvordan sikrer jeg, at mit tema er responsivt?
Brug CSS media queries, flexible layouts (som Flexbox eller Grid), og definer breakpoints i Drupal's Breakpoints modul for at tilpasse designet til forskellige skærmstørrelser.
Afslutningsvis er Drupal theming en essentiel del af at skabe en unik og engagerende online tilstedeværelse. Ved at mestre filstrukturer, Twig-templating, asset-håndtering og sub-theming, kan du transformere din Drupal-side til præcis det, du forestiller dig.
Hvis du vil læse andre artikler, der ligner Drupal Theming: Skab Unikke Brugeroplevelser, kan du besøge kategorien Teknologi.
