Skip to content

Instantly share code, notes, and snippets.

@juampynr
Last active June 9, 2023 21:53
Show Gist options
  • Star 85 You must be signed in to star a gist
  • Fork 20 You must be signed in to fork a gist
  • Save juampynr/5816530 to your computer and use it in GitHub Desktop.
Save juampynr/5816530 to your computer and use it in GitHub Desktop.
Drupal 7 Views 3 custom field handler
dependencies[] = ctools
; Views Handlers
files[] = views/mymodule_handler_handlername.inc
<?php
/**
* Implements hook_views_api().
*/
function mymodule_views_api() {
return array(
'api' => 3,
'path' => drupal_get_path('module', 'mymodule') . '/views',
);
}
<?php
// This file must be at mymodule/views directory.
/**
* @file
* Views definitions for mymodule module.
*/
/**
* Implements hook_views_data_alter().
*/
function mymodule_views_data_alter(&$data) {
$data['node']['handlername'] = array(
'title' => t('Name of my handler'),
'help' => t('Description of my handler.'),
'field' => array(
'handler' => 'mymodule_handler_handlername',
),
);
}
<?php
// This file must be at mymodule/views directory.
/**
* @file
* Definition of mymodule_handler_handlername.
*/
/**
* Description of what my handler does.
*/
class mymodule_handler_handlername extends views_handler_field {
/**
* Add some required fields needed on render().
*/
function construct() {
parent::construct();
$this->additional_fields['field_something'] = array(
'table' => 'field_data_field_something',
'field' => 'field_something_value',
);
}
/**
* Loads additional fields.
*/
function query() {
$this->ensure_my_table();
$this->add_additional_fields();
}
/**
* Default options form.
*/
function option_definition() {
$options = parent::option_definition();
$options['option_a'] = array('default' => '');
$options['option_b'] = array('default' => '');
return $options;
}
/**
* Creates the form item for the options added.
*/
function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
$form['option_a'] = array(
'#type' => 'textfield',
'#title' => t('Label'),
'#default_value' => $this->options['option_a'],
'#description' => t('Some description.'),
'#weight' => -10,
);
$form['option_b'] = array(
'#type' => 'textfield',
'#title' => t('Label'),
'#default_value' => $this->options['option_b'],
'#description' => t('Some description.'),
'#weight' => -9,
);
}
/**
* Renders the field handler.
*/
function render($values) {
// This ensures that even if Views changes the field name within the query, the handler will still work.
// Inspect the $this->aliases array to find the key of the field that you need.
$value = $this->get_value($values, 'field_something');
return format_string('<div class="@option_a" data-tag="@field_something" data-follow_name="@option_b"></div>', array(
'@field_something' => $value,
'@option_a' => $this->options['option_a'],
'@option_b' => $this->options['option_b'],
));
}
}
@juampynr
Copy link
Author

Good point @robme. Updated to use hook_views_data_alter().

@juampynr
Copy link
Author

Added https://gist.github.com/juampynr/27df316e7dab89f02a6d18bbff252bc2 to show a sample Views filter handler in Drupal 7.

@isholgueras
Copy link

Thanks for this example. Very clear

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment