在Drupal 7中为视图添加自定义过滤器

时间:2011-09-08 09:50:47

标签: php drupal views drupal-7 drupal-views

我正在使用Drupal 7,我想在视图中添加一个新的过滤器。

我有两个字段的“点击”自定义表格; nid和clicks_left。

过滤器应该只包含一个复选框“仅显示剩余点击的节点”。所以过滤器应该加入节点并点击nid ..

我已阅读了数千页的自定义过滤器,但无法使其工作=)

拜托,有人能告诉我一个工作实例,所以我明白了吗?

我到目前为止,过滤器显示在过滤器下但是我需要添加什么来进行连接并获取复选框?以下相关代码:

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 {

    ???

};

我知道这两个功能都是错误的;)

2 个答案:

答案 0 :(得分:5)

好的,我找到了解决方案。对于任何需要它的人:

在clicks.module

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

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

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

}

这使我有可能添加过滤器“点击次数”,如果启用则会隐藏所有没有点击的结果(clicks_left&gt; 0)

答案 1 :(得分:0)

实际上,如果您的表格中的值是数字的,您不需要创建自己的处理程序,您可以使用Views views_handler_filter_numeric中的默认值。

您可以查看视图handlers中已存在的所有处理程序。