I had to create a view where I could filter by title, but I wanted to be able to select from the list of all nodes available to achieve something similar to the following screenshot:
I did it creating a new filter for views. In a custom module I started by declaring the new filter in the module file:
function pcp_custom_views_data() {
// Adds our field in the "Filters" section of Views
$data['node']['nid2']['filter'] = array(
'title' => t('Autocomplete nid'),
'help' => t('Autocomplete nid'),
'real field' => 'nid',
'handler' => 'pcp_custom_special_data_filter_view',
);
return $data;
}
Then pcp_custom_special_data_filter_view.inc I created the filter:
class pcp_custom_special_data_filter_view extends views_handler_filter_many_to_one
{
/**
* Shortcut to display the exposed options form.
*/
function value_form(&$form, &$form_state) {
$efq = new EntityFieldQuery();
$efq->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'snippet')
->fieldCondition('field_snippet_type', 'tid', $this->view->filter['tid']->options['value'], '=');
$results = $efq->execute();
$entities = entity_load('node', array_keys($results['node']));
if (!empty($entities)) {
foreach ($entities as $entity) {
$options[$entity->nid] = $entity->title;
}
}
$form['value']['#type'] = 'select';
$form['value']['#multiple'] = TRUE;
$form['value']['#options'] = !empty($options) ? $options : array();
$form['value']['#size'] = 5;
}
/**
* Change the query.
*/
function query() {
$this->ensure_my_table();
$args = array_values($this->value);
$this->query->add_where_expression($this->options['group'], "$this->table.$this->real_field IN (:placeholder) ", array(':placeholder' => $args),
$args);
}
}
The filter will be automatically populated with all nodes of the type node.