Date là một module rất tốt để bổ sung các field date/date time cho các kiểu dữ liệu. Tuy nhiên, các field này lại không hỗ trợ views-filter, cho nên chúng ta không thể sử dụng views để lọc bớt nội dung dựa trên các field này. Để thực hiện điều này, chúng ta cần phải viết module bổ sung.

Chúng ta đi xây dựng date_custom, để thêm filter cho các date field. Đầu tiên, hãy định nghĩa file info:

name = Date custom version = 6.x-1.x-alpha-1 description = Add views-filter to date-fields denpendencies = views denpendencies = date core = 6.x

Giờ là date_custom.module, chúng ta cần cho views biết module của chúng ta có tích hợp views, bằng cách implements hook_views_api():

1 /**
2  * Implements hook_views_api().
3  */
4 function date_custom_views_api() {
5   return array(
6     'api' => 2,
7   );
8 }

Định nghĩa xong hàm trên, views sẽ nhận biết được module của chúng ta có tích hợp views, views sẽ tự động load file date_custom.views.inc để gọi các hook mà views hỗ trợ. Ở file date_custom.views.inc, chúng ta cần định nghĩa hook_views_data_alter(&$data) để alter lên các views-data của các date-field

 1 /**
 2  * Implements hook_views_data_alter().
 3  */
 4 function date_custom_views_data_alter(&$data) {
 5   // Loop to all content-fields
 6   foreach (content_fields() as $field) {
 7     // We only want to alter to date-fields
 8     if ($field['module'] === 'date') {
 9       $column_name = "{$field['field_name']}_value";
10       $field_data = &$data["node_data_{$field['field_name']}"][$column_name];
11 
12       // Add basic date filter for date-field.
13       $field_data['filter']['handler'] = 'date_custom_handler_filter_date';
14     }
15   }
16 }

Ở trên, chúng ta đã xác định handler cho filter này là class date_custom_handler_filter_date. Chúng ta cần implement date_custom_views_handlers() để cung cấp các thông tin liên quan đến clas này.

 1 /**
 2  * Implements hook_views_handlers().
 3  */
 4 function date_custom_views_handlers() {
 5   return array(
 6     'handlers' => array(
 7       'date_custom_handler_filter_date' => array(
 8         'parent' => 'views_handler_filter_date',
 9         'file'   => 'date_custom_views_field_handlers.inc',
10       ),
11     )
12   );
13 }

Chúng ta phải định nghĩa class ở một file khác, vì class thừa kế class views_handler_filter_date và class views_handler_filter_date không được định nghĩa theo mặc định.

Nội dung của file date_custom_views_field_handlers.inc có nội dung:

 1 class date_custom_handler_filter_date extends views_handler_filter_date {
 2   function op_simple($field) {
 3     $stamp = strtotime($this->value['value']);
 4     $value = date('Y-m-d', $stamp);
 5     
 6     $this->query->add_where(
 7       $this->options['group'], 
 8       "$field $this->operator '%s'",
 9       $value
10     );
11   }
12 }

Nếu không có gì trở ngại, chúng ta sẽ có filter như sau:

Thế Hồng



blog comments powered by Disqus

Published

06 March 2010

Tags