Drupal 7 with Views an Date module enabled)では、ビューを日付でフィルタリングするのは非常に簡単でした。UIはそうするオプション。
Drupal 8では、ただし、日付フィールドとビューはコアの一部ですが、日付を選択した場合rangeビューのフィルターとしてのフィールドでは、日付固有のオプションは提供されなくなりましたが、テキストフィールドのフィルターオプションのみが表示されます。
ただし、日付固有のオプションは、「コンテンツ:変更済み」などの内部日付値に使用できます
実際の日付の前または後の特定のノードのみを表示したいので、日付はカスタム日付範囲フィールドで指定されているため、これは私のニーズに合いません。
Drupal 8のビューを日付固有の操作を含む日付フィールドでどのようにフィルタリングできますか?
意外なことに、これはまだDrupal 8では不可能です。しかし、これを機能させるための長い歴史があります: https://www.drupal.org/node/2786577最後のパッチ (この投稿で見つけた)は機能しているようです。ダウンロードして適用するには、次のコマンドを使用します。
wget https://www.drupal.org/files/issues/improve_the_views-2786577-76-core.patch
git apply improve_the_views-2786577-76-core.patch
サーバーでgit
を使用できない場合は、次のことを試してください。
patch -p1 < improve_the_views-2786577-76-core.patch
パッチを適用するには、最初にcore
フォルダーに移動する必要があります。コアアップデートをコミットした後、このパッチを再適用する必要があることに注意してください。 (これは最悪です!)ですから、Drupal神々がこれをすぐにコアに入れることを願っています!
現在、ビューは日付範囲をあまり認識していません。開始日または終了日を個別のフィルターとしてフィルターできますが、日付範囲全体としてはできません。
日付範囲に基づくフィルタリングを有効にするには、モジュール Views Date Range Filters を作成しました。現在、日時範囲フィールド用に3つの追加フィルターがあります。
含む
指定された日付を含む日付範囲でフィルタリングします。
オーバーラップ
指定された日付範囲と重複する日付範囲でフィルタリングします。
末尾が
指定された日付で終了する日付範囲でフィルタリングします。 「終了日<=指定された日付」に相当します。 「開始日」を使用するときにグループ化されたフィルターに役立ちます。
間隔フィルタープラグインを使用すると、最小日付と最大日付としてそれぞれ使用する2つのフィールドを選択できます。これにより、範囲の概念が導入されます。次に、範囲に含まれる必要のある日付または含まれない日付を指定することにより、ビューをフィルタリングできます。
例を見てみましょう: https://github.com/barsan-ds/interval-filter
オークションの日付を含むコンテンツタイプを3つのグループ(現在はオンラインで、近日公開され、登録の準備ができている)にフィルターする必要がありました。これには複数の日付範囲が含まれるため、この記事に基づいてプラグインを作成しました: https://www.webomelette.com/creating-custom-views-filter-drupal-8
基本的には3つのことを行います。-フィールドの日付をローカルの日付と時刻に変換します。 -フィルターには「現在オンライン」、「今後」、「その他」の3つの可能な設定があります-設定に基づいて、可能なwhere句をクエリに追加します
それは機能し、将来のアップデートに対して堅牢に見えます。
<?php
/**
* @file
* Definition of Drupal\d8views\Plugin\views\filter\NodeTitles.
*/
namespace Drupal\d8views\Plugin\views\filter;
use Drupal\views\Plugin\views\filter\FilterPluginBase;
use Drupal\views\Plugin\views\filter\InOperator;
use Drupal\views\Plugin\views\filter\ManyToOne;
use Drupal\views\ViewExecutable;
use Drupal\views\Views;
/**
* Filters by given list of node title options.
*
* @ingroup views_filter_handlers
*
* @ViewsFilter("d8views_node_titles")
*/
class NodeTitles extends FilterPluginBase {
// exposed filter options
protected $alwaysMultiple = TRUE;
/**
* Provide simple equality operator
*/
public function operatorOptions() {
return [
'nu_online' => $this->t('Nu online'),
'binnenkort' => $this->t('Binnenkort'),
'anders' => $this->t('Anders'),
];
}
public function query() {
//Get the current domain.
//$domain = domain_get_domain();
$nu_in_utc = new \DateTime('now', new \DateTimezone('UTC'));
$nu_in_utc_in_iso = $nu_in_utc->format('Y-m-d\TH:i:s');
$nu_date = $nu_in_utc->format('Y-m-d');
/*
* Voeg relatie met datum veiling toe
*/
$configuration = [
'table' => 'node__field_datum_veiling',
'left_table' => 'node_field_data',
'left_field' => 'nid',
'field' => 'entity_id',
'type' => 'LEFT',
'extra_operator' => 'AND',
];
$join = Views::pluginManager('join')->createInstance('standard', $configuration);
$this->query->addRelationship('node__field_datum_veiling', $join, 'node_field_data');
/*
* Voeg relatie met online datum van de veiling
*/
$configuration = [
'table' => 'node__field_datum_online',
'left_table' => 'node_field_data',
'left_field' => 'nid',
'field' => 'entity_id',
'type' => 'LEFT',
'extra_operator' => 'AND',
];
$join = Views::pluginManager('join')->createInstance('standard', $configuration);
$this->query->addRelationship('node__field_datum_online', $join, 'node_field_data');
switch($this->operator) {
case 'nu_online':
/*
* Condities voor 'Nu online'
*/
//dpm('Nu online');
$this->query->addWhere('AND', 'node__field_datum_veiling.field_datum_veiling_end_value', $nu_in_utc_in_iso, '>');
$this->query->addWhere('AND', 'node__field_datum_online.field_datum_online_value', $nu_date, '<=');
break;
case 'binnenkort':
/*
* Condities voor 'Binnenkort'
*/
//dpm('Binnenkort');
$this->query->addWhere('AND', 'node__field_datum_veiling.field_datum_veiling_end_value', $nu_in_utc_in_iso, '>');
$this->query->addWhere('AND', 'node__field_datum_online.field_datum_online_value', $nu_date, '>');
break;
case 'anders':
/*
* Condities voor 'Anders' (dwz online, binnenkort, maar nog niet geweest)
*/
$this->query->addWhere('AND', 'node__field_datum_veiling.field_datum_veiling_end_value', $nu_in_utc_in_iso, '>');
break;
}
}
}