web-dev-qa-db-ja.com

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

私のビューに日付フィールドがあり、firstlastの月の間にフィルターをかけようとすると、ビューのプレビューに結果がありません。

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

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

最初は私の日付フィールド設定です:

enter image description here

そしてフィルター設定:

enter image description here

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

enter image description here

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

7
martinezjc

少し前に同様の要件がありました。 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');
    }
}
3
Stefan

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

enter image description here

なぜビューで実行できないのですか

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

日付ビューでは実行できない理由

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

それについて何ができるか

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

4
Fabian Iwand

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

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

this に関連しています。

1
Huelfe

これは article が役立ちます( drupal.orgにもあります )。これを設定すると、2つの日付の間でコンテンツをフィルタリングできます。

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

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

1
user36960

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

これはかなり単純ですFirst day of current month you need to add "最初の日"&for Last day of current month same way "最終日"

PHP.NET からドキュメントを注意深く読んでください。

ここでは、相対日付のビューの日付フィルターのスクリーンショットを添付しています。 enter image description here

0
Himanshu Pathak

次の2つのオプションを試してください。

今月の初日

今月の末日

これらの値を this strtotime()tester に入れると、適切な日付が提供されます。

0
VanD

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

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

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

0
Les Lim

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

0
marcvangend