だから私はすでにその問題について見つけることができるすべてを読んでそれに従いました:
しかし、それでもこのフック内のブレークポイントで停止することはできません。また、そこに入れたコードの影響を確認することもできません。
何が欠けていますか?
編集:コードで更新
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フィールドが存在しません。
cache_defaultテーブルを空にする必要があります。私が知る唯一の方法は、MYSQL "TRUNCATE cache_default"
フック自体でxdebugすることはできません。class ViewsData path /core/modules/views/src/ViewsData.phpにあるこのフックを呼び出すメソッドに移動し、getDataにブレークポイントを設定してクリアする必要がありますキャッシュし、必要なものを取得します。
以下は、最近モジュールで使用した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;
}
コードに表示されないもの:
handler
filter
またはsort
キーがないreturn $data;
views.incファイル内これが直接回答ではないことはわかっていますが、それが役立つことを願っています。