Custom opties in onze views exposed filters

Posted by: 
Dominique De Cooman

We doen dit zoals gebruikelijk aan de hand van een voorbeeld.

We hebben een tabel met boek entries die een top 100 vormen die elke week geupdate worden. Elke entry heeft een huidige positie, een afgelopen week positie, een corresponderend node id en een week.
We zullen een bestand creëren genaamd book_top100.views.inc, in dit bestand zullen we hook_views_data() en een hook_views_handlers() implementeren.

De hook_views_data() zal onze custom tabel zichtbaar maken voor views en laten aansluiten bij de node tabel.

<?php
/**
 * Implementation of hook_views_data()
 */
function boek_top100_views_data() {
  
$data['boek_top100']['table']['group'] = t('Top 100');
  
  
$data['boek_top100']['table']['base'] = array(
    
'field' => 'nid',
    
'title' => t('Top 100 nodes'),
    
'help' => t('Holds book Top 100'),
  );
  
$data['boek_top100']['table']['join']['node'] = array(
    
'left_table' => 'node',
    
'left_field' => 'nid',
    
'field' => 'nid'
  );
  
$data['boek_top100']['vorige_week'] = array (
    
'title' => t('Last week postion'),
    
'help' => t('Last week postion'),
    
'field' => array(
      
'handler' => 'views_handler_field_numeric',
    ),
    
'filter' => array(
      
'handler' => 'views_handler_filter_numeric',
    ),
    
'sort' => array(
      
'handler' => 'views_handler_sort',
    ),
  );
  
$data['boek_top100']['positie'] = array (
    
'title' => t('The current position'),
    
'help' => t('The current position'),
    
'field' => array(
      
'handler' => 'views_handler_field_numeric',
    ),
    
'filter' => array(
      
'handler' => 'views_handler_filter_numeric',
    ),
    
'sort' => array(
      
'handler' => 'views_handler_sort',
    ),
  );
  
$data['boek_top100']['week'] = array(
    
'title' => t('The current week'),
    
'help' => t('The current week'),
    
'field' => array(
      
'handler' => 'views_handler_field',
    ),
    
'filter' => array(
      
'handler' => 'boek_top100_views_handler_filter_many_to_one',
    ),
    
'sort' => array(
      
'handler' => 'views_handler_sort',
    ),
  );
    
  return 
$data;
  
}
?>

Nog steeds in hetzelfde bestand. De hook_views handlers zullen views onze custom handler laten zien. We bereiden de views_handler_filter_many_to_one filter uit door views te zeggen waar het de data vandaan moet halen om in de exposed filter te plaatsen. Ons doel is om onze nodes te filteren op een bepaald aantal weken top 100.

<?php
/**
 * Implementation of hook views_handlers()
 */
function boek_top100_views_handlers() {
  return array(
    
'info' => array(
      
'path' => drupal_get_path('module''boek_top100') . '/inc',
    ),
    
'handlers' => array(
      
'boek_top100_views_handler_filter_many_to_one' => array(
        
'parent' => 'views_handler_filter_many_to_one',
      ),      
    ),
  );
}
?>

In het volgende bestand dat zich in /inc/boek_top100_views_handler_filter_many_to_one.inc bevindt, doen we de klassieke override om onze custom data te verkrijgen. Het enige wat we doen is het te zeggen welke callback to call voor custom data.

<?php
class boek_top100_views_handler_filter_many_to_one extends views_handler_filter_many_to_one {
  function 
get_value_options() {
    if (isset(
$this->value_options)) {
      return;
    }
    
    
$this->value_options boek_top100_get_week_options();       
  }
}
?>

In ons module bestand plaatsen we welke api versie we gebruiken en de callback boek_top100_get_week_options() dat we in onze handler file definiëren om onze custom opties te verkrijgen.

<?php
/**
 * implementation of hook_views_api()
 */
function boek_top100_views_api() {
   return array(
    
'api' => 2.0,
  );
}

/**
 * Get the options for the top100 views exposed filter
 */
function boek_top100_get_week_options() {
  
$result db_query("SELECT DISTINCT week FROM {boek_top100}");
    
  while (
$row db_fetch_object($result)) {
    
$options[$row->week] = $row->week;
  }
  return 
$options;
}
?>

Wanneer we nu een view of type node creëren en we ordenen de nodes van type book, dan zijn we in staat om op de huidige positie te sorteren en is het mogelijk om te filteren welke top100 van welke week u wilt zien door de week filter toe te voegen en zichtbaar te maken in de views admin interface.

Reactie toevoegen