【问题标题】:Adding a custom filter to views in Drupal 7在 Drupal 7 中向视图添加自定义过滤器
【发布时间】:2011-11-12 20:29:23
【问题描述】:

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

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

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

我已经阅读了数千页的自定义过滤器,但无法让它发挥作用 =)

请,有人可以给我看一个工作示例以便我理解吗?

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

文件 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;
}

文件 clicks_handler_filter.inc:

<?php
  class clicks_handler_filter extends views_handler_filter {

    ???

};

我知道这两个函数都错了;)

【问题讨论】:

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


【解决方案1】:

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

在 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 > 0)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • Yvan,好的.. 但是我在哪里/如何添加我的复选框?当我现在使用过滤器时,什么都没有弹出。我如何进行连接?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多