Điểm:0

Làm cách nào để tùy chỉnh quyền truy cập cho thực thể đoạn_type?

lá cờ cz

Tôi gặp sự cố với thực thể đoạn_type, khi tôi thêm một đoạn_type vào một nút, có các mục đoạn văn bên trong và tôi đặt trạng thái chưa xuất bản, người dùng ẩn danh vẫn có thể nhìn thấy. loại đoạn chưa xuất bản Tôi cố gắng truy cập tùy chỉnh theo cách khác:

/**
 * Triển khai hook_ENTITY_TYPE_access().
 * ENTITY_TYPE : đoạn_loại
 */
hàm my_module_paragraphs_type_access(
  Drupal\Core\Entity\EntityInterface $entity,
  hoạt động $,
  \Drupal\Core\Session\AccountInterface $account
) {
  tiếng vang '<pre>';
  var_dump('my_module_paragraphs_type_access');
  var_dump($ Operation);
  var_dump($account);
  lối ra();
  // Ẩn đoạn cho người dùng ẩn danh nếu không được xuất bản
    nếu ($hoạt động == 'xem'
        && !$entity->isPublished()
        && ($account->isAnonymous() ||
        !$account->hasPermission('xem các đoạn chưa xuất bản'))
      ) {
    trả về \Drupal\Core\Access\AccessResult::forbidden();
  }

  trả về \Drupal\Core\Access\AccessResult::allowed();
}

Nó không làm việc, var_dump('my_module_paragraphs_type_access'); nó không bao giờ được thực hiện

Hoặc một lớp tùy chỉnh mở rộng ParagraphsTypeAccessControlHandler :

<?php

sử dụng Drupal\Core\Access\AccessResult;
sử dụng Drupal\Core\Entity\EntityInterface;
sử dụng Drupal\Core\Session\AccountInterface;
sử dụng Drupal\paragraphs\ParagraphsTypeAccessControlHandler;

/*
 * Thêm quyền truy cập đoạn_type tùy chỉnh
 */
lớp CustomParagraphsTypeAccessControlHandler mở rộng Đoạn văn TypeAccessControlHandler {
  
  /**
   * {@inheritdoc}
   */
  chức năng được bảo vệ checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
    chuyển ($hoạt động) {
      trường hợp 'xem các đoạn chưa được xuất bản':
        if($account->isAnonymous())
          trả về AccessResult::forbidden();
        nghỉ;
      trường hợp 'xem nhãn':
        return AccessResult::allowedIfHasPermission($account, 'truy cập nội dung');
      mặc định:
        trả về cha mẹ::checkAccess($entity, $operation, $account);
    }
  }
}

nhưng vẫn vậy... Một kế hoạch khác để ẩn chúng với người dùng ẩn danh ?

Tôi tìm thấy một vấn đề này:https://www.drupal.org/project/paragraphs/issues/3095959#comment-13363535

Chris4783 avatar
lá cờ gb
Quyền "Xem các đoạn chưa xuất bản" dành cho người dùng ẩn danh có được bỏ chọn không? Móc "hook_ENTITY_TYPE_access" phải được đặt tên là "my_module_paragraph_access". Bạn đã thay đổi loại thực thể cho AccessControllHandler bằng hook "my_module_entity_type_alter" chưa?
florian_drupal avatar
lá cờ cz
Có, quyền "Xem các đoạn chưa xuất bản" không được chọn, tôi đang nhầm lẫn với các loại thực thể `đoạn` và `các_loại_đoạn` chúng không phải là cùng một thực thể. Để chuyển AccessControllHandler mới của tôi, tôi sử dụng `hook_entity_type_build` với: `$entity_types['paragraphs_type']->setHandlerClass('access', 'Drupal\my_module\Access\CustomParagraphsTypeAccessControlHandler');`
Chris4783 avatar
lá cờ gb
Loại thực thểparagraphs_types là gói của đoạn văn, ví dụ: WYSIWYG. Loại đoạn là một đoạn của một gói cụ thể, ví dụ: WYSIWYG. Vì vậy, bạn cần thay đổi quyền truy cập vào đoạn văn chứ không phải đoạn_type. Sử dụng hook `hook_entity_type_alter` để thay đổi Trình xử lý kiểm soát truy cập đã đăng ký. `hook_entity_type_build` chỉ thêm thông tin bổ sung và không thay đổi chúng. Sau đó, sử dụng `$entity_types['paragraph']->setAccessClass`. Tôi đã thử kịch bản của bạn với một bản cài đặt mới và không phải điều chỉnh bất cứ điều gì, mặc dù tôi đã bật mô-đun Quyền loại đoạn văn.
florian_drupal avatar
lá cờ cz
cảm ơn vì đã trả lời, tôi đã không kích hoạt mô-đun Loại đoạn văn trong trường hợp của mình, tôi sẽ thử giải pháp của bạn với ``hook_entity_type_alter`` Tôi không hiểu sự phụ thuộc của các thực thể, giờ thì rõ ràng hơn.
florian_drupal avatar
lá cờ cz
Tôi thử một cái gì đó: ``function my_module_paragraph_alter(array &$entity_types) { /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */ tiếng vang'
Chris4783 avatar
lá cờ gb
Chức năng của bạn phải được gọi là `my_module_entity_type_alter`, không phải `my_module_paragraph_alter`.
florian_drupal avatar
lá cờ cz
Cảm ơn, tôi không nhận ra lỗi của mình. Tôi đã sửa nó, nhưng tôi gặp lỗi: ```Loại thực thể "đoạn văn" không chỉ định trình xử lý truy cập. trong Drupal\Core\Entity\EntityTypeManager->getHandler()```
Chris4783 avatar
lá cờ gb
Có vẻ như bạn gặp sự cố với tên của tệp hoặc không gian tên. Đảm bảo rằng bạn sử dụng không gian tên của tệp, đặt tệp vào đúng thư mục và tệp được đặt tên chính xác.Có lẽ liên kết này có thể giúp bạn [https://www.prometsource.com/blog/how-override-entity-access-handlers-drupal](https://www.prometsource.com/blog/how-override-entity- xử lý truy cập-drupal)
florian_drupal avatar
lá cờ cz
Tôi đã tìm thấy sự cố: đó là kết xuất tùy chỉnh với hook_pre process_node, mà không kiểm tra quyền truy cập khi đoạn được kết xuất bằng ``\Drupal::entityTypeManager()->getViewBuilder('paragraph')->view($paragraph, 'paragraph_type'); ``
Điểm:0
lá cờ cz

Tôi đã tìm thấy sự cố, đoạn văn được hiển thị theo chương trình với hook_pre process_node, tôi đã khắc phục sự cố bằng cách kiểm tra quyền truy cập như sau:

function mymodule_pre process_node__my_node(&$variables) {

  $node = $variables['node'];

  $paragraphs = $node->get('field_para_blocks');

  /** @var \Drupal\paragraphs\Entity\Paragraph $paragraph */
  foreach ($paragraphs->referencedEntities() as $paragraph) {

    $bó = $đoạn->bó();

    if ($paragraph->access('view')) {
      $bó = $đoạn->bó();
      $variables[$bundle] = \Drupal::entityTypeManager()
        ->getViewBuilder('đoạn văn')
        ->view($paragraph, 'my_paragraph_type');
    }
  }

Đă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.