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?


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.


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


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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.