Рейтинг:0

Как настроить доступ к объекту paras_type?

флаг cz

У меня проблема с сущностью paras_type: когда я добавляю paras_type в узел с элементами абзаца внутри и устанавливаю для него статус отмены публикации, анонимные пользователи все еще могут его видеть. тип неопубликованного абзаца Я пытаюсь настроить доступ по-разному:

/**
 * Реализует hook_ENTITY_TYPE_access().
 * ENTITY_TYPE : тип_абзацев
 */
функция my_module_paragraphs_type_access(
  Drupal\Core\Entity\EntityInterface $сущность,
  $операция,
  \Drupal\Core\Session\AccountInterface $account
) {
  эхо '<пред>';
  var_dump('my_module_paragraphs_type_access');
  var_dump ($ операция);
  var_dump ($ учетная запись);
  выход();
  //Скрыть абзац для анонимных пользователей, если он не опубликован
    если ($operation == 'представление'
        && !$entity->isPublished()
        && ($account->isAnonymous() ||
        !$account->hasPermission('просмотр неопубликованных абзацев'))
      ) {
    return \Drupal\Core\Access\AccessResult::forbidden();
  }

  return \Drupal\Core\Access\AccessResult::allowed();
}

Это не работа, var_dump('my_module_paragraphs_type_access'); это никогда не выполняется

Или пользовательский класс, который расширяет ParagraphsTypeAccessControlHandler:

<?php

используйте Drupal\Core\Access\AccessResult;
используйте Drupal\Core\Entity\EntityInterface;
используйте Drupal\Core\Session\AccountInterface;
используйте Drupal\paragraphs\ParagraphsTypeAccessControlHandler;

/*
 * Добавить пользовательский доступ к параграфам_типа
 */
класс CustomParagraphsTypeAccessControlHandler расширяет ParagraphsTypeAccessControlHandler {
  
  /**
   * {@inheritdoc}
   */
  защищенная функция checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
    переключатель ($ операция) {
      case 'просмотреть неопубликованные абзацы':
        если($аккаунт->анонимно())
          вернуть AccessResult::forbidden();
        сломать;
      case 'просмотреть метку':
        return AccessResult::allowedIfHasPermission($account, 'доступ к содержимому');
      По умолчанию:
        return parent::checkAccess($entity, $operation, $account);
    }
  }
}

но все так же... Еще план скрыть их от анонимных пользователей?

Я нашел эту проблему:https://www.drupal.org/project/paragraphs/issues/3095959#comment-13363535

Chris4783 avatar
флаг gb
Разрешение «Просмотр неопубликованных абзацев» для анонимных пользователей снято? Хук «hook_ENTITY_TYPE_access» должен называться «my_module_paragraph_access». Изменили ли вы тип объекта для AccessControllHandler с помощью хука «my_module_entity_type_alter»?
florian_drupal avatar
флаг cz
Да, разрешение «Просмотр неопубликованных абзацев» не отмечено, меня смущают типы сущностей «абзац» и «параграфы_типы», они не являются одним и тем же объектом. Чтобы передать мой новый AccessControllHandler, я использую `hook_entity_type_build` с этим: `$entity_types['paragraphs_type']->setHandlerClass('access', 'Drupal\my_module\Access\CustomParagraphsTypeAccessControlHandler');`
Chris4783 avatar
флаг gb
Тип объекта paraps_types — это набор абзаца, например, WYSIWYG. Тип абзаца — это абзац определенного пакета, например, WYSIWYG. Поэтому вам нужно изменить доступ к абзацу, а не к paras_type. Используйте хук `hook_entity_type_alter`, чтобы изменить зарегистрированный обработчик управления доступом. `hook_entity_type_build` просто добавляет дополнительную информацию и не изменяет ее. Затем используйте `$entity_types['paragraph']->setAccessClass`. Я попробовал ваш сценарий с новой установкой, и мне не пришлось ничего настраивать, хотя у меня был включен модуль разрешений типа абзаца.
florian_drupal avatar
флаг cz
спасибо за ответ, в моем случае я не активировал модуль Paragraphs Type, попробую ваше решение с ``hook_entity_type_alter`` Не понял зависимости сущностей, теперь понятнее.
florian_drupal avatar
флаг cz
Я что-то пробую: ``function my_module_paragraph_alter(array &$entity_types) { /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */ эхо '
Chris4783 avatar
флаг gb
Ваша функция должна называться `my_module_entity_type_alter`, а не `my_module_paragraph_alter`.
florian_drupal avatar
флаг cz
Спасибо, я не заметил свою ошибку, я исправил ее, но у меня есть ошибка: ```Тип объекта "абзац" не указывает обработчик доступа. в Drupal\Core\Entity\EntityTypeManager->getHandler()```
Chris4783 avatar
флаг gb
Похоже, у вас проблема с именем файла или пространством имен. Убедитесь, что вы используете пространство имен файла, поместили файл в правильную папку и правильно назвали файл.Возможно, эта ссылка может вам помочь [https://www.prometsource.com/blog/how-override-entity-access-handlers-drupal](https://www.prometsource.com/blog/how-override-entity- обработчики доступа-drupal)
florian_drupal avatar
флаг cz
Я обнаружил проблему: это пользовательский рендеринг с помощью hook_preprocess_node, без проверки доступа, когда абзац отображается с помощью ``\Drupal::entityTypeManager()->getViewBuilder('paragraph')->view($paragraph, 'paragraph_type'); ``
Рейтинг:0
флаг cz

Я нашел проблему, абзац отображается программно с помощью hook_preprocess_node, я исправляю это с проверкой доступа следующим образом:

функция mymodule_preprocess_node__my_node(&$variables) {

  $узел = $переменные['узел'];

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

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

    $bundle = $paragraph->bundle();

    если ($параграф->доступ('просмотр')) {
      $bundle = $paragraph->bundle();
      $variables[$bundle] = \Drupal::entityTypeManager()
        ->getViewBuilder('абзац')
        -> представление ($ абзац, 'my_paragraph_type');
    }
  }

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.