Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Drupal 7:在发布日期公开过滤器_Drupal_Drupal Views_Drupal Exposed Filter - Fatal编程技术网

Drupal 7:在发布日期公开过滤器

Drupal 7:在发布日期公开过滤器,drupal,drupal-views,drupal-exposed-filter,Drupal,Drupal Views,Drupal Exposed Filter,我在一个网站上有几百篇文章。我用一个视图在一个页面上显示摘录和链接,我还有一个寻呼机,可以同时显示10篇文章。我需要添加一个带有年份[…,20082009…,2013]的下拉列表。如果您在下拉列表中选择一年,则视图应仅显示该年发布的文章。例如,如果在2013年添加了新文章,则下拉列表中的年份应自动更新,因此第一年是第一次发布的年份 请建议可能的解决方案。我认为,您需要将公开过滤器设置到视图列表中。配置应该类似于- 过滤条件:日期节点 表单元素:选择 过滤粒度:年 日期字段:发布日期;揭露 要暴露

我在一个网站上有几百篇文章。我用一个视图在一个页面上显示摘录和链接,我还有一个寻呼机,可以同时显示10篇文章。我需要添加一个带有年份[…,20082009…,2013]的下拉列表。如果您在下拉列表中选择一年,则视图应仅显示该年发布的文章。例如,如果在2013年添加了新文章,则下拉列表中的年份应自动更新,因此第一年是第一次发布的年份


请建议可能的解决方案。

我认为,您需要将公开过滤器设置到视图列表中。配置应该类似于-

过滤条件:日期节点

表单元素:选择

过滤粒度:年

日期字段:发布日期;揭露

要暴露的过滤器类型:单个

运算符:等于


如果有效,请通知我。

我认为,您需要在视图列表中设置公开过滤器。配置应该类似于-

过滤条件:日期节点

表单元素:选择

过滤粒度:年

日期字段:发布日期;揭露

要暴露的过滤器类型:单个

运算符:等于


如果您想为节点使用Drupal内置的Authored on字段,请通知我它是否有效。

这里有一种方法。您需要创建一个自定义模块。这是在Drupal 7/Views 3中创建的。我的模块文件位于/sites/all/modules/custom/ViewsYearFilter/中

ViewsYearFilter.info

ViewsYearFilter.module

ViewsYearFilter.views.inc

ViewsYearFilter.inc

然后,在视图配置页面中,您可以创建一个新的公开过滤器:

对不起,我不能发布这张图片,因为我没有足够的声誉。在创建和激活新模块后,将有一个名为Content:Year的新公开过滤器,您可以添加到视图中


PS:我的代码基于Shevchuk的答案。

如果您想为节点使用Drupal内置的Authored on字段,这里有一种方法。您需要创建一个自定义模块。这是在Drupal 7/Views 3中创建的。我的模块文件位于/sites/all/modules/custom/ViewsYearFilter/中

ViewsYearFilter.info

ViewsYearFilter.module

ViewsYearFilter.views.inc

ViewsYearFilter.inc

然后,在视图配置页面中,您可以创建一个新的公开过滤器:

对不起,我不能发布这张图片,因为我没有足够的声誉。在创建和激活新模块后,将有一个名为Content:Year的新公开过滤器,您可以添加到视图中


PS:我的代码是根据舍甫丘克的答案编写的。

我安装了日期模块,然后基本上按照您的评论进行操作,它可以正常工作。谢谢你,你需要安装date_视图来运行我安装的date模块,然后基本上按照你的评论进行操作,它就可以工作了。谢谢您您需要安装日期视图才能工作
name = Views Year Filter
description = Allow a view to filter by post year.
package = tools
core = 7.x

files[] = ViewsYearFilter.inc
files[] = ViewsYearFilter.views.inc
<?php

/**
 * Implements of hook_views_api().
 */
function ViewsYearFilter_views_api() {
  return array('api' => 3);
}
<?php

/**
 * Implements of hook_views_data().
 */
function ViewsYearFilter_views_data() {
  return array(
    'node' => array(
      'published_year' => array(
        'group' => t('Content'),
        'title' => t('Year'),
        'help' => t('Filter by years.'),
        'filter' => array('handler' => 'ViewsYearFilter'),
      )
    )
  );
}
<?php

/* Allows filtering of posts by year in a Drupal View. */

class ViewsYearFilter extends views_handler_filter_in_operator {

  /**
   * Override parent get_value_options() function. This function returns an array of all valid years from our post type.
   * @return
   *   Return the stored values in $this->value_options if someone expects it.
   */
  function get_value_options() {

    $query = new EntityFieldQuery();
    $query->entityCondition('entity_type', 'node')
    ->propertyCondition('type', 'blog_post') //post type
    ->propertyCondition('status', '1'); //is published

    $results = $query->execute();

    $object_node_ids = array_keys($results['node']);
    $objects = node_load_multiple($object_node_ids);

    foreach ($objects as $blog_post) {
      $values[date('Y', $blog_post->created)] = date('Y', $blog_post->created);
    }

    $this->value_options = $values;
    return $values; //array of year values
  }

  function query() {
    $this->ensure_my_table(); //not sure why/if this is necessary
    $startDate = mktime(0, 0, 0, 1, 1, intval($this->value[0]));
    $endDate = mktime(0, 0, 0, 1, 1, intval($this->value[0] + 1));
    $this->query->add_where_expression($this->options['group'], "node.created >= " . $startDate . " AND node.created <= " . $endDate); //filtering query
  }

}