Lọc giữa ngày đầu tiên và ngày cuối cùng của tháng hiện tại trong bất kỳ năm nào


7

Tôi có một trường ngày trong chế độ xem của mình và khi tôi cố gắng lọc giữa ngày đầu tiên và ngày cuối cùng của tháng thì không có kết quả nào trong chế độ xem trước chế độ xem của tôi.

Đây là cài đặt của tôi. Bộ lọc này là vì tôi cần so sánh ngày sinh từ tất cả người dùng đã đăng ký và chỉ in những người có giá trị giữa ngày đầu tiên và ngày cuối cùng của tháng.

Dưới đây là các ảnh chụp màn hình cài đặt chế độ xem của tôi:

Đầu tiên ở đây là cài đặt trường ngày của tôi:

nhập mô tả hình ảnh ở đây

Sau đó, cài đặt bộ lọc:

nhập mô tả hình ảnh ở đây

Và cuối cùng đặt tùy chọn bộ lọc để nhận kết quả giữa ngày đầu tiên và ngày cuối cùng của tháng:

nhập mô tả hình ảnh ở đây

Đây là những gì tôi đã cố gắng cho đến bây giờ mà không thành công. Ai đó có thể giúp tôi trong việc này? Tôi không muốn sử dụng một mô-đun cho việc này. Tôi chỉ cần bộ lọc này hoạt động.


1
Hãy thử "ngày đầu tiên của tháng này" và "ngày cuối cùng của tháng này".
Huelfe

