2016-02-14 19 views
12

Tôi đang kiểm tra Drupal 8 và cố tạo liên kết dựa trên ID nút của một bài viết. Trong Drupal 7, nó giống như sau:Tạo liên kết từ ID nút trong Drupal 8

$options = array('absolute' => TRUE); 
$nid = 1; // Node ID 
$url = url('node/' . $nid, $options); 

Kết quả này thành một liên kết tuyệt đối với đúng url-bí danh.

Vì vậy, hàm url() - dường như không còn được dùng nữa; cách Drupal-8 là gì? Trông giống như một chức năng thực sự cơ bản đối với tôi nhưng tôi không thể tìm thấy bất kỳ tài liệu tham khảo hữu ích nào.

Trả lời

23

Bạn cần sử dụng lớp \Drupal\Core\Url, cụ thể là phương thức tĩnh fromRoute. Drupal 8 sử dụng các tuyến đường có tên khác với đường dẫn URL thực tế của chúng. Trong trường hợp của bạn, tuyến đường sử dụng là tuyến đường chính tắc cho một thực thể nút: entity.node.canonical. \Drupal\Core\Url::fromRoute() sẽ không trả về một chuỗi, mà là một đối tượng. Để nhận URL dưới dạng chuỗi, bạn cần gọi phương thức toString() của nó.

$options = ['absolute' => TRUE]; 
$url = \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 1], $options); 
$url = $url->toString(); 

Phương pháp tĩnh không dễ dàng kiểm tra được, $url->toString() yêu cầu vùng chứa được khởi tạo. Bạn có thể thay thế phương thức tĩnh bằng cách gọi tới UrlGeneratorInterface::generateFromRoute() trên dịch vụ url_generator.

$options = ['absolute' => TRUE]; 
$url = $this->url_generator->generateFromRoute('entity.node.canonical', ['node' => 1], $options); 
$url = $url->toString(); 

Thật không may, phương pháp này được đánh dấu là @internal vì vậy bạn không được phép sử dụng nó trong mã người dùng (ví dụ. Bên ngoài Drupal core).

+0

điều này đã làm cho tôi. cảm ơn vì đoạn trích! nếu một bí danh được định nghĩa tôi có được bí danh, nếu không tôi nhận được liên kết với .../node/id. – Nicensin

+0

Bạn có thể giải thích cách sử dụng nó không? Tôi đã thay đổi/thêm mã ở đâu? Trong chủ đề> tiền xử lý? Url.php hoặc Core? Thật khó để tìm câu trả lời toàn cầu khi chúng tôi bắt đầu Drupal .. –

+1

@PaulLeclerc Bạn không bao giờ nên thay đổi thứ gì đó trong lõi giống như một lưu ý chung. Bạn có thể sử dụng các ví dụ mã ở trên bất cứ nơi nào bạn cần. Nó hoạt động trong mọi tập tin mà bạn có thể sử dụng php. Chúng tôi rõ ràng không thể trả lời câu hỏi này cho bạn vì chúng tôi không biết bạn muốn làm gì. – Nicensin

-1

Bạn cần sử dụng lớp Drupal\Core\Url;.

$url= Url::fromRoute('root', $route_parameters=array()); 

$link = \Drupal::l(t('label'), $url); 

Ví dụ:

Nếu bạn vượt qua lập luận

$url = Url::fromRoute('test.page', $route_parameters = array('test' => 1)); 

Nếu không

$url = Url::fromRoute('test.page'); 
$link = \Drupal::l(t('Label'), $url); 
+1

OP yêu cầu cụ thể cho URL nút từ ID id, câu trả lời này chưa hoàn thành0 Ngoài ra, OP yêu cầu URL tuyệt đối (trên mỗi mã gốc), câu trả lời này không tạo URL tuyệt đối. Cuối cùng, '\ Drupal :: l()' không được dùng nữa, thay vào đó hãy sử dụng 'Link :: fromTextAndUrl()'. –

2

Tạo URL tuyệt đối:

$options = ['absolute' => TRUE]; 
$url_object = Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => $nid], $options); 
// will output http://example.com/path-to-my-node 

Tạo liên kết đối tượng tuyệt đối:

$options = ['absolute' => TRUE, 'attributes' => ['class' => 'this-class']]; 
$node_title = Drupal\Core\Render\Markup::create('<span>' . $node_title . '</span>'); 
$link_object = Drupal\Core\Link::createFromRoute($node_title, 'entity.node.canonical', ['node' => $nid], $options); 
// will output <a href="http://example.com/path-to-my-node" class="this-class"><span>My Node's Title</span></a> 
0

hehe, đây là shit về nhận URL từ trường (Twig phiên bản của nhận rằng URL)

Nếu bạn muốn URL (và tiêu đề) đó là trong một lĩnh vực mà bạn có để có được đối tượng của lớp: Drupal \ lõi \ Url

Nếu bạn có các nút bằng drupal_entity (Twig Tweaks) sau đó bạn có: (tôi sẽ sử dụng "tab" như nút đó) . Tab [ '# nút'] field_link

này mang đến cho bạn bằng cách sử dụng:

tab [ '# nút'] field_link..uri -> URI (URI không phải là URL)

tab [ '# nút'] field_link.title -.> tiêu đề

nhưng, đó không phải là kết thúc.

nó tốt hơn để acess Drupal \ liên kết \ Plugin \ Dòng \ FieldType \ LinkItem bởi:.

tab [ '# nút'] field_link.get (0)

tab [ '#node'] field_link [0]

(cả hai làm tương tự)

sau đó bạn có thể truy cập những gì thú vị nhất:.

tab ['# nút']. Field_tab_link [0] .getUrl() một đối tượng Drupal \ Core \ Url.

Bạn có thể truy cập vào đối tượng này cũng bằng cách sử dụng dòng này bên dưới, từ bên trong đó là nút mẫu file: content.field_link [0] [ '# url'] (đây cũng là Drupal \ Lõi \ đối tượng Url)

đối tượng đó có phương pháp:

  • isExternal() -> là liên kết với bên ngoài (ví dụ http://cnn.com.)
  • isRouted() -> được liên kết đến bên trong trang web của bạn
  • getRouteName() -> Tên của tuyến đường
  • getRouteParameters() -> mang đến cho bạn một mảng các giá trị, đây (chúng tôi lấy ID của nút đó), bạn sẽ phải [ 'nút' => ID]

bạn nên sử dụng nó như thế:

{% set tabURL = tab['#node'].field_link[0].getUrl() %} 

{% if tabURL.isExternal() %} 
    {% set link_path = tab['#node'].field_tab_link.uri %} 

{% elseif tabURL.isRouted() %} 
    {% set link_path = path(tabURL.getRouteName(), tabURL.getRouteParameters()) %} {# /node/12 #} 

{% endif %} 
2

Trong trường hợp bạn đã nạp đầy đủ đối tượng nút bạn chỉ có thể gọi $node->toUrl() để có được URL yêu cầu. Theo mặc định, nó trả về URL chuẩn cho một nút (nút/NID) nhưng có thể tạo các URL khác được liệt kê trong định nghĩa đối tượng Nút (xem Drupal \ node \ Entity \ Node.php). Tương tự đối với các loại thực thể khác.

$options = ['absolute' => TRUE]; 
$view_link = Link::fromTextAndUrl(t('View'), $node->toUrl('canonical', $options)); 
$edit_link = Link::fromTextAndUrl(t('Edit'), $node->toUrl('edit-form', $options)); 
$delete_link = Link::fromTextAndUrl(t('Delete'), $node->toUrl('delete-form', $options)); 
Các vấn đề liên quan