カスタムビューフィルター


7

Drupal 8では、Gallery Hoursコンテンツタイプに組み込まれているすべてのノードを収集するビューがあります。コンテンツタイプには、View Orderギャラリー時間のリストをその順序で表示する別のビューに使用するというフィールドがあります。私がやろうとしているのは、今日のギャラリー時間をチェックする別のビューを作成することです。たとえば、今日は火曜日なので、火曜日のギャラリー時間をビューに表示したいと思います。

1 =日曜日、2 =月曜日などに設定されている[ビューの順序]フィールドなどのフィールドの数値をと比較するカスタムフィルターオプションを作成するのが私の考えでしたDATE_FORMAT(NOW(),"%N")。これはカスタムDrupalモジュール開発への私の最初の進出であり、私の車輪を回転させています。あらゆる提案を歓迎します。

私が正しいと思うのは、yamlファイルです。

todaysdate.info.yml

name: Todays Date Filter module
description: 'Creates a filter to search by todays day of the week.'
type: module
core: 8.x
package: SMA Modules

todaysdate.routing.yml

todaysdate:
  defaults:
    _controller: Drupal\todaysdate\Plugin\Filter\todays_date_handler_filter_numeric::operators
  requirements:
    _permission: 'access content'

私が本当に混乱しているのは、そこからどこへ行くかです。私はを拡張するクラスをつなぎ合わせてNumericFilter、新しい演算子を追加し、探している日付形式でWHERE式に追加しようとしています。

とにかく、これは私のフィルター作成の試みです。エラーは発生していませんが、ビューの数値フィールドに新しい演算子が表示されていません。

todays_date_handler_filter_numeric.php

<?php

/**
 * @file
 * Provides views filter option for the Todays Date module.
 */

namespace Drupal\todaysdate\Plugin\Filter;

use Drupal\views\Plugin\views\display\DisplayPluginBase;
use Drupal\views\Plugin\views\filter\NumericFilter;
use Drupal\views\Plugin\views\filter\InOperator;

class todays_date_handler_filter_numeric extends NumericFilter {
  function operators(){
    $operators = parent::operators();
    $operators += array(
      'todays date' => array(
        'title' => $this->t('Is this day of the week'),
        'short' => $this->t('todays date'),
        'method' => 'op_day_of_week',
        'values' => 0,
      )
    );
    return $operators;

    function op_day_of_week($field) {
      $this->query->addWhereExpression($this->options['group'], 'DATE_FORMAT(NOW(),"%N")');
    }
  }
}

あなたが提供できるあらゆる援助を前もってすべてありがとう。StackOverflowが過去に何回助けてくれたのかはわかりません。


クンメロウ、以下の@ Gun5m0k3までの回答を受け入れることができますか?[220129]をこの質問の複製としてマークしたいです。
Darvanen 2017

@ダーバネン、賛成票も役に立ちます
4k4

それが私の最初のアクションでした;)
Darvanen

回答:


4

カスタムフィルターをmymodule.views.incクラスアノテーションとクラスアノテーションの両方に登録する必要があります。

\ Drupal \ mymodule \ Plugin \ views \ filter \ MyCustomNumericFilter

<?php

namespace Drupal\mymodule\Plugin\views\filter;

use Drupal\views\Plugin\views\filter\NumericFilter;

/**
 * My custom numeric filter.
 *
 * @ingroup views_filter_handlers
 *
 * @ViewsFilter("my_custom_numeric_filter")
 */
class MyCustomNumericFilter extends NumericFilter {

  public function query() {   
    $this->query->addWhereExpression($this->options['group'], 'DATE_FORMAT(NOW(),"%N")');
  }

  protected function operators() {
    $operators = parent::operators();
    $operators += array(
      'todays date' => array(
        'title' => $this->t('Is this day of the week'),
        'short' => $this->t('todays date'),
        'method' => 'op_day_of_week',
        'values' => 0,
      )
    );
    return $operators;
  }

}

mymodule.views.inc(カスタムモジュールルートに配置)

function mymodule_views_data() {
  $data = [];
  $data['views']['my_custom_numeric_filter'] = [
    'title' => t('My custom numeric filter'),
    'filter' => [
      'title' => t('My custom numeric filter'),
      'group' => 'Custom',
      'help' => t('Provides custom numeric filter.'),
      'id' => 'my_custom_numeric_filter'
    ],
  ];
  return $data; 
}

query()ビューはフィルタリング時にこのメソッドを呼び出すため、カスタムクエリ式を(チェックなしで)メソッドに移動しました。

これで問題が解決するかどうかお知らせください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.