Score:1

เพิ่มการเรียกกลับของ Access แบบกำหนดเองไปยังโมดูลโปรไฟล์เพื่อซ่อนแท็บเมนูสำหรับผู้ใช้บางราย

ธง ru

เรากำลังใช้ ประวัติโดยย่อ โมดูล และฉันกำลังพยายามซ่อนแท็บเมนูในบัญชีของผู้ใช้สำหรับผู้ใช้บางรายตามค่าของฟิลด์ผู้ใช้

ฉันมีชุด alterRoute

เนมสเปซ Drupal\mymodule\Routing;

ใช้ Drupal\Core\Routing\RouteSubscriberBase;
ใช้ Symfony\Component\Routing\RouteCollection;

/**
 * ฟังเหตุการณ์เส้นทางแบบไดนามิก
 */
คลาส RouteSubscriber ขยาย RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันที่ได้รับการป้องกัน alterRoutes (RouteCollection $collection) {
    // เปลี่ยนการเข้าถึงสำหรับเส้นทาง '/user/%/myprofile'
    ถ้า ($route = $collection->get('profile.user_page.single')) {
      $route->setRequirement('_custom_access', 'Drupal\mymodule\Access\ProfileAccessCheck::access');
    }
  }

}

ฉันได้สร้างบริการในไฟล์ mymodule.services.yml

บริการ:
  mymodule.route_subscriber:
    คลาส: Drupal\mymodule\Routing\RouteSubscriber
    แท็ก:
      - { ชื่อ: event_subscriber }
  mymodule.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 $บัญชี
   * บัญชีที่เข้าสู่ระบบในปัจจุบัน
   * @param \Drupal\user\UserInterface $user
   * บัญชีผู้ใช้
   */
  การเข้าถึงฟังก์ชั่นสาธารณะ (AccountInterface $account, $user) {
    $user_access = $user->access('ดู', $account, TRUE);
    ถ้า (!$user_access->ได้รับอนุญาต()) {
      // บัญชีไม่สามารถเข้าถึงหน้าบัญญัติของผู้ใช้
      // ("/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)

ถ้าฉันลบการเข้าถึงนั้น $user->การเข้าถึง บรรทัดแล้วฉันได้รับข้อผิดพลาดนี้:

ประกาศ: คุณสมบัติที่ไม่ได้กำหนด: Drupal\Core\Session\AccountProxy::$field_pro_profile ใน Drupal\mymodule\Access\ProfileAccessCheck->access() (บรรทัดที่ 26 ของ modules/custom/mymodule/src/Access/ProfileAccessCheck.php)

ฉันยังได้รับข้อผิดพลาดนี้ในหน้าอื่นๆ บางหน้า เช่น หน้าเปิด/ปิดโมดูล /ผู้ดูแลระบบ/โมดูล:

RuntimeException: "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 flag
ฉันคิดว่าการประกาศฟังก์ชันไม่ถูกต้องและควรเป็น: `public function access(UserInterface $user, $profileType) {`
No Sssweat avatar
ua flag
`การเข้าถึงฟังก์ชันสาธารณะ (UserInterface $user, AccountInterface $account) {`
ru flag
@Jaypan ใช่ ฉันก็พยายามแล้วเหมือนกัน มันทำให้ฉันมีข้อผิดพลาดนี้ ``` RuntimeException: "Drupal\mymodule\Access\ProfileAccessCheck::access" ที่เรียกได้ต้องใช้ค่าสำหรับอาร์กิวเมนต์ "$profileType" ใน Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (บรรทัดที่ 142 ของ core/lib/Drupal/Component/Utility/ArgumentsResolver.php).```
ru flag
@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 flag
ฉันมีรหัสที่เหมือนกันเกือบทั้งหมดสำหรับปัญหาที่แตกต่างกัน และนี่คือฟังก์ชันการเข้าถึง: การเข้าถึงฟังก์ชันสาธารณะ (UserInterface $user, AccountInterface $account) { กลับ AccessResult::forbidden(); } และยังคงได้รับข้อผิดพลาดเดียวกัน: RuntimeException: Callable "Drupal\ssc_custom\Access\CommentReplyAccess::access" ต้องการค่าสำหรับอาร์กิวเมนต์ "$user"

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา