Drupal Views en Arguments

Drupal onderscheid zich van veel andere content management systemen door de enorme flexibiliteit en krachtige mogelijkheden die het biedt door gebruik van vooral de Views en Content Construction Kit (CCK) module: twee modulen die (nog) niet in de core zitten maar eigenlijk vereist zijn voor elke Drupal site die iets meer wil dan alleen statische pagina's tonen. Juist dit soort toepassingen laten goed zien dat Drupal meer gezien kan worden als een framework dan alleen CMS.

De Views module maakt het mogelijk om content te tonen op een andere manier dan de 'default' manier. Standaard worden content (nodes) getoond via zelf gemaakte links of links in een menu. Prima als je niet meer nodig hebt, maar wat als je een pagina wilt maken met een lijst van de laatste 10 pagina's van een bepaalde auteur? Of een lijst met gerelateerde pagina's in een kader naast de betreffende pagina? Dan heb je dus Views nodig. En voor het laatste ook CCK.

CCK ga ik hier verder niet bespreken, misschien een andere keer, maar er is genoeg informatie op het net over te vinden. Ook over Views trouwens, maar wat minder wanneer je binnen Views gebruik wilt maken van Arguments. Om onderstaande te volgen moet je dus al wel enige ervaring hebben met het gebruik van deze modulen.
Normaal gesproken kan je wanneer je de Views module hebt geïnstalleerd gemakkelijk een View aanmaken en configureren zodat het de content laat zien als page (waar je net als bij een normale node ook weer heen kan linken of in een menu beschikbaar maken) of als block. Bij deze laatste is de view niet beschikbaar via een bepaalde url maar kan je hem tonen in een bepaalde block (regio op de site). Voor blocks kun je weer aangeven bij welke pagina's ze getoond moet worden. Dit kan je allemaal doen via Drupal zonder ook maar 1 regel code in te voeren.

Maar wat nu als je een view wil maken, als block, die in een kader contextueel content moet tonen. Oftewel: afhankelijk van de hoofd-content(node) op de pagina. Dan zal je gebruik moeten maken van arguments in de view. Jeweetwel, arguments is dat stukje configuratie binnen een view dat je tot nu toe snel overgeslagen hebt ;)

Views en arguments

Arguments maakt gebruik van informatie uit de url om een dynamisch filter te creëren. Dus bijvoorbeeld bij www.merge.nl/node/23 is arg(0) 'node' en arg(1) '23'. Ook als je gebruik maakt van url aliassen (autopath) dan wordt altijd deze originele url gebruikt, niet de alias (belangrijk om te weten!). Via het configuratie scherm zoals hierboven afgebeeld kun je door ook nog redelijk mee uit de voeten, maar de echte magie kun je invoeren in het standaard ingeklapte gedeelte 'Argument Handling Code' waarmee je de mogelijkheden kan vergroten.

Nog iets dat belangrijk is om te weten - en niet goed gedocumenteerd staat - is dat je de argumenten die je in het argument handling code gedeelte wilt gebruiken ook moet aanzetten in de arguments daarboven.

Een voorbeeld:

Hoe maak je een Drupal view die contextueel afbeeldingen laat zien bij een bepaalde node?

Een populaire toepassing waarbij je afbeeldingen (uit een gezamenlijke verzameling) kan koppelen aan een node. Via een block worden ze getoond naast de pagina. Deze blocks kun je zelf definieren of gebruik maken van de standaard (right_sidebar, left_sidebar, header, etc.). In dit voorbeeld gaan we uit van de sidebar waar je afbeeldingen wilt tonen bij het standaard meegeleverde content-type 'page'.

Vereiste modules:

Eerst maken we een content-type aan voor de inhoud van de sidebar. In dit geval worden dat dus afbeeldingen, maar het zou van alles kunnen zijn.

Maak een content-type met titel 'sidebar afbeeldingen' en type (machine name) 'sidebar_afbeeldingen'. Niet promoten naar de frontpage. Sla het op en voeg een image field toe, genaamd 'afbeelding'.

Het is handig wanneer je nu een paar nodes van dit type creëert, waarbij je dus een paar afbeeldingen zal moeten uploaden.

Voeg nu aan het content-type 'page' een veld toe: een Node Reference field genaamd 'kader_afbeeldingen' (het label mag wel met spatie zijn). Kies voor 'select list' en vink 'multiple values' aan en vink het content-type 'sidebar afbeeldingen' aan zodat alleen daaruit getoond wordt.

Wanneer je nog geen pagina's had gemaakt is het nu de tijd, of edit een bestaande pagina. Je zal daar nu het veld 'kader afbeeldingen' zien waarbij je kan kiezen uit de afbeeldingen die je eerder hebt geüpload. Selecteer een paar afbeeldingen (shift-click om meerdere te selecteren) en sla op.

Alle data zit er nu in. Tijd om de View op te zetten en te tonen in een block.

Maak een nieuwe view aan, genaamd 'afbeeldingen_bij_pagina'. Kies voor een block (niet page) en zet 'View Type' op 'List View' en het aantal Nodes per Block op het aantal afbeeldingen dat je wilt tonen bij een pagina. Zet onder Fields één veld aan: 'Image: field_afbeelding' en zet de handler op 'Not group multiple values'.

Voeg onder arguments 1 argument toe: 'Node: ID' en kies default voor 'Use Empty Text'. Nu het gedeelte waar we wat PHP-code zullen plaatsen: klap het Argument Handling Code deel uit en vul onderstaande code in (zonder de PHP-tags)

<?php
$args = array();
if (arg(0) == 'node' && is_numeric(arg(1))) {
$node = node_load(arg(1));
foreach($node->field_kader_afbeeldingen as $field) {
// ids is de array met de referenced image id's
$ids[] = $field['nid'];
}
$ids= implode('+', $ids);
}
return array($ids);
?>

Als je andere namen hebt gebruikt zul je 'kader_afbeeldingen' hierboven ook moeten aanpassen.

Wat dit doet is zorgen dat de gerefereerde afbeelding ID's worden gebruikt als node-id filter. Zodoende rollen er dus alleen de afbeeldingen uit, precies wat we willen! Als er geen afbeeldingen zijn wordt de empty text gebruikt waar je zelf invulling aan kan geven.

Wanneer je nu deze view opslaat en door middel van admin -> blocks in sidebar right plaatst zul je ze daar bij de betreffende pagina zien.

Een vergelijkbare uitleg staat ook op deze drupal.org pagina, maar dan voor 1 afbeelding. In mijn comment (#3) vind je ook bovenstaande code.

Wanneer je meer controle wilt uitoefenen op de manier waarop de afbeeldingen getoond worden kun je natuurlijk de betreffende view themen en ik raad je ook te kijken naar deze tutorial waarbij je met een paar extra modulen mooie popups kan maken (thickbox) en thumbs kan maken (imagecache). Sweet!

Grunge stijl webdesign?

Read More »

About

This is the company blog of
Drupal specialist Merge.nl

We are located in Breda (Netherlands) and build websites using Drupal. More about us.

Content on this blog is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Netherlands License.

Creative Commons License

Recent Comments

Social