Рейтинг:1

Добавьте настраиваемый обратный вызов Access в модуль профиля, чтобы скрыть вкладку меню для определенных пользователей.

флаг ru

Мы используем Профиль модуль, и я пытаюсь скрыть вкладку меню в учетной записи пользователя для определенных пользователей на основе значения поля для пользователя.

У меня есть набор alterRoute.

пространство имен Drupal\mymodule\Routing;

используйте Drupal\Core\Routing\RouteSubscriberBase;
используйте Symfony\Component\Routing\RouteCollection;

/**
 * Слушает события динамического маршрута.
 */
класс RouteSubscriber расширяет RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  защищенная функция alterRoutes(RouteCollection $ collection) {
    // Изменить доступ для пути '/user/%/myprofile'.
    если ($ маршрут = $ коллекция-> получить ('profile.user_page.single')) {
      $route->setRequirement('_custom_access', 'Drupal\mymodule\Access\ProfileAccessCheck::access');
    }
  }

}

Я создал службы в файле mymodule.services.yml.

Сервисы:
  мой модуль.route_subscriber:
    класс: Drupal\mymodule\Routing\RouteSubscriber
    теги:
      - {имя: event_subscriber}
  мой модуль.profile_access_checker:
    класс: Drupal\mymodule\Access\ProfileAccessCheck
    теги:
      - {имя: access_check, apply_to: _custom_access}

А вот мой ProfileAccessCheck.php

пространство имен Drupal\mymodule\Access;

используйте Drupal\Core\Access\AccessResult;
используйте Drupal\Core\Routing\Access\AccessInterface;
используйте Drupal\Core\Session\AccountInterface;
используйте Symfony\Component\Routing\Route;
используйте Drupal\user\UserInterface;

/**
 * Проверяет, позволяет ли тип профиля использовать несколько профилей для каждого пользователя.
 */
класс ProfileAccessCheck реализует AccessInterface {

  /**
   * Проверяет доступ к одной/нескольким страницам.
   *
   * @param \Drupal\Core\Session\AccountInterface $account
   * Текущая учетная запись.
   * @param \Drupal\user\UserInterface $пользователь
   * Учетная запись пользователя.
   */
  доступ к общедоступной функции (AccountInterface $account, $user) {
    $user_access = $user->access('view', $account, TRUE);
    если (!$user_access->isAllowed()) {
      // Аккаунт не имеет доступа к канонической странице пользователя
      // ("/user/{user}"), также не разрешайте доступ ни к каким подстраницам.
      вернуть AccessResult::allowed();
    }

    if(!empty($account->field_pro_profile->getValue()) && $account->field_pro_profile->getValue() == 'Отключить') {
      вернуть AccessResult::forbidden();
    }
    вернуть AccessResult::allowed();
  }

}

У меня есть пара проблем. Во-первых, я получаю эту ошибку:

Ошибка: вызов функции-члена access() для строки в Drupal\mymodule\Access\ProfileAccessCheck->access() (строка 26 из modules/custom/mymodule/src/Access/ProfileAccessCheck.php).

Если я удалю этот доступ $пользователь->доступ строку, то я получаю эту ошибку:

Примечание: Неопределенное свойство: Drupal\Core\Session\AccountProxy::$field_pro_profile в Drupal\mymodule\Access\ProfileAccessCheck->access() (строка 26 модуля/custom/mymodule/src/Access/ProfileAccessCheck.php).

Я также получаю эту ошибку на некоторых других страницах, таких как страница включения/отключения модуля. /админ/модули:

RuntimeException: Callable "Drupal\mymodule\Access\ProfileAccessCheck::access" требует значения для аргумента "$user". в Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (строка 142 core/lib/Drupal/Component/Utility/ArgumentsResolver.php).

Почему я не могу получить доступ к пользовательскому объекту, что мне не хватает? Кроме того, кажется, что он переопределяет доступ из модуля профиля. Каков правильный способ убедиться, что я также вызываю исходную функцию доступа к модулю? Потому что он не возвращает вкладки, если я делаю AccessResult::neutral(); он скрывает все вкладки, которые соответствуют user/%/%

Jaypan avatar
флаг de
Я думаю, что объявление функции неверно и, вероятно, должно быть: `общедоступный доступ к функции (UserInterface $user, $profileType) {`.
No Sssweat avatar
флаг ua
`доступ к общедоступной функции (UserInterface $user, AccountInterface $account) {`
флаг ru
@Jaypan Да, я тоже пробовал. Это дает мне эту ошибку. ```RuntimeException: Callable "Drupal\mymodule\Access\ProfileAccessCheck::access" требует значения для аргумента "$profileType". в Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (строка 142 core/lib/Drupal/Component/Utility/ArgumentsResolver.php).```
флаг ru
@NoSssweat, это работает! Но я не могу получить доступ к $profileType. Мне нужно проверить это и убедиться, что это правильное значение в третьем аргументе, потому что он влияет на другие вкладки пользователя, помимо профиля. Я пытался добавить его в разных местах, и я получаю это ```RuntimeException: Callable "Drupal\mymodule\Access\ProfileAccessCheck::access" требует значения для аргумента "$profileType". в Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (строка 142 core/lib/Drupal/Component/Utility/ArgumentsResolver.php).```
liquidcms avatar
флаг us
У меня почти идентичный код для другой проблемы, и это функция доступа: доступ к общедоступной функции (UserInterface $user, AccountInterface $account) { вернуть AccessResult::forbidden(); } и по-прежнему получаю ту же ошибку: RuntimeException: Callable "Drupal\ssc_custom\Access\CommentReplyAccess::access" требует значения для аргумента "$user".

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

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