it-swarm.com.de

Wie führe ich hook_views_data_alter () aus?

Ich habe also bereits alles gelesen und befolgt, was ich zu diesem Thema finden konnte:

  1. fügen Sie my_module_views_data_alter (Array & $ data) in die Datei my_module.views.inc im Stammverzeichnis von my_module ein.
  2. cache für meine Ansicht deaktivieren,
  3. millionen Mal Caches löschen,

trotzdem kann ich niemals an einem Haltepunkt in diesem Hook anhalten und auch keine Auswirkungen des Codes sehen, den ich in ihn eingefügt habe.

Was vermisse ich?

EDIT: Aktualisierung mit etwas Code

In my_module habe ich bereits ein berechnetes Feld user_age erstellt, das das Benutzeralter aus einem benutzerdefinierten Benutzerprofilfeld mit Geburtsdatum berechnet.

my_module/my_module.module

function my_module_entity_base_field_info(EntityTypeInterface $entity_type) {
  if ($entity_type->id() === 'user') {
    $fields = [];
    $fields['user_age'] = BaseFieldDefinition::create('user_age_field')
      ->setName('user_age')
      ->setLabel(t('User age'))
      ->setComputed(TRUE)
      ->setClass('\Drupal\my_module\UserAgeIntegerItemList')
      ->setDisplayConfigurable('view', TRUE)
      ->setDisplayOptions('view', [
        'label' => 'hidden',
        'weight' => -5,
      ]);

    return $fields;
  }
}
function my_module_field_formatter_info_alter(array &$info) {
  $info['number_integer']['field_types'][] = 'user_age_field';
}

Dieses Feld funktioniert und ist in meiner Benutzerprofilvorlage verfügbar.

Wissen, dass seit Drupal 8.4

Berechnete Felder können jetzt von Ansichten angezeigt werden

Ich wollte das Feld user_age als exponierten Filter in meiner search_users-Ansicht verwenden:

my_module/my_module.views.inc

/**
 * Implements hook_views_data_alter().
 */
function my_module_views_data_alter(array &$data) {
  if (isset($data['users_field_data'])) {
    $data['users_field_data']['user_age'] = [
      'title' => t('User age'),
      'field' => [
        'id' => 'my_module_view_user_age',
      ],
    ];
  }
}

my_module/src/Plugin/views/field/MyModuleViewUserAge.php

<?php

namespace Drupal\my_module\Plugin\views\field;

use Drupal\views\ResultRow;
use Drupal\views\Plugin\views\field\FieldPluginBase;

/**
 * A handler to provide proper displays for user user_age.
 *
 * @ingroup views_field_handlers
 *
 * @ViewsField("my_module_view_user_age")
 */
class MyModuleViewUserAge extends FieldPluginBase {

  /**
   * {@inheritdoc}
   */
  public function render(ResultRow $values) {
    $relationship_entities = $values->_relationship_entities;
    $age = '';
    // First check the referenced entity.
    if (isset($relationship_entities['user'])) {
      $user = $relationship_entities['user'];
    }
    else {
      $user = $values->_entity;
    }

    $type = get_class($user);
    if ($type === 'Drupal\user\Entity\User') {
      $age = $user->get('user_age')->getvalue();
    }

    return $age;
  }

  /**
   * {@inheritdoc}
   */
  public function query() {
    // This function exists to override parent query function.
    // Do nothing.
  }
}

my_module_views_data_alter () scheint jedoch niemals ausgeführt zu werden, und das Feld user_age ist in den Filterkriterien für meine Ansicht nicht vorhanden.

2
KrzysiekK

wir sollten die Tabelle cache_default leeren. Ich kenne nur MYSQL "TRUNCATE cache_default"

1
Denis Viunyk

Sie können xdebug nicht im Hook selbst ausführen. Sie müssen zur Methode gehen, die diese Hooks aufruft, die sich in Klasse ViewsData path /core/modules/views/src/ViewsData.php befindet, und den Haltepunkt in getData setzen, clear Cache und Sie werden bekommen, was Sie brauchen.

1

Hier ist ein Beispiel für MYMODULE.views.inc, das ich kürzlich in einem Modul verwendet habe:

/**
 * Implements hook_views_data().
 */
function MYMODULE_views_data() {

  $data['schema_name']['nid'] = [
    'title' => t('NID'),
    'help' => t('NID from schema_name'),
    'field' => [
      'handler' => 'views_handler_field_numeric',
      'click sortable' => TRUE,
      'float' => TRUE,
      'id' => 'numeric',
    ],
    'relationship' => [
      'title' => 'NID',
      'label' => t('NID'),
      'help' => t('NID from schema_name'),
      'id' => 'standard',
      'base' => 'node',
      'base field' => 'nid',
      'relationship field' => 'nid',
      'handler' => 'views_handler_relationship',
    ],
    'sort' => [
      'id' => 'standard',
    ],
    'filter' => [
      'id' => 'numeric',
    ],
    'argument' => [
      'id' => 'numeric',
    ],
  ];

  return $data;

}

Einige Dinge, die ich in Ihrem Code nicht sehe:

  1. no handler für das Ansichtsfeld
  2. kein filter oder sort Schlüssel für Ihr Feld
  3. nicht drucken return $data; in Ihrer views.inc-Datei

Ich weiß, dass dies keine direkte Antwort ist, aber ich hoffe, es hilft.

0
Prestosaurus