2011-09-08 10 views
6

im utilizzando Drupal 7 e voglio aggiungere un nuovo filtro nelle viste.Aggiunta di un filtro personalizzato alle viste in Drupal 7

Ho una tabella personalizzata "clic" con due campi; nid e clicks_left.

Il filtro deve contenere solo una casella di controllo "Mostra solo nodi con clic a sinistra". Quindi il filtro dovrebbe unirsi nodo e fa clic sul nid ..

Ho letto come migliaia di pagine di filtri personalizzati, ma non riesco a farlo funzionare =)

prega, qualcuno potrebbe mostrare un esempio di lavoro in modo da Capisco?

Sono arrivato così lontano che il filtro viene visualizzato sotto i filtri ma cosa devo aggiungere per fare il join e ottenere la casella di controllo? Il codice specifico in basso:

FILE 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; 
} 

FILE clicks_handler_filter.inc:

<?php 
    class clicks_handler_filter extends views_handler_filter { 

    ??? 

}; 

so entrambe le funzioni sono sbagliate;)

+0

Ho trovato una soluzione qui: http://oliverhuynh.wordpress.com/2011/06/23/custom-views-handler-drupal-7-template/ – tomasbedrich

risposta

0

In realtà, se i vostri valori nelle tue tabelle i clic sono numerici, non è necessario creare il proprio gestore, è possibile utilizzare l'impostazione predefinita da Visualizzazioni views_handler_filter_numeric.

È possibile visualizzare tutti i gestori già esistenti nelle Visualizzazioni handlers.

+0

Yvan, ok .. ma dove/come aggiungo la mia casella di controllo? Quando utilizzo il filtro ora, non compare nulla .. E come faccio a partecipare? – Per

5

Ok, ho trovato una soluzione. Per chi ne ha bisogno:

In clicks.module

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

In 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; 
} 

In 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, ">"); 
} 

} 

Questo mi dà una possibilità aggiungere un filtro "clic" che se abilitato nasconde tutti i risultati a cui non sono rimasti clic (click_left> 0)