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;
/**
* Ascultă evenimentele dinamice ale traseului.
*/
clasa RouteSubscriber extinde RouteSubscriberBase {
/**
* {@inheritdoc}
*/
funcția protejată alterRoutes(RouteCollection $colecție) {
// Schimbați accesul pentru calea „/user/%/myprofile”.
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;
/**
* Verifică dacă tipul de profil permite mai multe profiluri per utilizator.
*/
clasa ProfileAccessCheck implementează AccessInterface {
/**
* Verifică accesul pentru paginile unice/multiple.
*
* @param \Drupal\Core\Session\AccountInterface $cont
* Contul conectat în prezent.
* @param \Drupal\user\UserInterface $user
* Contul de utilizator.
*/
acces la funcția publică (Interfață cont $cont, $utilizator) {
$user_access = $user->access('view', $cont, TRUE);
dacă (!$user_access->isAllowed()) {
// Contul nu are acces la pagina canonică a utilizatorului
// ("/user/{user}"), nu permite accesul nici la nicio subpagini.
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/%/%