9.14. Pisanje integracije sa Views
Views modul je široko korišćen u Drupal ekosistemu. Liste sadržaja, tabele, blokovi, slajd-šou, izvoz podataka – ovi delovi sadržaja obično se prikazuju pomoću Views. Ako koristite Content types, Block types ili druge tipove entiteta, Views je već automatski integrisan sa njima i možete koristiti Views za prikaz vašeg sadržaja. Međutim, za vaš prilagođeni modul koji koristi posebnu prilagođenu bazu podataka, kreiranu pomoću hook_schema(), treba da napišete integraciju sa Views da biste prikazali podatke vašeg modula u Views UI.
Hajde da pogledamo integraciju za modul Did this help sa Views:
https://www.drupal.org/project/did_this_help
Modul kreira sopstvenu bazu podataka za čuvanje podataka. U ovoj tabeli su stringovi, ID-jevi, datumi, pa treba definisati različite handler-e za integraciju sa Views:
Na početku je potrebno dodati fajl MODULENAME.views.inc koji se automatski učitava, pa nije potrebno nigde posebno navoditi njegovu lokaciju. U fajlu *.views.inc treba implementirati hook_views_data():
<?php
/**
* @file
* Pruža podatke za views za modul did_this_help.
*/
/**
* Implementacija hook_views_data().
*/
function did_this_help_views_data() {
}
Ova implementacija treba da vrati niz koji opisuje strukturu vaše prilagođene baze podataka modula.
Počnite sa imenom tabele baze podataka kao prvim ključem niza:
$data['did_this_help'] = [
'table' => [
'group' => t('Did this help?'),
'base' => [
'field' => 'id',
'title' => t('Did this help? entries'),
'help' => t('Sadrži listu Did this help? zapisa.'),
],
],
];
Ovo je opis tabele sa imenom u ključu niza $data['did_this_help']. Ako treba da integrišete više tabela, dodajte različite ključeve u $data nizu: $data['did_this_help1'], $data['did_this_help2'].
Dalje u opisu niza sledi:
group - omogućava grupisanje polja u isti deo u Views UI radi lakšeg odabira polja.
base - pokazuje serijski ID tabele koji će se kasnije koristiti za povezivanje tabela preko spoljnih ključeva.
Zatim opisujemo svako polje koje želimo da prikažemo u Views:
$data['did_this_help']['id']= [
'real field' => 'id',
'title' => t('Did this help? record ID'),
'help' => t('Zapis iz Did this help? modula.'),
'field' => [
'id' => 'standard',
],
'sort' => [
'id' => 'standard',
],
'filter' => [
'id' => 'numeric',
],
'argument' => [
'id' => 'numeric',
],
];
real field - definiše stvarno ime kolone u bazi ako koristite alias-e u ključevima niza. Za jedno Drupal polje realna polja mogu imati različite vrednosti, na primer Link polje ima dve vrednosti: Title i URI. Svaka odgovara svojoj koloni u bazi. Imena kolona se sastoje od imena polja i imena svojstva (title, uri):
Imena ovih kolona su automatski kreirana od strane Link modula, ali za prilagođene module "real field" treba definisati sami u hook_views_data().
title, help - informacije za Views UI.
Slede Handler ID-jevi za: field, sort, filter, argument. Handler definiše način filtriranja i prikaza polja, na primer datumi se prikazuju sa Date Format-om i filtriraju pomoću Date Calendar Popup-a. Brojevi imaju filtere sa operatorima >, < i =, za stringove filter po dužini stringa.
Handleri za polja
Handleri za polja pomažu da se generiše deo SQL upita posle SELECT.
Listu field handlera iz Drupal core možete pronaći ovde:
Za prilagođene module često ćete koristiti standard handler za brojeve i stringove, a za datumske podatke date handler.
Na primer, polje ID koristi standard
handler:
'id' => [
'real field' => 'id',
'title' => t('Did this help? record ID'),
'help' => t('Did this help? record.'),
'field' => [
'id' => 'standard',
],
'sort' => [
'id' => 'standard',
],
'filter' => [
'id' => 'numeric',
],
'argument' => [
'id' => 'numeric',
],
],
Handleri za sortiranje
Handleri za sortiranje omogućavaju uobičajeno i izloženo sortiranje u Views. Definišu deo SQL upita posle ORDER BY.
Listu sort handlera možete pronaći ovde:
Handleri za filtere
Handleri za filtere omogućavaju prikaz običnih, izloženih i kontekstualnih filtera u Views. Definišu deo SQL upita posle WHERE.
Listu filter handlera možete pronaći ovde:
Za filtriranje datuma sa Date Calendar popup-om možete koristiti handler "date":
$data['did_this_help']['created'] = [
'title' => t('Datum kreiranja zapisa'),
'help' => t('Datum kreiranja zapisa Did this help? modula'),
'field' => [
'id' => 'date',
],
'argument' => [
'id' => 'date',
],
'filter' => [
'id' => 'date',
],
'sort' => [
'id' => 'date',
],
];
Handler za relacije (Relationship)
Handler za relacije omogućavaju dodavanje JOIN-ova u SQL upit i izvlačenje podataka iz više tabela u jednom upitu.
Baza modula Did this help? ima kolonu sa korisničkim ID-jevima. Korišćenjem relationship handler-a možete dodati vezu u Views UI između redova iz did_this_help i korisnika i prikazati podatke iz više tabela:
$data['did_this_help']['uid'] = [
'title' => t('Korisnički ID za Did this help? zapis'),
'help' => t('Korisnički ID za Did this help? zapis'),
'field' => [
'id' => 'standard',
],
'sort' => [
'id' => 'standard',
],
'filter' => [
'id' => 'numeric',
],
'argument' => [
'id' => 'numeric',
],
'relationship' => [
'title' => t('Korisnik'),
'help' => t('Korisnik kome pripada zapis.'),
'base' => 'users_field_data',
'base field' => 'uid',
'id' => 'standard',
],
];
Ovde za polje dodajemo relationship gde navodimo:
- base - tabela na koju želimo da se pridružimo (join),
- base field - polje po kojem se vrši pridruživanje,
- title i help - za Views UI,
- id - tip relationship handler-a.
Listu relationship handler-a možete videti ovde:
Iako Views pruža širok spektar različitih handler-a, možete nasleđivati osnovnu klasu handler-a i pisati svoje prilagođene handler-e za polja, filtere i sortiranje. U narednom članku pisaćemo prilagođeni handler za Views filter.