A B C Gevonden

Ha! Ik heb het kunnen oplossen! Hoe slim ben ik. Het heeft me wel nog heel wat tijd gekost. Maar ik zal het nooit meer vergeten en de volgende site zal dus eens zo snel klaar zijn.

Het hele principe van 'argumenten' in 'views' is dat hetgeen achter de url van de view staat als filter wordt gebruikt. Dus als ik titels wil filteren op de eerste letter en elke letter zijn eigen pagina wil geven maak ik een view aan met url voorbeeld.be/titel. Als ik daar dan b achterzet - voorbeeld.be/titels/b - krijgt ik een lijst met alles titels die met een B beginnen.

Simpel. Maar ik wou de mogelijkheid om zaken te kunnen groeperen. Alle titels die met een cijfer beginnen onder de noemer 0-9. Niet zo simpel.

Views biedt bij de argumenten ook de opties om zelf code toe te voegen. Zo kan je op basis van het argument (de letter B in mijn voorbeeld) zaken late uitvoeren.

Een simpel voorbeeld dat ze in de documentatie meegeven is het volgende:

//Indien geen argument meegegeven defineer dan als A
if (!$args[0]) {
  $args[0] = 'A';
  return $args;
}

Dus ik doe iets gelijkaardig:

if ($args[0] == '0-9') {

  $args[0] = 'all';

  function views_views_query_alter(&$query, $view, $summary, $level) {
    $query->add_where("LEFT(node.title, 1) = '0' OR LEFT(node.title, 1) = '1' OR LEFT(node.title, 1) = '2' OR LEFT(node.title, 1) = '3' OR LEFT(node.title, 1) = '4' OR LEFT(node.title, 1) = '5' OR LEFT(node.title, 1) = '6' OR LEFT(node.title, 1) = '7' OR LEFT(node.title, 1) = '8' OR LEFT(node.title, 1) = '9'");
  }

  return $args;

}

Die if statement zorgt er voor dat de code uitgevoerd wordt als ik op de paginda voorbeeld.be/titels/0-9 zit. Eerst en voorals is het belangrijk om in je argument een wildcard te definiëren. Ik gebruik 'all'

Door mijn argument te veranderen van '0-9' naar 'all' ($args[0] = 'all';) zorg ik er voor dat alle titels getoond worden, ook die zonder een cijfer als eerste teken. Dit heeft als voordeel dat er in de query die naar de database gaat geen beperkingen worden meegegeven.

Dankzij de functie function views_views_query_alter() kan ik, nog voor de resultaten opgehaald worden de query aanpassen.

Normaal zal je bij $query->add_where() eerst bepalen waar je in de query zaken wil toevoegen - hoewel ik hier niet zeker van ben, ik heb er geen documentatie over gevonden enkel de probeersels van anderen. Alleszins, door dit niet te doen worden de argumenten op het einde met een AND toegevoegd.

De LEFT(node.title, 1) = '0' zegt aan de database dat er moet gefilterd worden op de titel, te beginnen van links op het eerste teken. Deze moet gelijk zijn aan '0'. Het is belangrijk dat je alles in de zelfde beurt doorgeeft zodat je er zelf die OR kan tussen zetten. Zoniet dan wordt alles met AND toegevoegd. En een titel dat zowel met een 1 als een 2 start bestaat niet.

Het heeft lang geduurd eer ik de code hierboven had gevonden. Waarschijnlijk kan het allemaal gemakkelijker. Een slimmerik maakt er misschien een array van en gebruikt een loop, zeker als er meer waardes moeten gedefinieerd worden. Maar dit werkt voor mij.

6 december 2007

drupal, views, Web

back to top