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.