Score:-2

แก้ไขลิงก์ "ส่งข้อความส่วนตัว" เพื่อรวมชื่อผู้ใช้

ธง in
j0e

ฉันกำลังใช้ ข้อความส่วนตัว โมดูลเวอร์ชัน 8.x-2.0-beta16 และฉันต้องการเปลี่ยนข้อความจาก 'ส่งข้อความส่วนตัว' ถึง 'ส่งข้อความส่วนตัวถึง @ชื่อผู้ใช้' ซึ่งควรแสดงชื่อผู้ใช้จากหน้าของผู้ใช้ที่เราเยี่ยมชมและติดต่อ

โมดูลใช้รหัสต่อไปนี้

'#title' => t('ส่งข้อความส่วนตัว'),

มีวิธีแทนที่บรรทัดนี้โดยตรงและใส่ชื่อผู้ใช้หรือไม่? ฉันพยายามไม่สำเร็จ

รหัสที่เกี่ยวข้องอยู่ใน: private_message\src\Service\PrivateMessageService.php#L336-382.

ฟังก์ชันสาธารณะ createRenderablePrivateMessageThreadLink (อาร์เรย์ &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) {
  ถ้า ($display->getComponent('private_message_link')) {
    ถ้า (อินสแตนซ์ $entity ของ UserInterface) {
      $author = $entity;
    }
    อื่น {
      $author = $entity->getOwner();
    }
    $current_user = \Drupal::currentUser();
    ถ้า ($current_user->isAuthenticated()) {
      ถ้า ($current_user->hasPermission('ใช้ระบบส่งข้อความส่วนตัว') && $current_user->id() != $author->id()) {
        $members = [$current_user, $ผู้เขียน];
        $thread_id = $this->mapper->getThreadIdForMembers($members);
        ถ้า ($thread_id) {
          $url = Url::fromRoute('entity.private_message_thread.canonical', ['private_message_thread' => $thread_id], ['attributes' => ['class' => ['private_message_link']]]);
          $build['private_message_link'] = [
            '#type' => 'ลิงค์',
            '#url' => $url,
            '#title' => t('ส่งข้อความส่วนตัว'),
            '#prefix' => '<div class="private_message_link_wrapper">',
            '#suffix' => '</div>',
          ];
        }
        อื่น {
          $url = Url::fromRoute('private_message.private_message_create', [], ['query' => ['recipient' => $author->id()]]);
          $build['private_message_link'] = [
            '#type' => 'ลิงค์',
            '#url' => $url,
            '#title' => t('ส่งข้อความส่วนตัว'),
            '#prefix' => '<div class="private_message_link_wrapper">',
            '#suffix' => '</div>',
          ];
        }
      }
    }
    อื่น {
      $url = Url::fromRoute('user.login');
      $build['private_message_link'] = [
        '#type' => 'ลิงค์',
        '#url' => $url,
        '#title' => t('ส่งข้อความส่วนตัว'),
        '#prefix' => '<div class="private_message_link_wrapper">',
        '#suffix' => '</div>',
      ];
    }
  }   
}
sonfd avatar
in flag
อย่าแฮ็กโมดูล สร้างแพทช์ด้วยการเปลี่ยนแปลงของคุณและใช้กับนักแต่งเพลง
j0e avatar
in flag
j0e
ฉันไม่รังเกียจที่จะแก้ไขแทนการแฮ็ค แต่คำถามยังคงอยู่...
leymannx avatar
ne flag
คุณไม่สามารถประมวลผลลิงก์ล่วงหน้าแล้วตรวจสอบ `$variables['element']['#prefix'] === '
sonfd avatar
in flag
ได้ หรือคุณสามารถแทนที่บริการและขยายวิธีการนี้ได้ ดู[วิธีการแทนที่บริการ](https://drupal.stackexchange.com/questions/292562/how-to-override-a-service)
Score:2
ธง in

ฉันคิดว่าคุณกำลังถามว่า "ฉันจะสร้างสตริงที่แปลแล้ว 'ส่งข้อความส่วนตัวถึง @ชื่อผู้ใช้' ได้อย่างไร โดยที่ @ชื่อผู้ใช้ จะถูกแทนที่ด้วยชื่อของผู้ใช้ที่กำลังดูอยู่"

หากคุณกำลังดูหน้าของผู้ใช้ คุณสามารถทำได้ดังนี้:

// รับวัตถุผู้ใช้ที่กำลังดูจากพารามิเตอร์เส้นทาง
$user = \Drupal::routeMatch()->getParameter('ผู้ใช้');
// ถ้าเรามีวัตถุผู้ใช้ที่ถูกต้อง
ถ้า ($user อินสแตนซ์ของ Drupal\user\Entity\User) {
  $message = t('ส่งข้อความส่วนตัวถึง @ชื่อผู้ใช้', [
    '@ชื่อผู้ใช้' => $user->getDisplayName(),
  ]);
}

อย่างไรก็ตาม เมื่อพิจารณาจากรหัสเฉพาะที่คุณโพสต์แล้ว เราไม่รับประกันว่าคุณจะอยู่ในหน้าของผู้ใช้ นอกจากนี้ ผู้ใช้ที่จะได้รับข้อความถูกกำหนดและจัดเก็บไว้ในนั้นแล้ว ผู้เขียน $:

// เช่น. หน้าของผู้ใช้
ถ้า (อินสแตนซ์ $entity ของ UserInterface) {
  $author = $entity;
}
// เช่น. โหนดหรือเอนทิตีอื่นที่เขียนโดยผู้ใช้
อื่น {
  $author = $entity->getOwner();
}

ในกรณีนี้ คุณสามารถใช้บางอย่างเช่น:

$message = t('ส่งข้อความส่วนตัวถึง @ชื่อผู้ใช้', [
  '@ชื่อผู้ใช้' => $author->getDisplayName(),
]);
leymannx avatar
ne flag
ยังคงเป็นคำถามว่าพวกเขาลบล้างข้อความปัจจุบันได้อย่างไร บางทีพวกเขาควรเปิดคำขอคุณลักษณะและให้โปรแกรมแก้ไข/MR พร้อมรหัสที่คุณแนะนำ
sonfd avatar
in flag
เห็นด้วย ห้ามแฮ็กโมดูลเด็ดขาด ดังที่เรากล่าวไว้ข้างต้น ฉันคิดว่าตัวเลือกคือ 1. สร้างปัญหา / โพสต์แพตช์ไปที่ d.o และใช้กับนักแต่งเพลง 2. ประมวลผลลิงก์ล่วงหน้าและทำตรรกะที่นั่น 3. แทนที่บริการและขยายคลาสเพื่อแทนที่วิธีเดียวนี้เพื่อแก้ไขข้อความลิงก์
leymannx avatar
ne flag
โอ้ใช่ การเอาชนะบริการที่ดียิ่งขึ้น
j0e avatar
in flag
j0e
ขอบคุณ @sonfd ฉันไม่ได้สังเกต $author ตัวแปรฉันทำให้มันทำงานตามโซลูชันที่สามของคุณ โดยแทนที่บรรทัด #title ด้วย: `'#title' => t('Send private message to @username', ['@username' => $author->getDisplayName() ]),`
sonfd avatar
in flag
@j0e - เยี่ยมมาก! ฉันแนะนำอย่างแน่นอน อย่างน้อยให้ทำแพตช์สำหรับการเปลี่ยนแปลงของคุณและให้ผู้แต่งนำไปใช้ นักแต่งเพลงจะพยายามใช้แพตช์อีกครั้งเมื่อคุณอัปเดตโมดูล เพื่อให้การเปลี่ยนแปลงของคุณยังคงอยู่ (หากใช้แพตช์ไม่ได้ นักแต่งเพลงจะแจ้งให้คุณทราบว่าล้มเหลว ดังนั้นคุณจึงสามารถแก้ไขได้) อย่างที่ leymannx กล่าวไว้ข้างต้น คุณสามารถโพสต์เป็น FR บน drupal.org ได้เช่นกัน (ฉันจะทำ) แต่นั่นขึ้นอยู่กับคุณ :)

โพสต์คำตอบ

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