私のビューに日付フィールドがあり、firstとlastの月の間にフィルターをかけようとすると、ビューのプレビューに結果がありません。
これが私の設定です。このフィルターは、登録されているすべてのユーザーの誕生日を比較し、月の最初の日と最後の日の間の値を持つユーザーのみを印刷する必要があるためです。
これが私のビュー設定のスクリーンショットです:
最初は私の日付フィールド設定です:
そしてフィルター設定:
最後に、フィルターオプションを設定して、月の最初の日と最後の日の間の結果を取得します。
これは私が今まで試みたものですが、成功しませんでした。誰かがこれを手伝ってくれる?これにはモジュールを使いたくありません。このフィルターが機能するだけで十分です。
少し前に同様の要件がありました。 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');
}
}
短い話: Views Partial Date を使用します。下の画像は、その機能の一部をデモしています(アニメーションが表示されない場合は、画像をクリックしてください)。
なぜビューで実行できないのですか
ビュー自体は nixタイムスタンプ のみを処理できます。相対日付が使用されている場合でも、ビューの日付フィルター strotime() を内部的に使用して、フィルター条件をクエリに追加する前に相対日付をタイムスタンプに変換します。
日付ビューでは実行できない理由
日付ビューは、複数のDBバックエンドのサポートを含む、日付計算を取り巻く多数の機能を提供する複雑な獣です。
理論的には日付ビューは不完全な日付を実装できますが、相対日付とさまざまな入力ウィジェット(日付ポップアップなど)もサポートしているため、追加の検証とロジックを維持することは非常に困難です。
それについて何ができるか
この時点で、追加のモジュールまたは何らかの形式のカスタムコードが必要であることを確認しました。
そのことを念頭に置いて Views Partial Date を作成しました。私が取ったアプローチを説明するために、この回答を今後数日で展開します。
これを試してみましょう。
$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 に関連しています。
これは article が役立ちます( drupal.orgにもあります )。これを設定すると、2つの日付の間でコンテンツをフィルタリングできます。
したがって、デフォルトの開始日を特定の月の1日として、終了日を翌月-1として追加する必要があります。
これはデフォルトのビュー設定で行う必要があります。そうしないと、特定のフィールドにデフォルト値を追加する小さなJavaScriptを追加できます。
なぜあなたはこれのためにカスタムモジュールを書くようにそれらを作っているのですか?
これはかなり単純です:First day of current month you need to add
"最初の日"&for Last day of current month same way
"最終日"
PHP.NET からドキュメントを注意深く読んでください。
実現したいSQL構文は、SQL MONTH()関数を使用すると比較的簡単です。
SELECT *
FROM field_data_field_fecha_nacimiento
WHERE MONTH(field_fecha_nacimiento_value) = 8; // August
ただし、ビューがなんらかの種類の追加モジュールなしでそのようなSQL式を作成する方法はありません。
私はこれをテストしていませんが、粒度として「月」を選択し、単一の日付(相対的な「現在」または特定の日付)をフィルター値として使用すると機能しませんか?