Bagaimana cara menyembunyikan bidang tampilan berdasarkan peran?


10

Di / admin / orang, saya ingin menyembunyikan nama tampilan (yaitu nama Tampilan tidak boleh muncul dalam daftar pengguna), tetapi hanya untuk peran tertentu.

Dalam file .module saya, saya telah mencoba kait berikut:

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

Tak satu pun dari mereka yang membantu saya. Saya berpikir untuk mendapatkan bidang tampilan "pengguna" dan setelah itu saya akan menghapusnya untuk peran tertentu. Namun dalam daftar tampilan, bidang Nama masih muncul. Bagaimana saya bisa menyembunyikannya untuk peran tertentu?

Apakah ada cara untuk mencapai hal ini?


apakah Anda ingin menyembunyikan bidang ini hanya dalam tampilan Anda atau Anda ingin menyembunyikannya di mana-mana?
Alireza Tabatabaeian

Hanya di / admin / halaman daftar orang. Ada kolom display name di / admin / halaman, saya ingin menyembunyikan kolom tertentu itu sebenarnya. Mungkin Jika saya menyembunyikan bidang, kolom itu juga disembunyikan untuk peran khusus saya.
Sugandh Khanna

Jawaban:


17

Cara yang paling efisien adalah menggunakan hook_views_pre_view (), yang memungkinkan Anda untuk mengubah tampilan di awal proses, yaitu sebelum permintaan dibangun / dijalankan dan sebelum proses rendering berlangsung. Anda dapat menghapus field handler 'name' dari View berdasarkan pada logika yang diinginkan.

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

Solusi ini mengasumsikan bahwa Anda hanya tertarik untuk melayani kasus penggunaan yang sangat spesifik ini - hapus bidang hanya dari Tampilan spesifik ini. Pengguna mungkin masih dapat melihat Nama Tampilan pengguna di area lain situs web.


Kerja bagus, terpilih
Alireza Tabatabaeian

Saya pikir seharusnya begitu $views->id() ===?
No Sssweat

1
@NoSsweat If! == lalu kembali, oleh karena itu hanya jalankan logika if ===
krystalcode

Saya mungkin salah, tetapi haruskah ada 's' di dalamnya $views->id()? Haruskah begitu $view->id()?
Chris Happy

Juga, jika Anda ingin melihat apakah pengguna memiliki peran apa pun, gunakan if (empty(array_intersect($userRoles, $userRolesAllowed))). Info lebih lanjut tentangarray_intersect
Chris Happy

3

Anda dapat menyembunyikan bidang menggunakan hook_entity_field_access , Anda dapat menyembunyikan bidang berdasarkan akun pengguna (peran adalah salah satu propertinya), operasi dan entitas yang berisi bidang tersebut.

Anda juga dapat menggunakan modul Izin Bidang untuk menyembunyikan bidang dari peran tertentu.


0

Ketika Anda perlu menghapus header tabel <td> dan juga baris <td> Anda dapat menggunakan 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']).
}

Catatan: Untuk kebutuhan apa pun seperti ini, cobalah untuk tidak menggunakan lebih dari dua kait untuk memenuhi kebutuhan Anda. Karena Drupal selalu akan melakukan apa pun yang Anda inginkan menggunakan satu atau dua kait tidak lagi.


Pembaruan: Untuk Drupal 7 juga menggunakan nama kait yang sama pada URL ini template_preprocess_views_view_table


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.