Como oculto o campo de uma exibição com base na função?

10

Em / admin / people, quero ocultar o nome de exibição (ou seja, o nome de exibição não deve aparecer na lista de usuários), mas apenas para uma função específica.

No meu arquivo .module, tentei os seguintes 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;
  }

Nenhum deles me ajudou. Pensei em obter os campos da visualização "usuário" e depois disso a desabilitarei para uma função específica. Mas na lista de visualizações, o campo Nome ainda está aparecendo. Como posso ocultá-lo para uma função específica?

Existe alguma maneira de conseguir isso?

Sugandh Khanna
fonte
você deseja ocultar este campo apenas na sua opinião ou deseja que ele oculte em todos os lugares?
Alireza Tabatabaeian
Somente na página de listagem / admin / people. Chega uma coluna display name em / admin / page, quero ocultar essa coluna em particular. Pode ser Se eu ocultar o campo, essa coluna também será ocultada para minha função específica.
Sugandh Khanna

Respostas:

17

A maneira mais eficiente seria usar hook_views_pre_view (), que permite alterar uma View no início do processo, ou seja, antes de qualquer consulta ser criada / executada e antes de qualquer renderização. Você pode remover o manipulador de campo 'nome' da Visualização com base na lógica desejada.

/**
 * 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 solução pressupõe que você só esteja interessado em atender a este caso de uso muito específico - remova o campo somente dessa Visualização específica. Os usuários ainda poderão ver os Nomes para exibição dos usuários em outras áreas do site.

krystalcode
fonte
Bom trabalho, votado
Alireza Tabatabaeian
Eu acho que deveria ser $views->id() ===?
No Sssweat 23/08/19
11
! @NoSsweat Se == em seguida, retornar, portanto, só executar a lógica se ===
krystalcode
Eu posso estar errado, mas deve haver um 's' $views->id()? Deveria ser $view->id()?
Chris Happy
Além disso, se você quiser ver se o usuário tem alguma das funções, use if (empty(array_intersect($userRoles, $userRolesAllowed))). Mais informações emarray_intersect
Chris Happy
3

Você pode ocultar os campos usando hook_entity_field_access , pode ocultar os campos com base na conta do usuário (a função é uma de suas propriedades), a operação e a entidade que contêm o campo.

Você também pode usar o módulo Permissões de campo para ocultar um campo de determinadas funções.

Alireza Tabatabaeian
fonte
0

Quando você precisar excluir o cabeçalho da tabela <td> e também as linhas <td>, poderá usar o 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 qualquer necessidade como essa, tente não usar mais de dois ganchos para atender às suas necessidades. Desde Drupal sempre fará o que quiser usando um ou dois ganchos não mais.


Atualização: para o Drupal 7 também usando o mesmo nome de gancho neste URL template_preprocess_views_view_table

Saud Alfadhli
fonte
0

Use o módulo Permissões do campo Views . Não é necessário código personalizado!

O suporte para funções foi adicionado há cerca de um mês.

colan
fonte