web-dev-qa-db-ja.com

hook_views_data_alter()を実行するにはどうすればよいですか?

だから私はすでにその問題について見つけることができるすべてを読んでそれに従いました:

  1. my_module_views_data_alter(array&$ data)をmy_moduleのルートディレクトリのmy_module.views.incファイルに配置します。
  2. ビューのキャッシュを無効にする、
  3. キャッシュを数百万回クリアし、

しかし、それでもこのフック内のブレークポイントで停止することはできません。また、そこに入れたコードの影響を確認することもできません。

何が欠けていますか?

編集:コードで更新

My_moduleで、計算フィールドuser_ageをすでに作成し、生年月日のカスタムユーザープロファイルフィールドからユーザー年齢を計算しました。

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

このフィールドは機能しており、ユーザープロファイルテンプレートでアクセスできます。

Drupal 8.4以降

計算フィールドをビューで表示できるようになりました

私はsearch_usersビューでフィールドuser_ageを公開フィルターとして使用したいと思いました。

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()は決して実行されないようで、ビューのフィルター基準にuser_ageフィールドが存在しません。

2
KrzysiekK

cache_defaultテーブルを空にする必要があります。私が知る唯一の方法は、MYSQL "TRUNCATE cache_default"

1
Denis Viunyk

フック自体でxdebugすることはできません。class ViewsData path /core/modules/views/src/ViewsData.phpにあるこのフックを呼び出すメソッドに移動し、getDataにブレークポイントを設定してクリアする必要がありますキャッシュし、必要なものを取得します。

1

以下は、最近モジュールで使用したMYMODULE.views.incの例です。

/**
 * 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;

}

コードに表示されないもの:

  1. ビューフィールドにhandler
  2. フィールドにfilterまたはsortキーがない
  3. 印刷しないreturn $data; views.incファイル内

これが直接回答ではないことはわかっていますが、それが役立つことを願っています。

0
Prestosaurus