Как скрыть поле представления в зависимости от роли?

10

В / admin / people я хочу скрыть отображаемое имя (то есть отображаемое имя не должно отображаться в списке пользователей), но только для определенной роли.

В моем файле .module я пробовал следующие хуки:

function hook_views_data_alter(array &$data) {
  kint($data['users']);die;
}

function hook_views_pre_render(\Drupal\views\ViewExecutable $view) {
  if($view->id() == 'myview'){
    print_r($view->result);die;
      // kint($value->_entity->get('title')->value);
  }
}

function hook_views_post_render(\Drupal\views\ViewExecutable $view) {
   if ($view->id() == 'viewid') {
    // Set the view title.
    $field_name = $view->getFields();
  }
}

function hook_field_views_data_views_data_alter(array &$data, \Drupal\field\FieldStorageConfigInterface $field) {
  $field_name = $field->getName();
  echo 'hjsjhwd';
  print_r($field_name);die;
  }

Никто из них не помог мне. Я думал о получении полей представления «пользователь», и после этого я буду сбрасывать его для определенной роли. Но в списке просмотров поле Имя все еще появляется. Как я могу скрыть это для определенной роли?

Есть ли способ добиться этого?

Сугандх Кханна
источник
Вы хотите скрыть это поле только в вашем представлении, или вы хотите, чтобы оно было скрыто везде?
Алиреза Табатабаян
Только на странице / admin / people list. Там находится столбец display name в / admin / page, я хочу скрыть этот конкретный столбец на самом деле. Может быть, если я скрываю поле, этот столбец также скрывается для моей конкретной роли.
Суганд Кханна

Ответы:

17

Наиболее эффективным способом было бы использование hook_views_pre_view (), которое позволяет вам изменять View в самом начале процесса, то есть до того, как какой-либо запрос будет построен / запущен, и до того, как произойдет рендеринг. Вы можете удалить обработчик поля 'name' из View, основываясь на желаемой логике.

/**
 * Implements hook_views_pre_view().
 */
function MY_MODULE_views_pre_view($view, $display_id, array &$args) {
  if ($view->id() !== 'user_admin_people') {
    return;
  }

  $user_roles = \Drupal::currentUser()->getRoles();
  if (!in_array('my-special-role', $user_roles)) {
    $view->removeHandler($display_id, 'field', 'name');
  }
}

Это решение предполагает, что вы заинтересованы только в обслуживании этого особого варианта использования - удалите поле только из этого конкретного представления. Пользователи могут по-прежнему видеть отображаемые имена пользователей в других разделах веб-сайта.

krystalcode
источник
Хорошая работа, проголосовали
Алиреза Табатабаян
Я думаю, что это должно быть $views->id() ===?
Нет Sssweat
1
@NoSsweat Если! ==, тогда вернитесь, поэтому
выполняйте
Я могу ошибаться, но должен ли быть 's' в $views->id()? Должно ли это быть $view->id()?
Крис Хэппи
Также, если вы хотите увидеть, есть ли у пользователя какие-либо роли, используйте if (empty(array_intersect($userRoles, $userRolesAllowed))). Больше информации оarray_intersect
Крис Хеппи
3

Вы можете скрыть поля, используя hook_entity_field_access , вы можете скрыть поле на основе учетной записи пользователя (роль является одним из его свойств), операции и сущности, которые содержат поле.

Вы также можете использовать модуль Полевые права, чтобы скрыть поле от определенных ролей.

Алиреза Табатабаян
источник
0

Когда вам нужно удалить заголовок таблицы <td>, а также строки <td>, вы можете использовать template_preprocess_views_view_table

/**
 * Implements template_preprocess_views_view_table().
 */
function TEMPLATE_preprocess_views_view_table(&$variables) {
  // @TODO: You should use $variables['view']->name and $variables['view']->current_display to apply this only one specific view.

  // Let's assume your field name is node status.
  // Remove header label.
  if (isset($variables['header']) && isset($variables['header']['status']) {
    unset($variables['header']['status']);
  }

  // Remove row columns.
  foreach($variables['rows'] as $key => $row) {
    if (isset($variables['rows']) && isset($variables['rows'][$key]) && isset($variables['rows'][$key]['status'])) {
      unset($variables['rows'][$key]['status']);
      unset($variables['result'][$key]->node_status);
    }
  }

  // You can always print_r($variables['rows']) to know what is exact field name that you need to delete.
  // print_r($variables['result']).
  // print_r($variables['header']).
}

Примечание. Для любых подобных целей старайтесь не использовать более двух хуков. Так как Drupal всегда будет делать все, что вы хотите, используя один или два хука, не более.


Обновление: для Drupal 7 также используется то же имя ловушки в этом URL. Template_preprocess_views_view_table

Сауд Альфадли
источник
0

Используйте модуль Поля представлений . Пользовательский код не требуется!

Поддержка ролей была добавлена ​​около месяца назад.

Колан
источник