Tùy chỉnh ngày có thể được nhấp vào cửa sổ bật lên Lịch


10

Tôi đang tạo một biểu mẫu trong Drupal 7 với API biểu mẫu. Ngay bây giờ, tôi có thể tạo trường nhập lịch thông thường với mã sau:

   $form['services_tab']['schedule_datepicker'] = array(
    '#title' => t('Pick the desired date'),
    '#type' => 'date_popup',
    '#date_year_range' => '0:0',
    '#date_format' => 'Y-m-d',
    '#prefix' => '<div id="datepicker-schedule">',
    '#suffix' => '</div>',
  );

Ngay bây giờ tôi có thể có được cửa sổ bật lên lịch đẹp xuất hiện. Những gì tôi đang cố gắng đạt được là bật hoặc tắt một số ngày nhất định dựa trên quy tắc như: vô hiệu hóa tất cả các ngày thứ bảy và chủ nhật; hoặc thậm chí xóa trạng thái nhấp chuột khỏi các ngày cụ thể dựa trên danh sách các ngày lễ quốc gia ...

Đây có phải là thứ có thể đạt được với mã hóa PHP hay nó cần phải được thực hiện với jQuery? Trong trường hợp jQuery là giải pháp, tôi sẽ đánh giá cao bất kỳ gợi ý nào về cách thực hiện điều đó ... Lịch là một bảng, nhưng các ô của bảng không có ID hoặc thứ gì đó có thể giúp tôi tìm và vô hiệu hóa chúng dựa trên quy tắc. ..

Cảm ơn bạn.


1
Câu trả lời "[Cách vô hiệu hóa cuối tuần] [1]" này sẽ giúp bạn vô hiệu hóa các ngày cuối tuần và một số ngày. [1]: stackoverflow.com/questions/501943/
Mạnh

Câu trả lời:


8

Bạn có thể chuyển một số tùy chọn Datepicker từ php sang phần tử date_popup thông qua khóa '#datepicker_options':

<?php
$form['date'] = array(
  '#title' => t('Pick the desired date'),
  '#type' => 'date_popup',
  '#datepicker_options' => array(
    'minDate' => 0,
  ),
);

Với phương pháp này, bạn có thể vượt qua hầu hết mọi tùy chọn ngoại trừ các tùy chọn chấp nhận hàm là giá trị, vì beforeShowDay, cần có để hạn chế cuối tuần hoặc ngày lễ theo câu trả lời được tham chiếu bởi Nikit: /programming/501943/can- the-jquery-ui-datepicker-be-made-to-vô hiệu hóa-thứ bảy-và-chủ nhật-và-holid

Do đó, javascript là bắt buộc. Trước tiên, bạn cần bao gồm một tệp js tùy chỉnh từ mã mô-đun của bạn:

<?php
drupal_add_js(drupal_get_path('module', 'FOO') . '/FOO.js');

và cung cấp một số mã FOO.jsđể mở rộng cài đặt được đặt bởi mô-đun date_popup với các tùy chọn riêng của chúng tôi.

Dưới đây là một ví dụ bổ sung tùy chọn cơ bản để vô hiệu hóa ngày cuối tuần cho tất cả các tiện ích hẹn hò trong trang:

(function ($) {
Drupal.behaviors.FOO = {
  attach: function (context) {
    for (var id in Drupal.settings.datePopup) {
      Drupal.settings.datePopup[id].settings.beforeShowDay = $.datepicker.noWeekends;
    }
  }
};
})(jQuery);

Kéo dài đến ngày lễ là một bài tập cho người đọc :)

Lưu ý: ba lần xuất hiện FOOtrong các ví dụ của tôi không cần phải giống nhau theo nghĩa đen, nghĩa là: bạn có thể cung cấp một BAZhành vi BAR.jstừ FOO.module.

Cập nhật: để mở rộng ở trên cho ngày khả dụng tùy chỉnh, chỉ cần thêm một hàm trả về true / false cho ngày nhận được bởi các tham số.

(function ($) {
Drupal.behaviors.FOO = {
  attach: function (context) {
    for (var id in Drupal.settings.datePopup) {
      Drupal.settings.datePopup[id].settings.beforeShowDay = checkDate;
    }
  }
};

function checkDate(date) {
  if ((date.getDate() % 2) == 0) {
    return [false, 'Even days not available'];
  }
  else {
    return [true, 'Odd days are fine'];
  }
}
})(jQuery);

Bạn có thể tìm thấy một ví dụ đầy đủ hơn trong mô-đun Hạn chế ngày .


Cảm ơn bạn, Jonhattan! Tôi đã thiết lập thành công minDate và nó vô hiệu hóa tất cả những ngày qua. Đây là một khởi đầu tuyệt vời cho tôi. Tôi tự hỏi nếu tôi có thể thiết lập một cái gì đó như maxDate, vì tôi muốn chỉ giữ một phạm vi trong khoảng 15 ngày được kích hoạt. Tôi có thể thấy có một thuộc tính 'fromTo', nhưng không có manh mối về những gì nó sẽ làm. Ý tưởng của tôi là vô hiệu hóa tất cả các ngày trong quá khứ (đã hoàn thành) và tất cả các ngày trong tương lai (khoảng 15 ngày kể từ bây giờ ()). Ở giữa, tôi sẽ kiểm tra tài liệu javascript ngày pickeer để xem cách vô hiệu hóa một số ngày mở.
Marcos Buarque

1
vâng, cũng có một maxDate: api.jqueryui.com/datepicker/#option-maxDate
jonhattan

Cảm ơn, vì một số lý do, khi tôi xem xét tài liệu của trường date_popup, tôi không thể tìm thấy thông tin về tùy chọn maxDate. Điều này làm việc cho tôi và giới hạn lịch ở một maxDate: '#datepicker_options' => mảng ('minDate' => 0, 'maxDate' => 30,),
Marcos Buarque

jonhattan, tôi xin lỗi để hỏi lại. Tôi đang kéo tóc cố gắng thực hiện một chức năng tùy chỉnh. Tôi đã thực hiện mô hình của bạn và nó hoạt động rất tốt cho tôi. Nhưng bây giờ tôi muốn thực thi một chức năng tùy chỉnh để chỉ cho phép ngày cụ thể. Tôi thấy bạn đã gợi ý những ngày nghỉ như một bài tập cho người đọc ;-) Người đọc này gần như điên khi cố gắng giải quyết vấn đề này. Nếu nó không phải là một công việc bổ sung lớn cho bạn, bạn có phiền đăng bài bạn sẽ giải quyết vấn đề này như thế nào không? Đừng bận tâm về chi tiết, tôi chỉ cần một sự trợ giúp tổng thể để thực hiện cuộc gọi đến customFunction (ngày). Cảm ơn bạn!
Marcos Buarque

Marcos, tôi đã cập nhật câu trả lời của mình bằng một ví dụ đơn giản về việc sử dụng chức năng tùy chỉnh.
jonhattan

0

Tôi đã sử dụng mô-đun Hạn chế ngày. Điều này cung cấp và tùy chọn để hạn chế ngày trên số lượng tham số như ngày cố định, ngày tương đối, v.v.

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.