Điểm:-2

Chỉnh sửa liên kết "Gửi tin nhắn riêng tư" để bao gồm tên người dùng

lá cờ in
j0e

tôi đang sử dụng Tin nhắn riêng phiên bản mô-đun 8.x-2.0-beta16 và tôi muốn thay đổi thông báo từ 'Gửi tin nhắn riêng' đến 'Gửi tin nhắn riêng tới @username' sẽ hiển thị tên người dùng từ trang của người dùng mà chúng tôi đang truy cập và liên hệ.

Mô-đun sử dụng đoạn mã sau.

'#title' => t('Gửi tin nhắn riêng'),

Có cách nào để ghi đè trực tiếp dòng này và chèn tên người dùng không? Tôi đã cố gắng mà không thành công.

Mã có liên quan được đặt tại: private_message\src\Service\PrivateMessageService.php#L336-382.

chức năng công cộng createRenderablePrivateMessageThreadLink(mảng &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) {
  if ($display->getComponent('private_message_link')) {
    if ($entity instanceof UserInterface) {
      $tác giả = $thực thể;
    }
    khác {
      $author = $entity->getOwner();
    }
    $current_user = \Drupal::currentUser();
    if ($current_user->isAuthenticated()) {
      if ($current_user->hasPermission('sử dụng hệ thống nhắn tin riêng tư') && $current_user->id() != $author->id()) {
        $members = [$current_user, $author];
        $thread_id = $this->mapper->getThreadIdForMembers($members);
        nếu ($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' => 'liên kết',
            '#url' => $url,
            '#title' => t('Gửi tin nhắn riêng'),
            '#prefix' => '<div class="private_message_link_wrapper">',
            '#suffix' => '</div>',
          ];
        }
        khác {
          $url = Url::fromRoute('private_message.private_message_create', [], ['query' => ['recipient' => $author->id()]]);
          $build['private_message_link'] = [
            '#type' => 'liên kết',
            '#url' => $url,
            '#title' => t('Gửi tin nhắn riêng'),
            '#prefix' => '<div class="private_message_link_wrapper">',
            '#suffix' => '</div>',
          ];
        }
      }
    }
    khác {
      $url = Url::fromRoute('user.login');
      $build['private_message_link'] = [
        '#type' => 'liên kết',
        '#url' => $url,
        '#title' => t('Gửi tin nhắn riêng'),
        '#prefix' => '<div class="private_message_link_wrapper">',
        '#suffix' => '</div>',
      ];
    }
  }   
}
sonfd avatar
lá cờ in
Đừng hack một mô-đun. Tạo một bản vá với thay đổi của bạn và áp dụng nó với nhà soạn nhạc.
j0e avatar
lá cờ in
j0e
Tôi không ngại vá lỗi thay vì hack. Nhưng câu hỏi vẫn còn...
leymannx avatar
lá cờ ne
Bạn không thể xử lý trước liên kết rồi kiểm tra `$variables['element']['#prefix'] === '
sonfd avatar
lá cờ in
Có, hoặc thậm chí bạn có thể ghi đè lên dịch vụ và mở rộng phương thức này. Xem [Cách ghi đè dịch vụ](https://drupal.stackexchange.com/questions/292562/how-to-override-a-service).
Điểm:2
lá cờ in

Tôi nghĩ bạn đang hỏi, "Làm cách nào tôi có thể tạo chuỗi đã dịch 'Gửi tin nhắn riêng tới @tên người dùng' trong đó @tên người dùng được thay thế bằng tên của người dùng hiện đang được xem?"

Nếu bạn đang xem trang của người dùng, bạn có thể thực hiện việc này như sau:

// Nhận đối tượng người dùng hiện đang được xem từ các tham số tuyến đường.
$user = \Drupal::routeMatch()->getParameter('user');
// Nếu chúng ta có một đối tượng người dùng hợp lệ.
if ($user instanceof Drupal\user\Entity\User) {
  $message = t('Gửi tin nhắn riêng tới @username', [
    '@username' => $user->getDisplayName(),
  ]);
}

Tuy nhiên, nhìn vào mã cụ thể mà bạn đã đăng, bạn không được đảm bảo có mặt trên trang của người dùng. Ngoài ra, người dùng sẽ nhận được tin nhắn đã được xác định và lưu trữ trong $tác giả:

// I E. trang của người dùng.
if ($entity instanceof UserInterface) {
  $tác giả = $thực thể;
}
// I E. một nút hoặc thực thể khác được ủy quyền bởi người dùng.
khác {
  $author = $entity->getOwner();
}

Trong trường hợp này, bạn chỉ có thể sử dụng một cái gì đó như:

$message = t('Gửi tin nhắn riêng tới @username', [
  '@username' => $author->getDisplayName(),
]);
leymannx avatar
lá cờ ne
Vẫn là câu hỏi làm thế nào họ có được nó để ghi đè lên tin nhắn hiện tại. Có lẽ họ nên mở yêu cầu tính năng và cung cấp bản vá/MR với mã bạn đã đề xuất.
sonfd avatar
lá cờ in
Đồng ý, chắc chắn không hack mô-đun. Như chúng tôi đã đề cập ở trên, tôi nghĩ các tùy chọn là 1. Tạo sự cố/đăng bản vá lên d.o và áp dụng với nhà soạn nhạc. 2. Xử lý trước liên kết và thực hiện logic ở đó. 3. Ghi đè dịch vụ và mở rộng lớp của nó để ghi đè chỉ một phương thức này để thay đổi văn bản liên kết.
leymannx avatar
lá cờ ne
Ồ vâng, ghi đè dịch vụ, thậm chí còn tốt hơn.
j0e avatar
lá cờ in
j0e
Cảm ơn @sonfd. Tôi không nhận thấy biến $author.Tôi đã làm được điều này dựa trên giải pháp thứ ba của bạn, thay thế dòng #title bằng: `'#title' => t('Send private message to @username', ['@username' => $author->getDisplayName() ]),`
sonfd avatar
lá cờ in
@j0e - Tuyệt vời! Tôi chắc chắn khuyên bạn ít nhất nên tạo một bản vá cho thay đổi của bạn và nhờ nhà soạn nhạc áp dụng nó. Trình soạn thảo sẽ cố gắng áp dụng lại bản vá khi bạn cập nhật mô-đun để thay đổi của bạn được giữ nguyên (nếu không thể áp dụng bản vá thì trình soạn thảo sẽ cho bạn biết nó không thành công để bạn có thể sửa nó). Như leymannx đã nói ở trên, bạn cũng có thể đăng dưới dạng FR trên drupal.org (tôi sẽ làm vậy), nhưng điều đó tùy thuộc vào bạn :)

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.