Điểm:1

Thêm lệnh gọi lại Access tùy chỉnh vào mô-đun hồ sơ để ẩn tab menu đối với một số người dùng nhất định

lá cờ ru

chúng tôi đang sử dụng Hồ sơ mô-đun và tôi đang cố ẩn tab menu trên tài khoản của người dùng đối với một số người dùng nhất định dựa trên giá trị của một trường trên người dùng.

Tôi có bộ alterRoute.

không gian tên Drupal\mymodule\Routing;

sử dụng Drupal\Core\Routing\RouteSubscriberBase;
sử dụng Symfony\Component\Routing\RouteCollection;

/**
 * Lắng nghe các sự kiện tuyến đường năng động.
 */
lớp RouteSubscriber mở rộng RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  chức năng được bảo vệ alterRoutes(RouteCollection $collection) {
    // Thay đổi quyền truy cập cho đường dẫn '/user/%/myprofile'.
    if ($route = $collection->get('profile.user_page.single')) {
      $route->setRequirement('_custom_access', 'Drupal\mymodule\Access\ProfileAccessCheck::access');
    }
  }

}

Tôi đã tạo các dịch vụ trong tệp mymodule.services.yml.

dịch vụ:
  mymodule.route_subscriber:
    lớp: Drupal\mymodule\Routing\RouteSubscriber
    thẻ:
      - { tên: event_subscriber }
  mymodule.profile_access_checker:
    lớp: Drupal\mymodule\Access\ProfileAccessCheck
    thẻ:
      - { name: access_check, apply_to: _custom_access }

Và đây là ProfileAccessCheck.php của tôi

không gian tên Drupal\mymodule\Access;

sử dụng Drupal\Core\Access\AccessResult;
sử dụng Drupal\Core\Routing\Access\AccessInterface;
sử dụng Drupal\Core\Session\AccountInterface;
sử dụng Symfony\Component\Routing\Route;
sử dụng Drupal\user\UserInterface;

/**
 * Kiểm tra xem loại cấu hình có cho phép nhiều cấu hình trên mỗi người dùng hay không.
 */
lớp ProfileAccessCheck triển khai AccessInterface {

  /**
   * Kiểm tra quyền truy cập cho một/nhiều trang.
   *
   * @param \Drupal\Core\Session\AccountInterface $account
   * Tài khoản hiện đang đăng nhập.
   * @param \Drupal\user\UserInterface $user
   * Tài khoản người dùng.
   */
  truy cập chức năng công khai(AccountInterface $account, $user) {
    $user_access = $user->access('view', $account, TRUE);
    if (!$user_access->isAllowed()) {
      // Tài khoản không có quyền truy cập vào trang chuẩn của người dùng
      // ("/user/{user}"), cũng không cho phép truy cập vào bất kỳ trang phụ nào.
      trả về AccessResult::allowed();
    }

    if(!empty($account->field_pro_profile->getValue()) && $account->field_pro_profile->getValue() == 'Disable') {
      trả về AccessResult::forbidden();
    }
    trả về AccessResult::allowed();
  }

}

Tôi có một vài vấn đề. Đầu tiên là, tôi gặp lỗi này:

Lỗi: Gọi hàm thành viên access() trên chuỗi trong Drupal\mymodule\Access\ProfileAccessCheck->access() (dòng 26 của mô-đun/tùy chỉnh/mymodule/src/Access/ProfileAccessCheck.php).

Nếu tôi xóa quyền truy cập đó $user->truy cập dòng thì tôi gặp lỗi này:

Lưu ý: Thuộc tính không xác định: Drupal\Core\Session\AccountProxy::$field_pro_profile trong Drupal\mymodule\Access\ProfileAccessCheck->access() (dòng 26 của mô-đun/tùy chỉnh/mymodule/src/Access/ProfileAccessCheck.php).

Tôi cũng gặp lỗi này trên một số trang khác như trang bật/tắt mô-đun /admin/mô-đun:

RuntimeException: "Drupal\mymodule\Access\ProfileAccessCheck::access" có thể gọi được yêu cầu một giá trị cho đối số "$user". trong Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (dòng 142 của core/lib/Drupal/Component/Utility/ArgumentsResolver.php).

Tại sao tôi không thể truy cập đối tượng người dùng, tôi đang thiếu gì? Ngoài ra, nó dường như ghi đè quyền truy cập từ mô-đun hồ sơ. Cách chính xác để đảm bảo rằng tôi cũng gọi chức năng truy cập mô-đun ban đầu là gì? Bởi vì nó không trả về các tab nếu tôi thực hiện AccessResult::neutral(); nó ẩn tất cả các tab phù hợp với người dùng/%/%

Jaypan avatar
lá cờ de
Tôi nghĩ rằng khai báo hàm không chính xác và có lẽ phải là: `quyền truy cập chức năng công cộng(UserInterface $user, $profileType) {`.
No Sssweat avatar
lá cờ ua
`quyền truy cập chức năng công cộng(UserInterface $user, AccountInterface $account) {`
lá cờ ru
@Jaypan Vâng, tôi cũng đã thử. Nó cho tôi lỗi này. ```RuntimeException: "Drupal\mymodule\Access\ProfileAccessCheck::access" có thể gọi được yêu cầu một giá trị cho đối số "$profileType". trong Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (dòng 142 của core/lib/Drupal/Component/Utility/ArgumentsResolver.php).```
lá cờ ru
@NoSssweat hoạt động! Nhưng tôi dường như không thể truy cập vào $profileType. Tôi cần kiểm tra và đảm bảo rằng đó là giá trị chính xác trong đối số thứ ba vì nó ảnh hưởng đến các tab người dùng khác bên cạnh hồ sơ. Tôi đã thử thêm nó vào các điểm khác nhau và tôi nhận được ```RuntimeException: Callable "Drupal\mymodule\Access\ProfileAccessCheck::access" yêu cầu một giá trị cho đối số "$profileType". trong Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (dòng 142 của core/lib/Drupal/Component/Utility/ArgumentsResolver.php).```
liquidcms avatar
lá cờ us
Tôi có mã gần như giống hệt nhau cho một vấn đề khác và đây là hàm truy cập: truy cập hàm công khai(UserInterface $user, AccountInterface $account) { trả về AccessResult::forbidden(); } và vẫn gặp lỗi tương tự: RuntimeException: Callable "Drupal\ssc_custom\Access\CommentReplyAccess::access" yêu cầu một giá trị cho đối số "$user".

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.