繰り返し日付フィールド
RFC 5545 RRULE形式をサポートする繰り返し/反復日付フィールドタイプを提供し、複雑な繰り返し日付パターンを定義できます。
date_recur
インストール
composer require 'drupal/date_recur:^3.8'
概要
Recurring Dates Fieldモジュールは、Drupalで繰り返し日付を処理するための包括的なソリューションを提供します。コアのdatetime_rangeフィールドタイプを拡張し、RFC 5545 iCalendar繰り返しルール(RRULE)をサポートすることで、日次、週次、月次、年次など、さまざまな制約を持つ複雑な繰り返し日付パターンを定義できます。
このモジュールはrlanvin/php-rruleライブラリを使用して、RRULE文字列から発生日を解析・生成します。効率的なViews統合とクエリのため、発生日は専用のデータベーステーブルに保存されます。プラグイン可能なインタープリターシステムにより、管理者は繰り返しルールを表示用に人間が読めるテキストに変換する方法を設定できます。
主な機能には、タイムゾーン対応の日付処理、無限および有限の繰り返しパターンのサポート、設定可能な事前作成間隔での発生日キャッシュ、繰り返し日付コンテンツのフィルタリングと表示のための包括的なViews統合が含まれます。
Features
- 繰り返し日付パターンを定義するためのRRULEサポートを備えたdatetime_rangeを拡張するdate_recurフィールドタイプを提供
- FREQ、INTERVAL、COUNT、UNTIL、BYDAY、BYMONTH、BYMONTHDAY、BYYEARDAY、BYWEEKNO、BYHOUR、BYMINUTE、BYSECOND、BYSETPOS、WKST、EXDATEを含むRFC 5545 iCalendar繰り返しルールの完全サポート
- 効率的なクエリとViews統合のための専用データベーステーブルへの自動発生日キャッシュ
- 無限繰り返し日付の設定可能な事前作成間隔(1〜5年先まで)
- RRULE文字列を複数言語(de、en、es、fi、fr、it、nl)で人間が読めるテキストに変換するプラグイン可能なインタープリターシステム
- 開始/終了日ピッカー、タイムゾーンセレクター、RRULEテキストエリア入力を備えた基本ウィジェット
- 日付、人間が読める解釈、設定可能な数の今後の発生日を表示する基本フォーマッター
- ユーザーが使用できるRRULE機能を管理者が制限できる細かな頻度とパート設定
- 発生日フィルター、発生日テーブルへのリレーションシップ、日付フィールドプラグインを備えたViews統合
- カスタム処理のためのフィールド値保存、エンティティ削除、リビジョン削除時にイベントをディスパッチするイベントシステム
- 適切なUTC変換によるタイムゾーン対応のストレージと表示
- 日付のみとdatetime両方のフィールド設定をサポート
Use Cases
繰り返しイベント付きイベントカレンダー
date_recurフィールドを持つイベント用コンテンツタイプを作成します。週次と月次の頻度、BYDAYとBYMONTHDAYパートを許可するようにフィールドを設定します。発生日フィルターを使用したViewsで日付範囲内に発生するイベントを表示し、発生日リレーションシップで今後のすべてのインスタンスをリストします。生のRRULE文字列の代わりに「毎週月曜日と水曜日」と表示するようにインタープリターを設定します。
予約スケジューリングシステム
予約コンテンツタイプでdate_recurフィールドを使用して、繰り返しの空き時間枠を定義します。スケジューリング用の発生日データを生成するために事前作成間隔を2年に設定します。発生日フィルターを使用したViewsを作成して、選択した期間内の空き枠を見つけます。発生日キャッシュテーブルにより、実行時のRRULE計算なしで効率的なクエリが可能になります。
授業またはコーススケジューリング
特定のパターン(例:毎週火曜日と木曜日の午後2時から4時)で実施されるコースを定義します。複雑すぎるルールを防ぐために、頻度をWEEKLYに、パートをBYDAY、UNTIL、COUNTに制限するようにフィールド設定を構成します。フォーマッターは発生日生成のために正確なRRULEを保存しながら、授業スケジュールを分かりやすい日本語で表示します。
メンテナンススケジュール管理
date_recurフィールドで機器のメンテナンススケジュールを追跡します。毎月特定の日にメンテナンスをスケジュールするためにBYMONTHDAYを使用したMONTHLY頻度、または年次点検のためにBYMONTHを使用したYEARLYを使用します。スケジュールが更新されたときに通知をトリガーしたり作業指示を作成したりするために、FIELD_VALUE_SAVEイベントをサブスクライブします。
カスタム発生日処理
date_recur_field_value_saveのイベントサブスクライバーを実装して、発生日を外部カレンダーシステム(Googleカレンダー、Outlook)と同期したり、各発生日に対して個別のノード/エンティティを作成したりします。イベントはカスタム処理ロジックのためにフィールドアイテムリストとエンティティコンテキストへのアクセスを提供します。
Tips
- 事前作成設定は賢く使用してください - 長い間隔はより多くの発生日行を生成しますが、より遠い将来のクエリが可能になります
- date_recurフィールドでViewsを使用する場合、まず発生日リレーションシップを追加し、次に発生日テーブルからフィールド/フィルターを追加して、適切な発生日ベースのクエリを行います
- 一貫したユーザーエクスペリエンスのために、サイトの言語と日付形式の設定に合わせてインタープリター設定を構成します
- RRULEの完全な複雑さが必要ない場合は、フィールド設定で許可される頻度とパートを制限します - これによりユーザーエクスペリエンスが簡素化されます
- 無限繰り返しルールの場合、発生日キャッシュには事前作成された日付のみが含まれます - ユーザーがクエリする必要がある将来の期間に基づいて事前作成間隔を計画してください
- エンティティフックを使用するのではなく、date_recurイベントをサブスクライブしてカスタム処理を行ってください。イベントは特定のフィールドコンテキストを提供します
- 基本ウィジェットのRRULEテキストエリアは標準のiCalendar形式を受け入れます - ユーザーは他のカレンダーアプリケーションからRRULEを貼り付けることができます
- カスタムフォーマッターやウィジェットを作成する場合、DateRecurHelper::create()ファクトリーメソッドを使用してフィールド値から発生日データを取得します
Technical Details
Admin Pages 3
/admin/config/regional/recurring-date-interpreters
RRULE文字列を人間が読めるテキストに変換する繰り返し日付インタープリターを管理します。インタープリターは再利用可能な設定で、フィールドフォーマッター設定で選択して繰り返しルールがユーザーにどのように表示されるかを制御できます。
/admin/config/regional/recurring-date-interpreters/add
新しい繰り返し日付インタープリター設定を作成します。最初にプラグインタイプを選択し、次にプラグイン固有の設定を構成します。
/admin/config/regional/recurring-date-interpreters/manage/{date_recur_interpreter}
既存の繰り返し日付インタープリターの設定を変更します。
権限 1
Hooks 5
hook_theme
繰り返し日付コンポーネントをレンダリングするための3つのtheme hookを定義します:date_recur_basic_widget、date_recur_settings_frequency_table、date_recur_basic_formatter。
hook_field_info_alter
date_recurフィールドタイプとそのサブクラスに、発生日テーブル管理とViews統合に使用される特別なフラグ(is_date_recur)を付けます。
hook_field_views_data
発生日テーブルリレーションシップとフィールドハンドラーを含む、date_recurアタッチフィールドのViews統合を提供します。
hook_views_data
date_recurベースフィールドと発生日フィルタープラグイン登録のViews統合を提供します。
hook_views_data_alter
モジュールのカスタムハンドラーと競合するdate_recurベースフィールドからデフォルトのViewsハンドラーを削除します。
Troubleshooting 6
Drupalルートディレクトリで「composer require rlanvin/php-rrule」を実行して必要なライブラリをインストールし、キャッシュをクリアします。
発生日ベースのフィールドやフィルターを追加する前に、Viewに発生日リレーションシップを追加していることを確認してください。発生日キャッシュテーブル(date_recur__[entity_type]__[field_name])が存在し、データが含まれていることを確認してください。
/admin/config/regional/recurring-date-interpretersでインタープリターを作成し、フィールドフォーマッター設定で選択します。インタープリタープラグインが適切に設定されていることを確認してください。
モジュールは更新時にタイムゾーンを検証します。データベースで手動修正が必要な無効なタイムゾーン値を特定する提供された更新フックを実行してください。
フィールド設定で少なくとも1つの頻度と少なくとも1つのパートが有効になっていることを確認してください。「すべての頻度とパートを許可」がオフで、頻度が有効になっていない場合、RRULE入力は非表示になります。
各date_recurフィールドは独自の発生日キャッシュテーブルを作成します。無限ルールの場合、発生日データは事前作成間隔に基づいて事前作成されます。データベースサイズを削減するために、事前作成間隔を短くするか、ルールにCOUNT/UNTIL制限を使用することを検討してください。
Security Notes 4
- このモジュールはDrupalセキュリティチームからの「covered」セキュリティアドバイザリーカバレッジを持っています
- タイムゾーン値は無効な値の挿入を防ぐためにPHPのtimezone_identifiers_list()に対して検証されます
- RRULE文字列は有効なルールのみが保存されることを保証するためにphp-rruleライブラリのパーサーを使用して検証されます
- rrule_max_lengthストレージ設定は、パフォーマンスに影響を与える可能性のある極端に長いRRULE文字列に対する保護を提供します