2011-09-08 22 views
6

im usando Drupal 7 y deseo agregar un nuevo filtro en las vistas.Agregar un filtro personalizado a las vistas en Drupal 7

Tengo una tabla personalizada "clics" con dos campos; nid y clicks_left.

El filtro solo debe contener una casilla de verificación "Solo mostrar los nodos con clics a la izquierda". Por lo que el filtro debe unirse a nodo y hace clic en nid ..

He leído como miles de páginas de filtros personalizados, pero no puedo conseguir que funcione =)

Por favor, alguien me podría mostrar un ejemplo de trabajo por lo ¿Entiendo?

He llegado tan lejos que el filtro se muestra bajo filtros, pero ¿qué necesito agregar para hacer la unión y obtener la casilla de verificación? El código correspondiente a continuación:

ARCHIVO clicks_views.inc:

function clicks_views_data() { 
    $data = array(); 

    $data['clicks']['clicks_filter'] = array(
    'group' => t('Clicks'), 
    'title' => t('Clicks left'), 
    'help' => t('Filter any Views based on clicks left'), 
    'filter' => array(
    'field' => 'clicks_left', 
     'handler' => 'clicks_handler_filter', 
    ), 
); 

return $data; 
} 

ARCHIVO clicks_handler_filter.inc:

<?php 
    class clicks_handler_filter extends views_handler_filter { 

    ??? 

}; 

sé ambas funciones están equivocados;)

+0

Encontré una solución aquí: http://oliverhuynh.wordpress.com/2011/06/23/custom-views-handler-drupal-7-template/ – tomasbedrich

Respuesta

0

En realidad, si sus valores en sus tablas, los clics son numéricos, no es necesario crear su propio controlador, puede usar el valor predeterminado desde Vistas views_handler_filter_numeric.

Puede ver todos los controladores que ya existen en las Vistas handlers.

+0

Yvan, vale ... pero ¿dónde/cómo agrego? mi casilla de verificación? Cuando uso el filtro ahora, no aparece nada ... ¿Y cómo hago la unión? – Per

5

Ok, he encontrado una solución. Para cualquier persona que lo necesite:

En clicks.module

function clicks_views_api() { 
    return array(
    'api' => 2, 
    'path' => drupal_get_path('module', 'clicks') . '/includes' 
); 
} 

En clicks.views.inc

function clicks_views_handlers() { 
    return array(
    'info' => array(
     'path' => drupal_get_path('module', 'clicks') . '/includes', // path to view files 
    ), 
    'handlers' => array(
     // register our custom filter, with the class/file name and parent class 
     'clicks_handler_filter' => array(
     'parent' => 'views_handler_filter', 
    ) 
    ), 
); 
} 

function clicks_views_data() { 
    $data = array(); 

    if(module_exists('clicks')) { 
    $data['node']['clicks'] = array(
     'group' => t('Clicks'), 
     'title' => t('Clicks left'), 
     'help' => t('Filter any Views based on clicks left'), 
     'filter' => array(
     'handler' => 'clicks_handler_filter', 
    ), 
    ); 
    } 
    return $data; 
} 

En clicks_handler_filter.inc

class clicks_handler_filter extends views_handler_filter { 

    function admin_summary() { } 
    function operator_form() { } 
    function query() { 
    $table = $this->ensure_my_table(); 
    $join = new views_join(); 
    $join->construct('clicks', $this->table_alias, 'nid', 'nid'); 
    $this->query->ensure_table('clicks', $this->relationship, $join); 
    $this->query->add_where($this->options['group'], "clicks.clicks_left", 0, ">"); 
} 

} 

Esto me da una posibilidad para agregar un filtro de "clics" que, si está habilitado, oculta todos los resultados que no tienen clics a la izquierda (clicks_left> 0)

Cuestiones relacionadas