Puncte:1

Adăugați un apel invers personalizat la modulul de profil pentru a ascunde fila de meniu pentru anumiți utilizatori

drapel ru

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/%/%

Jaypan avatar
drapel de
Cred că declarația funcției este incorectă și ar trebui probabil să fie: `public function access(UserInterface $user, $profileType) {`.
No Sssweat avatar
drapel ua
`acces la funcția publică (UserInterface $user, AccountInterface $cont) {`
drapel ru
@Jaypan Da, am încercat și asta. Îmi dă această eroare. ```RuntimeException: apelabil „Drupal\mymodule\Access\ProfileAccessCheck::access” necesită o valoare pentru argumentul „$profileType”. în Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (linia 142 din core/lib/Drupal/Component/Utility/ArgumentsResolver.php).```
drapel ru
@NoSssweat care funcționează! Dar se pare că nu pot accesa $profileType. Trebuie să-l verific și să mă asigur că este valoarea corectă în al treilea argument, deoarece afectează alte file de utilizator în afară de profil. Am încercat să-l adaug în diferite locuri și primesc acest „RuntimeException: „Drupal\mymodule\Access\ProfileAccessCheck::access” care poate fi apelat necesită o valoare pentru argumentul „$profileType”. în Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (linia 142 din core/lib/Drupal/Component/Utility/ArgumentsResolver.php).```
liquidcms avatar
drapel us
Am un cod aproape identic pentru o altă problemă și aceasta este funcția de acces: public function access(UserInterface $user, AccountInterface $account) { returnează AccessResult::interzis(); } și încă primesc aceeași eroare: RuntimeException: apelabil „Drupal\ssc_custom\Access\CommentReplyAccess::access” necesită o valoare pentru argumentul „$user”.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.