Noi folosim Profil modul și încerc să ascund fila de meniu din contul utilizatorului pentru anumiți utilizatori pe baza valorii unui câmp de pe utilizator.
Am setat alterRoute.
spațiu de nume Drupal\mymodule\Routing;
utilizați Drupal\Core\Routing\RouteSubscriberBase;
utilizați Symfony\Component\Routing\RouteCollection;
clasa RouteSubscriber extinde RouteSubscriberBase {
funcția protejată alterRoutes(RouteCollection $colecție) {
dacă ($rută = $colecție->get('profil.user_page.single')) {
$route->setRequirement('_custom_access', 'Drupal\mymodule\Access\ProfileAccessCheck::access');
}
}
}
Am creat serviciile în fișierul mymodule.services.yml.
Servicii:
mymodule.route_subscriber:
clasa: Drupal\mymodule\Routing\RouteSubscriber
Etichete:
- { nume: event_subscriber }
mymodule.profile_access_checker:
clasa: Drupal\mymodule\Access\ProfileAccessCheck
Etichete:
- { name: access_check, applies_to: _custom_access }
Și aici este ProfileAccessCheck.php meu
spațiu de nume Drupal\mymodule\Access;
utilizați Drupal\Core\Access\AccessResult;
utilizați Drupal\Core\Routing\Access\AccessInterface;
utilizați Drupal\Core\Session\AccountInterface;
utilizați Symfony\Component\Routing\Route;
utilizați Drupal\user\UserInterface;
clasa ProfileAccessCheck implementează AccessInterface {
acces la funcția publică (Interfață cont $cont, $utilizator) {
$user_access = $user->access('view', $cont, TRUE);
dacă (!$user_access->isAllowed()) {
returnează AccessResult::allowed();
}
if(!empty($account->field_pro_profile->getValue()) && $account->field_pro_profile->getValue() == 'Dezactivare') {
returnează AccessResult::interzis();
}
returnează AccessResult::allowed();
}
}
Am câteva probleme. În primul rând, primesc această eroare:
Eroare: Apelarea unei funcții membre access() pe șir în Drupal\mymodule\Access\ProfileAccessCheck->access() (linia 26 din modules/custom/mymodule/src/Access/ProfileAccessCheck.php).
Dacă elimin acel acces $user->acces
linie apoi primesc această eroare:
Notă: Proprietate nedefinită: Drupal\Core\Session\AccountProxy::$field_pro_profile în Drupal\mymodule\Access\ProfileAccessCheck->access() (linia 26 din modules/custom/mymodule/src/Access/ProfileAccessCheck.php).
De asemenea, primesc această eroare pe alte pagini, cum ar fi pagina de activare/dezactivare a modulului /admin/module
:
RuntimeException: apelabil „Drupal\mymodule\Access\ProfileAccessCheck::access” necesită o valoare pentru argumentul „$user”. în Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (linia 142 din core/lib/Drupal/Component/Utility/ArgumentsResolver.php).
De ce nu pot accesa obiectul utilizator, ce îmi lipsește? De asemenea, pare să suprascrie accesul din modulul de profil. Care este modalitatea corectă de a mă asigura că apelez și funcția de acces la modulul original? Pentru că nu returnează file dacă fac AccessResult::neutral(); ascunde toate filele care se potrivesc cu user/%/%