¿Cómo oculto el campo de una vista en función del rol?

10

En / admin / people, quiero ocultar el nombre para mostrar (es decir, el nombre para mostrar no debe aparecer en la lista de usuarios), sino solo para un rol específico.

En mi archivo .module, he intentado los siguientes ganchos:

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

Ninguno de ellos me ayudó. Pensé en obtener los campos de la vista "usuario" y después de eso lo desarmaré para un rol particular. Pero en la lista de vistas, el campo Nombre todavía aparece. ¿Cómo puedo ocultarlo para un rol en particular?

¿Hay alguna forma de lograr esto?

Sugandh Khanna
fuente
¿Desea ocultar este campo solo en su vista o desea que se oculte en todas partes?
Alireza Tabatabaeian
Solo en la página de listado / admin / people. Viene una columna de display name / admin / page, en realidad quiero ocultar esa columna en particular. Puede ser que si oculto el campo, esa columna también se oculta para mi rol particular.
Sugandh Khanna

Respuestas:

17

La forma más eficiente sería usar hook_views_pre_view (), que le permite alterar una vista al comienzo del proceso, es decir, antes de que se construya / ejecute cualquier consulta y antes de que tenga lugar cualquier representación. Puede eliminar el controlador de campo 'nombre' de la Vista según la lógica deseada.

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

Esta solución asume que solo está interesado en servir este caso de uso muy específico: elimine el campo solo de esta Vista específica. Es posible que los usuarios aún puedan ver los nombres para mostrar de los usuarios en otras áreas del sitio web.

krystalcode
fuente
Buen trabajo, votado
Alireza Tabatabaeian
Creo que debería ser $views->id() ===?
No Sssweat
1
@NoSsweat If! == luego regresa, por lo tanto solo ejecuta la lógica if ===
krystalcode
Podría estar equivocado, pero ¿debería haber una 's' $views->id()? Debe ser $view->id()?
Chris Happy
Además, si desea ver si el usuario tiene alguno de los roles, úselo if (empty(array_intersect($userRoles, $userRolesAllowed))). Más información sobrearray_intersect
Chris Happy
3

Puede ocultar campos utilizando hook_entity_field_access , puede ocultar el campo en función de la cuenta de usuario (el rol es una de sus propiedades), la operación y la entidad que contiene el campo.

También puede usar el módulo Permisos de campo para ocultar un campo de ciertos roles.

Alireza Tabatabaeian
fuente
0

Cuando necesite eliminar el encabezado de la tabla <td> y también las filas <td>, puede usar 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']).
}

Nota: Para cualquier necesidad como esta, intente no usar más de dos ganchos para satisfacer sus necesidades. Dado que Drupal siempre hará lo que quiera usando uno o dos ganchos no más.


Actualización: para Drupal 7 también se usa el mismo nombre de enlace en esta URL template_preprocess_views_view_table

Saud Alfadhli
fuente
0

Utilice el módulo de permisos de campo de vistas . ¡No se requiere código personalizado!

El soporte para roles se agregó hace aproximadamente un mes.

colan
fuente