Làm cách nào để ẩn trường nhìn dựa trên vai trò?


9

Trong / admin / people, tôi muốn ẩn tên hiển thị (nghĩa là tên Hiển thị không được xuất hiện trong danh sách người dùng), mà chỉ cho một vai trò cụ thể.

Trong tệp .module của tôi, tôi đã thử các hook sau:

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

Không ai trong số họ giúp tôi. Tôi đã nghĩ đến việc có được các trường của chế độ xem "người dùng" và sau đó tôi sẽ bỏ đặt nó cho vai trò cụ thể. Nhưng trong danh sách lượt xem, trường Tên vẫn xuất hiện. Làm thế nào tôi có thể ẩn nó cho một vai trò cụ thể?

Có bất kì cách nào để đạt được điều này không?


Bạn có muốn ẩn trường này chỉ trong chế độ xem của mình hoặc bạn muốn ẩn nó ở mọi nơi?
Alireza Tabatabaeian

Chỉ tại / admin / trang danh sách người. Có một cột display name tại / admin / trang, tôi thực sự muốn ẩn cột cụ thể đó. Có thể là nếu tôi ẩn trường, cột đó cũng được ẩn cho vai trò cụ thể của tôi.
Sugandh Khanna

Nếu bạn có thể làm điều đó bằng quyền thay vào đó, bạn chỉ cần sử dụng Quyền xem trường .
colan

Câu trả lời:


17

Cách hiệu quả nhất sẽ là sử dụng hook_view_pre_view (), cho phép bạn thay đổi Chế độ xem ngay khi bắt đầu quá trình, tức là trước khi bất kỳ truy vấn nào được xây dựng / chạy và trước khi bất kỳ kết xuất nào diễn ra. Bạn có thể xóa trình xử lý trường 'tên' khỏi Chế độ xem dựa trên logic mong muốn.

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

Giải pháp này giả định rằng bạn chỉ quan tâm đến việc phục vụ trường hợp sử dụng rất cụ thể này - chỉ xóa trường khỏi Chế độ xem cụ thể này. Người dùng vẫn có thể thấy Tên hiển thị của người dùng ở các khu vực khác của trang web.


Làm tốt lắm, đã được bình chọn
Alireza Tabatabaeian

Tôi nghĩ nó nên $views->id() ===?
Không có Sssweat

1
@NoSsweat If! == sau đó quay lại, do đó chỉ thực hiện logic nếu ===
krystalcode

Tôi có thể sai, nhưng nên có một 's' trong $views->id()? Có nên $view->id()không?
Chris Chúc mừng

Ngoài ra, nếu bạn muốn xem người dùng có bất kỳ vai trò nào không, hãy sử dụng if (empty(array_intersect($userRoles, $userRolesAllowed))). Thông tin thêm vềarray_intersect
Chris Happy

3

Bạn có thể ẩn các trường bằng hook_entity_field_access , bạn có thể ẩn trường dựa trên tài khoản người dùng (vai trò là một trong các thuộc tính của nó), hoạt động và thực thể có chứa trường.

Bạn cũng có thể sử dụng mô-đun Quyền hạn để ẩn một trường khỏi các vai trò nhất định.


0

Khi bạn cần xóa tiêu đề bảng <td> và cả hàng <td>, bạn có thể sử dụng template_pre process_view_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']).
}

Lưu ý: Đối với bất kỳ nhu cầu nào như thế này, hãy cố gắng không sử dụng nhiều hơn hai móc để làm nhu cầu của bạn. Vì Drupal sẽ luôn làm bất cứ điều gì bạn muốn bằng cách sử dụng một hoặc hai móc.


Cập nhật: Đối với Drupal 7 cũng sử dụng cùng tên hook trên URL này template_pre process_view_view_table

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.