A project that I’m currently working on requires a classifieds system which is fairly straight forward to setup. I’m using the location module for users to specify a location of the classified. To make the search easy I created a simple views page with exposed filters, but I wanted to have a select field with only Australian states.
Out of the box the location module only gives you an exposed autocomplete field for the state/province. This is what I was trying to achieve.
From this:
To this:
The only way I could do this is with a custom filter.
First we have to let views know about your module.
// in locationstate.module
function locationstate_views_api()
{
return array(
'api' => 2,
'path' => drupal_get_path('module', 'locationstate') . '/inc',
);
}
To keep the locationstate module directory tidy we’ll place all views file in the /inc folder.
Create a file called locationstate.views.inc in the /inc directory and add thehook_views_data function.
//In locationstate.views.inc
function locationstate_views_data() {
$data = array();
if(module_exists('location')) {
$data['location']['state_au'] = array(
'title' => t('States AU'),
'help' => t('Filter by AU states.'),
'real field' => 'province',
'group' => t('Location state'),
'filter' => array(
'handler' => 'locationstate_handler_filter_state',
),
);
}
return $data;
}
Next we’ll have to register the locationstate_handler_filter_state filter so views is aware of it.
You can do this by using the hook_views_handlers function.
//In locationstate.views.inc
function locationstate_views_handlers() {
return array(
'info' => array(
'path' => drupal_get_path('module', 'locationstate') . '/inc',
),
'handlers' => array(
// The name of my handler
'locationstate_handler_filter_state' => array(
// The name of the handler we are extending.
'parent' => 'views_handler_filter_string',
),
),
);
}
Finally we’ll have to create the actual filter file. Because the filter is calledlocationstate_handler_filter_state, views will search for locationstate_handler_filter_state.inc with in the /inc directory.
Create a file called locationstate_handler_filter_state.inc and paste the following.
class locationstate_handler_filter_state extends views_handler_filter_string {
/**
* Shortcut to display the exposed options form.
*/
function value_form(&$form, &$form_state) {
$form['value'] = array(
'#type' => 'select',
'#title' => t('State'),
'#options' => array(
'ACT' => t('ACT'),
'NSW' => t('NSW'),
'NT' => t('NT'),
'QLD' => t('QLD'),
'SA' => t('SA'),
'TAS' => t('TAS'),
'VIC' => t('VIC'),
'WA' => t('WA'),
),
);
return $form;
}
}
}
There you have it, now you should have a custom views filter. Also check outhttp://thereisamoduleforthat.com/content/fun-views-and-location for more info. I have also attached the module to this post so you guys can download it.
UPDATE: Check this tutorial on creating a filter with SQL joins. Drupal: How to create Views 2 filters for your new module
Get in touch and tell me about the role or what you're building.