任意の年の当月の最初の日と最後の日の間でフィルタリングします


7

ビューに日付フィールドがあり、月の最初の日と最後の日の間でフィルターしようとすると、ビューのプレビューに結果がありません。

これが私の設定です。このフィルターは、登録されているすべてのユーザーの誕生日を比較し、月の最初の日と最後の日の間の値を持つユーザーのみを印刷する必要があるためです。

これが私のビュー設定のスクリーンショットです:

最初にここに私の日付フィールド設定があります:

ここに画像の説明を入力してください

次に、フィルター設定:

ここに画像の説明を入力してください

最後に、フィルターオプションを設定して、月の最初の日と最後の日の間の結果を取得します。

ここに画像の説明を入力してください

これは私が今まで試みたものですが、成功しませんでした。誰かがこれを手伝ってくれる?これにはモジュールを使いたくありません。このフィルターが機能するだけで十分です。


1
「今月の初日」と「今月の末日」をお試しください。
Huelfe 2015

私も試してみて申し訳ありませんが、成功しませんでした:(
martinezjc

「先月の初日」と「先月の最終日」を試してください
Prerit Mohan

なぜ先月?
martinezjc 2015

1
そしてそこに問題があります。私はこの質問に対する良い答えを見たいと思います、そして時間が来たら私は報奨金を提供します。
J.レイノルズ

回答:


3

私は少し前に同様の要件を持っていました。私がやったことは、hook_views_query_alter()で小さなモジュールを作成することでした。少しコードを書く必要がありますが、ビューUIのコンテキストフィルター内にPHPコードを追加するよりも、エレガントで保守しやすいと思います。

以下を試してください:

.moduleファイル

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

module.views.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');
    }
}

ここで提案する解決策は望ましい動作を提供しますが、今月のすべての誕生日を表示する以外に他のロジックが必要ない場合は、@ marcvangendの提案があなたのケースに適していると思います(それが機能する場合...テストされていません)。私の解決策は、処理するいくつかの特別なケースがあった少し複雑なものの一部です。したがって、少しだけ柔軟性がありますが、必要なものに対しては「やり過ぎ」になる可能性があることを覚えておいてください。
ステファン

そして、この問題があったときに最初に私を助けた答えを見つけることができたので、@ Peter Lozovitskiyにdrupal.stackexchange.com/a/107396/1422
Stefan

完璧に動作し、非常にエレガントです。
J.レイノルズ

@Stefan私の場合、ノードテーブルとの関係を追加する必要がありますか?つまり、ユーザーデータのみを一覧表示したいのですか?
martinezjc 2015年

ユーザーテーブルと結合する必要があったことに気づきました。これが他の人を助けるために答えを編集します
martinezjc '30

4

短い話:ビューの部分的な日付を使用します。下の画像は、その機能の一部をデモしています(アニメーションが表示されない場合は、画像をクリックしてください)。

ここに画像の説明を入力してください

ビューでそれができない理由

ビュー自体はUnixタイムスタンプのみを処理できます。相対日付が使用されている場合でも、ビューの日付フィルター、フィルター条件をクエリに追加する前に、内部でstrotime()を使用して相対日付をタイムスタンプに変換します。

日付ビューでそれができない理由

日付ビューは、複数のDBバックエンドのサポートを含む、日付計算を取り巻く多数の機能を提供する複雑な獣です。
理論的には日付ビューは不完全な日付を実装できますが、相対日付とさまざまな入力ウィジェット(日付ポップアップなど)もサポートしているため、追加の検証とロジックの維持が非常に困難になります。

それについて私たちができること

この時点で、追加のモジュールまたは何らかの形式のカスタムコードが必要であることを確認しました。
そのことを念頭に置いて、ビューの部分的な日付を作成しました。私が取ったアプローチを説明するために、この回答を次の日に展開します。


@martinezjc範囲の制限日を確実に設定するには、モジュールまたはコードを変更せずに年を知るために何らかの方法で誕生日にアクセスする必要があります。
maciek

このサンドボックスプロジェクトはどこでダウンロードできますか?
martinezjc

@martinezjc:上記のテキストで2回リンクされています。「Views Partial Date」リンクをクリックするだけです。
Fabian Iwand

@cissは今それを使用してそれを愛する機会があった!
J.レイノルズ

@J。レイノルズありがとう!パイプラインには、一部のレビューを使用できる相対的な部分的な日付のパッチもあります:drupal.org/node/2596751
Fabian

1

これを試してみましょう。

  1. コンテキストフィルター「ノードID」を追加
  2. 複数の値を許可する
  3. urlにフィルター値がない場合、このphpコードをデフォルト値として追加します。

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

これに関連します


1
これが機能することを確認できます。Views PHPモジュールを使用して、nidに対してAllow multiple valuesをtrueに設定する必要があります。
J.レイノルズ

1

この記事はあなたを助けます(drupal.orgにもあります)。これを設定すると、2つの日付の間でコンテンツをフィルタリングできます。

したがって、デフォルトの開始日を特定の月の1日として、終了日を翌月-1として追加する必要があります。

これはデフォルトのビュー設定で行う必要があります。そうしないと、特定のフィールドにデフォルト値を追加する小さなJavaScriptを追加できます。


OPの質問とコメントを注意深く読むと、日付の年に関係なく、特定の月に該当するすべての日付をフィルターすることが要件であることがわかります。したがって、ビューは今月= 10月を見て、年に関係なく、10月が含まれるすべての日付を返す必要があります。
J.レイノルズ

これはリンク切れです:(
martinezjc '30


0

達成したいSQL構文は、SQL MONTH()関数を使用すると比較的簡単です。

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

ただし、ビューが何らかの種類の追加モジュールなしでそのようなSQL式を作成する方法はありません。


1
おそらくカスタムビューフィルターハンドラーでしょうか?
J.レイノルズ

@ J.Reynoldsもちろんですが、それでもカスタムモジュールが必要になります。;)
Fabian Iwand、2015年

1
250の評判ポイントがあります。ビューフィルターハンドラーを投稿すると、ポイントは間違いなくあなたのものになります。
J.レイノルズ

@ J.Reynolds broこのカスタムモジュールはありません。以下の解決策をチェックしてください
Himanshu Pathak

0

私はこれをテストしていませんが、粒度として「月」を選択し、単一の日付(相対的な「現在」または特定の日付)をフィルター値として使用すると機能しませんか?


1
ここで同意する必要があります。「月の最初の日と最後の日の間」は「月内」と同じです。日の必要はありません...
anou

0

なぜあなたはそれらにこれのためのカスタムモジュールを書くようにさせているのですか?

これは非常に簡単 のために: First day of current month you need to addの最初の日」&for Last day of current month same wayの最後の日

PHP.NETのドキュメントを注意深くお読みください。

ここでは、相対日付のビューの日付フィルターのスクリーンショットを添付しています。 ここに画像の説明を入力してください


この回答は、現在の年の現在の月の日付ではなく、現在の年の現在の日付のみをフィルタリングします。@cissが指摘したように、カスタムコードがなければこれを行う方法はありません。
J.レイノルズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.