Lấy bí danh đường dẫn từ NID (hoặc đối tượng nút)


22

Tôi có một đối tượng nút và tôi đang cố gắng sử dụng nó để có được một đường dẫn cụ thể trong Drupal 8.

drupal_lookup_path()trong Drupal 7 nhưng tôi không thấy bất kỳ tài liệu tương đương hoặc tài liệu nào cho Drupal 8.

Cách "Drupal" mới để nhận đường dẫn từ một đối tượng nút là gì?

Nó sẽ là một cái gì đó đơn giản như thế $node->get('path')nào?

Đây có vẻ là một câu hỏi đơn giản, nhưng tôi hoàn toàn không tìm thấy bất kỳ tài liệu nào về nó.

Lưu ý tôi không muốn bí danh đường dẫn cho đường dẫn hiện tại; Tôi muốn bí danh đường dẫn cho một nút tùy ý, được cung cấp một đối tượng nút hoặc ID nút.



Tôi nghĩ rằng đây có thể là một bản sao, kiểm tra câu hỏi liên kết có rất nhiều câu trả lời.
Kevin

Câu hỏi khác có câu trả lời cho biết làm thế nào để lấy bí danh đường dẫn cho đường dẫn hiện tại, không phải cho một nút mà OP biết ID nút.
kiamlaluno

Nó không phải là một bản sao - tôi không muốn con đường hiện tại. Tôi muốn đường dẫn được cung cấp một đối tượng nút tùy ý hoặc NID.
Jack Ryan

Vâng, đây không phải là một bản sao, xem câu trả lời của tôi.
4k4

Câu trả lời:


43

Để có được đường dẫn cho id nút, hãy sử dụng AliasManager :: getAliasByPath :

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);

3
Đúng, điều này có vẻ đúng và đơn giản hơn giải pháp của tôi. Cảm ơn bạn!
Jack Ryan

19

Điều gì về việc sử dụng Url :

use Drupal\Core\Url;    

...

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid])->toString();

5
IIRC, sự khác biệt chính giữa điều này và sử dụng AliasManager, là điều này cũng sẽ đảm bảo rằng các bộ xử lý đường dẫn bên ngoài chạy, trong khi AliasManager chỉ thực hiện tra cứu bí danh. Bạn cũng có thể lấy Urlđối tượng trực tiếp như $node->toUrl().
mpdon Arena

1
Giải pháp tốt hơn nhiều.
Patrick

16

Nếu bạn chỉ có nid, giải pháp 4k4 của

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);

Công trình tuyệt vời. Nhưng nếu bạn đã có một đối tượng nút, bạn có thể bỏ qua một hoặc hai bước. Các nút thực sự đã được xây dựng trong các phương thức để nhận url.

$node->toUrl()->toString();

Sẽ trả về url bí danh của nút.

toUrl () trả về một đối tượng url. Xem tại đây https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/ class / Url / 8.2.x

và toString () là một phương thức của đối tượng url trả về biểu diễn chuỗi của url.


9
Lưu ý rằng $node->toUrl()->setAbsolute()->toString()sẽ trả lại URL tuyệt đối, hữu ích cho việc chia sẻ, v.v.
Tim

2

Bạn cũng có thể sử dụng phương thức tải từ path.alias_storageđể trả về một mảng các chi tiết bí danh hoặc boolean false nếu không tìm thấy đường dẫn cho nút đó.

$aliasArray = \Drupal::service('path.alias_storage')->load(['source' => '/node/' . $nid]);


2

Cách tốt nhất để lấy URL nút từ đối tượng nút-

  • Đường dẫn tuyệt đối : $ node-> toUrl () -> setAbsolute () -> toString ();
  • Đường dẫn tương đối : $ node-> toUrl () -> toString ();

Nó cũng sẽ xử lý ngôn ngữ nút.


0

Nếu bạn muốn lấy url bí danh nút theo ngôn ngữ, đừng quên sử dụng ngôn ngữ như thế này.

$alias_url = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'. $nid, $langcode);

Nếu bạn đang sử dụng nó trong một lớp, đừng quên sử dụng đúng cách tiêm phụ thuộc.


-5

Tôi đã hy vọng cho một giải pháp "Drupalesque" hơn, nhưng đây là những gì tôi tự làm để thực hiện công việc:

  function getPathFromNID($nid) {
    $db = \Drupal::database();

    $data = $db
        ->select('url_alias', 'u')
        ->fields('u', ['alias'])
        ->condition('source', '/node/' . $nid)
        ->execute()
        ->fetchField();
    return $data;
  }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.