Filter für benutzerdefinierte Ansichten

7

In Drupal 8 habe ich eine Ansicht, in der alle in meinem Gallery HoursInhaltstyp erstellten Knoten erfasst werden. Der Inhaltstyp hat ein Feld mit dem Namen View Order, das ich für eine andere Ansicht verwende, in der die Liste der Galeriezeiten in dieser Reihenfolge angezeigt wird. Ich versuche, eine andere Ansicht zu erstellen, die die Öffnungszeiten der Galerie für heute überprüft. Zum Beispiel ist heute Dienstag, daher möchte ich, dass in der Ansicht die Galeriezeiten für Dienstag angezeigt werden.

Mein Gedanke war, eine benutzerdefinierte Filteroption zu erstellen, die den numerischen Wert eines Felds vergleicht, z. B. mein Feld "Ansichtsreihenfolge", das auf 1 = Sonntag, 2 = Montag usw. festgelegt ist DATE_FORMAT(NOW(),"%N"). Dies ist mein erster Ausflug in die Entwicklung von benutzerdefinierten Drupal-Modulen und ich drehe meine Räder. Alle Vorschläge sind willkommen.

Das einzige, was ich für richtig halte, sind meine Yaml-Dateien.

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'

Ich bin wirklich verwirrt, wohin ich von dort aus gehen soll. Ich versuche, eine Klasse zusammenzusetzen, die das erweitert, NumericFilterund einen neuen Operator hinzuzufügen, der dann dem WHERE-Ausdruck mit dem von mir gesuchten Datumsformat hinzugefügt wird.

Jedenfalls ist dies mein Versuch, den Filter zu erstellen. Ich erhalte keine Fehler, aber ich erhalte auch nicht den neuen Operator für meine numerischen Felder in meiner Ansicht.

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")');
    }
  }
}

Vielen Dank im Voraus für jede Unterstützung, die Sie leisten können. Ich kann Ihnen nicht sagen, wie oft StackOverflow mir in der Vergangenheit geholfen hat.

Kummerow
quelle
Kummerow, kannst du die Antwort von @ Gun5m0k3 unten akzeptieren? Ich möchte [220129] als Duplikat dieser Frage markieren.
Darvanen
@ Darvanen, Upvotes helfen auch
4k4
Das war meine erste Aktion;)
Darvanen

Antworten:

4

Sie sollten Ihren benutzerdefinierten Filter sowohl in mymodule.views.incals auch in den Klassenanmerkungen registrieren .

\ 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 (im benutzerdefinierten Modulstamm platziert)

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

Ich habe Ihren benutzerdefinierten Abfrageausdruck (ohne Überprüfung) in die query()Methode verschoben , da Views diese Methode beim Filtern aufruft.

Lassen Sie mich wissen, ob dies für Sie funktioniert.

mvdgun
quelle