2013-03-05 5 views
1

У меня есть несколько сотен статей на веб-сайте. Я использую представление, чтобы показать выдержки и ссылки на них на одной странице, и у меня также есть пейджер, который показывает 10 статей в то время. Мне нужно добавить выпадающий список с годами [..., 2008,2009 ..., 2013]. Если вы выберите год в раскрывающемся списке, то в представлении должны отображаться только те статьи, которые были опубликованы в этом году. Годы в раскрывающемся списке должны обновляться автоматически, если новая статья добавлена ​​в 2013 году, например, и, таким образом, первый год является годом первой публикации.Drupal 7: Открытый фильтр на дату публикации

Пожалуйста, предложите возможные решения.

ответ

9

Думаю, вам нужно установить фильтр в список просмотра. Конфигурация должна быть примерно такой:

Критерии фильтра: Дата (узел);

Элемент формы: Выберите;

Степень фильтрации: Год;

Поля даты: Дата публикации; Expose;

Тип фильтра для обнародования: Одиночный;

Оператор: равен;

Сообщите мне, если он работает ..

+0

Я установил модуль Date, а затем в основном выполнил ваши комментарии, и он работает. Спасибо –

+1

Для этого вам необходимо установить date_views – anthonygore

1

Вот способ сделать это, если вы хотите использовать Drupal встроенный в «автором на» поле для узла. Вам нужно создать собственный модуль. Это было создано в Drupal 7/Views 3. Мои файлы модулей находятся в/sites/all/modules/custom/ViewsYearFilter /.

ViewsYearFilter.info

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 

ViewsYearFilter.module

<?php 

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

ViewsYearFilter.views.inc

<?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'), 
    ) 
    ) 
); 
} 

ViewsYearFilter.inc

<?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 
    } 

} 

Тогда в вашей конфигурации странице просмотра вы можете создать новую открытую фильтр:

Извините, но я не могу на самом деле отправить это изображение, у меня нет достаточно репутации. Появится новый открытый фильтр с названием «Содержание: год», который вы можете добавить к своему представлению после создания и активации вашего нового модуля.

PS: Я основывал свой код на ответе Шевчука на this question.

Смежные вопросы