カレンダーポップアップでクリックできる日をカスタマイズする


10

Drupal 7でフォームAPIを使用してフォームを作成しています。現在、次のコードで通常のカレンダー入力フィールドを作成できます。

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

現在、美しいカレンダーポップアップを表示できます。私が達成しようとしているのは、次のようなルールに基づいて特定の日付を有効または無効にすることです。すべての土曜日と日曜日を無効にします。または、祝日のリストに基づいて特定の日付からクリック状態を削除する...

これはPHPコーディングで実現できるものですか、それともjQueryで実行する必要がありますか?jQueryが解決策である場合、私はそれを行う方法についてのヒントをいただければ幸いです...カレンダーはテーブルですが、テーブルセルには、ルールに基づいてそれらを見つけて無効にするのに役立つIDまたは何かがありません。 ..

ありがとうございました。


1
この「[週末を無効にする方法] [1]」の回答は、週末といくつかの日を無効にするのに役立ちます。[1]:stackoverflow.com/questions/501943/...
Nikit

回答:


8

'#datepicker_options'キーを介して、phpからdate_popup要素にいくつかのDatepickerオプションを渡すことができます。

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

このメソッドを使用すると、ほぼすべてのオプションを渡すことができますがbeforeShowDay、Nikitが参照する回答に従って週末または休日を制限するために必要なものとして、関数を値として受け入れるオプション:https ://stackoverflow.com/questions/501943/can- the-jquery-ui-datepicker-be-made-to-disable-saturdays-and-sundays-and-holid

したがって、JavaScriptが必要です。最初に、モジュールコードからカスタムjsファイルを含める必要があります。

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

そしてFOO.js、date_popupモジュールによって設定された設定を独自のオプションで拡張するためのコードを提供します。

以下は、ページ内のすべての日付ピッカーウィジェットの週末を無効にする基本オプションを追加する例です。

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

休日への拡張は、読者への練習問題として残されています:)

注:FOO私の例でのの3つの出現は、同じリテラルである必要はありません。つまりBAZBAR.jsfromで動作を提供できますFOO.module

更新:上記のカスタム日の可用性を拡張するには、パラメーターで受け取った日のtrue / falseを返す関数を追加するだけです。

(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);

より完全な例については、日付制限モジュールを参照してください。


ジョンハッタン、ありがとう!minDateを正常に設定しましたが、過去のすべての日が無効になります。これは私にとって素晴らしい始まりです。15日間の範囲のみを有効にしたいので、maxDateのようなものを設定できるかどうか疑問に思います。「fromTo」属性があることがわかりますが、それが何をするのかについての手掛かりはありません。私の考えは、過去のすべての日付(完了)と将来のすべての日付(now()から約15日)を無効にすることです。途中で、日付ピッカーのJavaScriptドキュメントをチェックして、一部の営業日を個別に無効にする方法を確認します。
Marcos Buarque 2013

1
はい、maxDateもあります:api.jqueryui.com/datepicker/#option-maxDate
jonhattan

おかげで、何らかの理由で、date_popupフィールドのドキュメントを調べたところ、maxDateオプションに関する情報が見つかりませんでした。これは私のために働き、カレンダーをmaxDateに制限しました: '#datepicker_options' => array( 'minDate' => 0、 'maxDate' => 30、)、
Marcos Buarque

ジョンハッタン、もう一度お願いします。カスタム関数を実行しようとして髪を引っ張っています。私はあなたのモデルを実装しました、そしてそれは私にとって素晴らしい働きをします。しかし今、特定の日付のみを許可するカスタム関数を実行したいと思います。私はあなたが読者のための練習として休日を提案したと思います;-)この読者はこの問題を解決しようとしています。それがあなたにとって大きな追加作業ではない場合は、これをどのように解決するかを投稿していただけませんか?詳細について気にしないでください、customFunction(date)の呼び出しを行うための全体的なヘルプが必要です。ありがとうございました!
Marcos Buarque 2013

マルコス、私はカスタム関数の使い方の簡単な例で私の答えを更新しました。
ジョンハッタン2013

0

日付制限モジュールを使用しました。これは、固定日付、相対日付などのパラメーターの数に日付を制限するオプションを提供します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.