Tôi xin lỗi tôi đã cố gắng và không thành công :(
martinezjc

thử "ngày đầu tiên của tháng trước" và "ngày cuối cùng của tháng trước"
Prerit Mohan

tại sao tháng trước
martinezjc

1
Và đó chính là vấn đề. Tôi muốn thấy một câu trả lời tốt cho câu hỏi này và tôi sẽ đưa ra một khoản tiền thưởng nếu đến lúc.
J. Reynold

Câu trả lời:


3

Tôi đã có một yêu cầu tương tự một thời gian trước đây. Những gì tôi đã làm là tạo ra một mô-đun nhỏ với hook_view_query_alter () . Bạn cần phải viết một chút mã, nhưng tôi nghĩ là thanh lịch và dễ bảo trì hơn là thêm mã PHP vào các bộ lọc theo ngữ cảnh trong giao diện người dùng.

Hãy thử như sau:

Trong tệp .module của bạn

function MODULE_views_api() {
  return array(
    'api' => 3,
  );
}

Trong module.view.inc

//make sure you use your date field table and field name bellow
function MODULE_views_query_alter(&$view, &$query) {
    if ($view->name == 'date_test') { // replace this with your view name

        //this line removes the year from your date field
        $formula = "DATE_FORMAT(field_data_field_date.field_date_value, '%m-%d')";

        //join the field table
        $join = new views_join();
        $join->table = 'field_data_field_date';
        $join->field = 'entity_id';
        $join->left_table = 'node';
        $join->left_field = 'nid';
        $join->type = 'left';

        //add the join the the view query
        $query->add_relationship('field_data_field_date', $join, 'node');

        $first = date('m-d', strtotime('first day of this month'));
        $last = date('m-d', strtotime('last day of this month'));

        //add the field without the year
        $query->add_field(NULL, $formula, 'date_no_year');

        //add the where clauses
        $query->add_where(0, "$formula >= '$first'", array(), 'formula');
        $query->add_where(0, "$formula <= '$last'", array(), 'formula');
    }
}

Mặc dù giải pháp tôi đề xuất ở đây sẽ cung cấp cho bạn hành vi mong muốn, nhưng nếu bạn không cần logic khác bên cạnh việc hiển thị tất cả các ngày sinh trong tháng hiện tại, tôi nghĩ rằng những gì @marcvangend đề xuất là tốt hơn cho trường hợp của bạn (nếu nó hoạt động ... Tôi chưa được thử nghiệm). Giải pháp của tôi là một phần của một cái gì đó phức tạp hơn một chút khi tôi có một số trường hợp đặc biệt để giải quyết. Vì vậy, chỉ cần lưu ý rằng mặc dù nó linh hoạt hơn một chút, nó cũng có thể hơi "quá mức" cho những gì bạn cần.
Stefan

Và bởi vì tôi đã tìm được câu trả lời ban đầu giúp tôi khi tôi gặp vấn đề này, tôi nghĩ sẽ công bằng cho tôi khi gửi tín dụng cho @Peter Lozovitskiy cho drupal.stackexchange.com/a/107394/1422
Stefan

Hoạt động hoàn hảo và rất thanh lịch.
J. Reynold

@Stefan Trong trường hợp của tôi, tôi có cần thêm mối quan hệ với bảng nút không? Ý tôi là, vì tôi chỉ muốn liệt kê dữ liệu người dùng?
martinezjc

Ngọt ngào tôi nhận ra tôi đã phải tham gia với bảng người dùng. Tôi sẽ chỉnh sửa câu trả lời để giúp người khác
martinezjc

4

Câu chuyện dài: Sử dụng Lượt xem một phần Ngày . Hình ảnh bên dưới trình diễn một số tính năng của nó (nhấp vào hình ảnh nếu bạn không thấy hình ảnh động).

nhập mô tả hình ảnh ở đây

Tại sao nó không thể được thực hiện với Lượt xem

Lượt xem chỉ có thể xử lý dấu thời gian Unix . Ngay cả khi ngày tương đối được sử dụng, bộ lọc ngày của Lượt xem sử dụng nội bộ strotime () để chuyển đổi ngày tương đối thành dấu thời gian trước khi thêm điều kiện bộ lọc vào truy vấn.

Tại sao không thể thực hiện được với Chế độ xem ngày

Chế độ xem ngày là một con thú phức tạp cung cấp vô số tính năng xung quanh các tính toán ngày, bao gồm hỗ trợ cho nhiều phụ trợ DB.
Về mặt lý thuyết, Chế độ xem ngày có thể triển khai ngày không hoàn chỉnh, nhưng vì nó cũng hỗ trợ ngày tương đối và các tiện ích đầu vào khác nhau (như Ngày Popup), nên việc xác thực và logic bổ sung sẽ cực kỳ khó duy trì.

Chúng ta có thể làm gì với nó

Tại thời điểm này, chúng tôi đã thiết lập rằng một mô-đun bổ sung hoặc mã tùy chỉnh của một số hình thức là bắt buộc.
Với ý nghĩ đó, tôi đã tạo Lượt xem một phần Ngày và sẽ mở rộng câu trả lời này trong những ngày tiếp theo để mô tả phương pháp tôi đã thực hiện.


@martinezjc Chắc chắn để đặt ngày giới hạn của phạm vi, bạn nên truy cập vào ngày sinh nhật để biết năm, nếu không có mô-đun hoặc thay đổi mã thì không thể thực hiện được.
maciek

Tôi có thể tải dự án hộp cát này ở đâu?
martinezjc

@martinezjc: Nó đã được liên kết hai lần trong văn bản trên. Chỉ cần nhấp vào liên kết "Lượt xem một phần ngày".
Fabian Iwand

@ciss Chỉ cần có cơ hội sử dụng nó ngay bây giờ và yêu thích nó!
J. Reynold

@ J.Reynold Cảm ơn! Ngoài ra còn có một bản vá cho các ngày tương đối một phần trong đường ống có thể sử dụng một số đánh giá: drupal.org/node/2596751
Fabian Iwand

1

Ok thử cái này

  1. Thêm bộ lọc theo ngữ cảnh "id id"
  2. cho phép nhiều giá trị
  3. thêm mã php này làm giá trị mặc định, khi không có giá trị bộ lọc trong url:

$results = db_query("SELECT entity_id FROM field_data_field_FIELDNAME 
WHERE DATE_FORMAT(field_FIELDNAME_value,'%m') = DATE_FORMAT(NOW(),'%m') 
AND entity_type = 'node' AND bundle = 'NODE_TYPE'");
$ids = array();
foreach ($results as $result) {
  $ids[] = $result->entity_id;
}
return implode(',',$ids);

Liên quan đến điều này .


1
Tôi có thể xác nhận rằng điều này hoạt động. Người ta phải sử dụng mô-đun Views PHP và đặt Cho phép nhiều giá trị thành true cho nid.
J. Reynold

1

Bài viết này sẽ giúp bạn ( cũng trên drupal.org ). Khi bạn được định cấu hình với điều này, bạn sẽ có thể lọc nội dung giữa chính xác hai ngày.

Vì vậy, bạn cần thêm ngày bắt đầu mặc định là ngày đầu tiên của tháng và ngày kết thúc là tháng tiếp theo - 1.

Điều này cần được thực hiện thông qua cài đặt chế độ xem mặc định hoặc người ta có thể thêm javascript nhỏ để thêm giá trị mặc định cho các trường cụ thể đó.


Nếu bạn đọc kỹ câu hỏi và nhận xét của OP, bạn sẽ thấy rằng yêu cầu là phải lọc trong tất cả các ngày nằm trong một tháng cụ thể, bất kể năm của ngày. Vì vậy, lượt xem nên nhìn vào tháng hiện tại = tháng 10 và trả lại tất cả các ngày có tháng 10 trong đó, bất kể năm nào.
J. Reynold

đây là một liên kết bị hỏng :(
martinezjc


0

Cú pháp SQL mà bạn muốn đạt được tương đối đơn giản bằng cách sử dụng hàm SQL MONTH ():

SELECT * 
FROM field_data_field_fecha_nacimiento 
WHERE MONTH(field_fecha_nacimiento_value) = 8; // August

Tuy nhiên, không có cách nào để Views tạo loại biểu thức SQL đó mà không có một loại mô-đun bổ sung nào.


1
Có lẽ một Handler tùy chỉnh bộ lọc xử lý?
J. Reynold

@ J.Reynold Chắc chắn, nhưng điều đó vẫn sẽ cần một mô-đun tùy chỉnh. ;)
Fabian Iwand 8/10/2015

1
Có 250 điểm danh tiếng được cung cấp. Nếu bạn đăng Trình xử lý bộ lọc lượt xem, điểm chắc chắn sẽ là của bạn.
J. Reynold

@ J.Reynold bro không có mô-đun tùy chỉnh cho việc này. Kiểm tra giải pháp bên dưới
Himanshu Pathak

0

Tôi đã không kiểm tra điều này, nhưng nó sẽ không hoạt động nếu bạn chọn "tháng" làm độ chi tiết và sau đó sử dụng một ngày duy nhất (tương đối "bây giờ" hoặc một ngày cụ thể) làm giá trị bộ lọc?


1
Tôi phải đồng ý ở đây. "giữa ngày đầu tiên và ngày cuối cùng của tháng" tương đương với "trong tháng". Không cần ngày ...
anou

0

Tại sao bạn bắt họ viết các mô-đun tùy chỉnh cho việc này?

Điều này khá đơn giản cho: First day of current month you need to add" ngày đầu tiên " và for Last day of current month same way" ngày cuối cùng của "

Đọc tài liệu từ PHP.NET một cách cẩn thận.

Ở đây tôi đính kèm ảnh chụp màn hình bộ lọc ngày của chế độ xem của tôi cho các ngày tương đối. nhập mô tả hình ảnh ở đây


Câu trả lời này lọc các ngày trong tháng hiện tại chỉ cho năm hiện tại, không phải cho tháng hiện tại trong bất kỳ năm nào. Như @ciss đã chỉ ra, không có cách nào để làm điều này mà không có một số mã tùy chỉnh.
J. Reynold
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.