Làm cách nào để tạo liên kết?


26

Nói rằng tôi đang mở rộng blockBaseLớp để tạo một khối tùy chỉnh và tôi đang triển khai blockBuildphương thức để tạo một số đánh dấu cho khối của mình. Một cái gì đó như thế này:

 class YourModuleBlock extends BlockBase {

   /**
     * Implements \Drupal\block\BlockBase::blockBuild().
     */
     public function build() {
      return array(
        '#markup' => 'This is a block!',
      );
     }
   }

Nếu tôi muốn cung cấp một liên kết trong đánh dấu này, trong D7 tôi đã sử dụng lchức năng này, nhưng điều này không còn nữa ( xem tại đây ). Vì vậy, tôi cần cung cấp phương thức D8 mới để tạo liên kết. Tôi chỉ có thể sử dụng một <a>thẻ, nhưng điều này chưa bao giờ được thực hiện tốt nhất trong D7.

Vì vậy, phương pháp phù hợp để sử dụng để tạo liên kết là gì và làm cách nào để cung cấp cho chức năng của tôi?


Vui lòng kiểm tra liên kết bên dưới có tất cả các loại ví dụ để tạo liên kết trong drupal 8 gist.github.com/r-daneelolivaw/b420b3dc0c40a6cacf76
Swapnil Bijwe

Câu trả lời:


56

\ Drupal :: l không được dùng nữa. Có lẽ trường hợp này sẽ hữu ích cho ai đó

  use Drupal\Core\Url;
  use Drupal\Core\Link;
  $url = Url::fromRoute('entity.node.edit_form', array('node' => NID));
  $project_link = Link::fromTextAndUrl(t('Open Project'), $url);
  $project_link = $project_link->toRenderable();
  // If you need some attributes.
  $project_link['#attributes'] = array('class' => array('button', 'button-action', 'button--primary', 'button--small'));
  print render($project_link);

2
Đây toRenderable()Bí quyết là rất hữu ích, cảm ơn!
Nic

Vẫn hoạt động trên lõi Drupal 8.4
podarok

Xin lỗi, bạn đã cứu mạng tôi bằng cái này, tôi mới biết về Drupal và đã có thể tìm ra cách thay đổi cột tên mô-đun Nhóm để trỏ đến các nút nhờ vào điều này!
Mike Q

24

Một, điều này không hoàn thành 100%, xem vấn đề này . Như đã nói, hãy để tôi trích dẫn một số mã từ thông báo thay đổi :

Drupal 7:

// Internal path.
$internal_link = l(t('Book admin'), 'admin/structure/book');

// External Uri.
$external_link = l(t('External link'), 'http://www.example.com/', array('external' => TRUE));

Drupal 8:

// Internal path (defined by a route in Drupal 8).
use Drupal\Core\Url;
$url = Url::fromRoute('book.admin');
$internal_link = \Drupal::l(t('Book admin'), $url);

// External Uri.
use Drupal\Core\Url;
$url = Url::fromUri('http://www.example.com/');
$external_link = \Drupal::l(t('External link'), $url);

Chỉnh sửa: tên tuyến đường có trong các moduledirectory/modulename.routing.ymltệp và (theo mặc định) trong {router}bảng.


2
Tôi đã tìm thấy $ router_name trong bảng {router}.
24ma13wg

1
Làm thế nào tôi có thể tạo liên kết cho trang trước. Trong drupal 7, nó có thể là l ('home', '<front>'). Nhưng còn trong drupal 8 thì sao?

fromRoute('<front>')

7
\ Drupal :: l không được dùng nữa. Thay vào đó, hãy sử dụng \ Drupal \ Core \ Link :: fromTextAndUrl ($ text, $ url)
Eyal


21

Một tùy chọn khác là tạo một liên kết trong một mảng render

$url = Url::fromRoute('entity.node.edit_form', array('node' => NID));
$link = [
  '#type' => 'link',
  '#url' => $url,
  '#title' => t('This link was rendered')
];

Drupal cung cấp cho chúng ta một số phương thức trợ giúp để tạo các url và liên kết đến các thực thể.

$url = Node::load(NID)->toUrl('edit-form');

$link = Node::load(NID)->toLink(t('link text'), 'edit-form');
$link_render_array = $link->toRenderable();

Tôi thích câu trả lời này tốt nhất. Ngoài ra #attributescó thể được thêm vào bởi vì đây là một RenderE bổ sung .
mradcliffe


Tôi không thể chỉnh sửa nó vì tôi đã chờ quá lâu.
mradcliffe

19

Dưới đây là một số ví dụ về việc tạo liên kết trong Drupal 8. Lưu ý rằng $ this-> t ('some text') có sẵn trong các khối mở rộng BlockBase. Nếu bạn sao chép chúng sang một lớp khác không có hoặc sử dụng chúng trong tệp .module, bạn có thể cần phải thay đổi chúng thành t () 1 .

Liên kết cơ bản đến một nút:

$node = Node::load($nid);
$build['node_link'] = $node->toLink()->toRenderable();

Điều này tạo ra một mảng render như thế này:

$link = [
  '#type' => 'link',
  '#url' => $url_object,
  '#title' => 'Title of Node',
];

Bạn có thể tạo mảng kết xuất mà không cần tải nút theo cách này:

$url_object = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$link = [
  '#type' => 'link',
  '#url' => $url_object,
  '#title' => $this->t('Read More'),
];

Hoặc sử dụng lớp Liên kết lõi:

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Nếu bạn muốn sử dụng đánh dấu trong văn bản của liên kết của mình, bạn không thể chỉ cần đặt một chuỗi. Bạn cần sử dụng một phần tử mảng kết xuất:

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$link_text =  [
  '#type' => 'html_tag',
  '#tag' => 'span',
  '#value' => $this->t('Load More'),
];
$link = Link::fromTextAndUrl($link_text, $url);

Để tạo một liên kết tuyệt đối, bạn thêm tùy chọn này vào URL, không phải liên kết:

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid], ['absolute' => TRUE]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Để thêm một lớp vào liên kết của bạn, bạn cũng cần thêm lớp này vào URL, không phải liên kết:

$options = [
  'attributes' => [
    'class' => [
      'read-more-link',
    ],
  ],
];
$url = Url::fromRoute('entity.node.canonical', ['node' => $nid], $options);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Để thêm một chuỗi truy vấn vào liên kết của bạn, bạn cũng cần phải vào chuỗi này, không phải liên kết:

$options = [
  'query' => [
    'car' => 'BMW',
    'model' => 'mini-cooper',
  ],
  'attributes' => [
    'class' => [
      'read-more-link',
    ],
  ],
];
$url = Url::fromRoute('entity.node.canonical', ['node' => $nid], $options);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Để đặt liên kết mở trong cửa sổ mới với target = _blank:

$options = [
  'attributes' => [
    'target' => '_blank'
  ],
];
$url = Url::fromRoute('entity.media.edit_form', ['media' => $entity->id()], $options);
$link = Link::fromTextAndUrl(t('Edit'), $url);
$form['entity']['edit_link'] = $link->toRenderable();

Đây là một liên kết đến một trang thuật ngữ phân loại:

$url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term' => $tid]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Đây là một liên kết đến trang chỉnh sửa nút:

$url = Url::fromRoute('entity.node.edit_form', ['node' => $nid]);
$link = Link::fromTextAndUrl($this->t('Edit'), $url);
$build['read_more'] = $link->toRenderable();

Để tạo một liên kết bên ngoài:

$url = Url::fromUri('http://www.example.com/');
$link = Link::fromTextAndUrl($this->t('Vist this example site'), $url);
$build['external_link'] = $link->toRenderable();

Liên kết đến trang chủ:

$url = Url::fromRoute('<front>');
$link = Link::fromTextAndUrl($this->t('Home'), $url);
$build['homepage_link'] = $link->toRenderable();

Lưu ý rằng trên bất kỳ đối tượng url nào, bạn có thể lấy url dưới dạng chuỗi bằng cách gọi:

$url->toString();

Ví dụ:

$url_string = Url::fromRoute('<front>')->toString();

Các linkphương pháp bị phản đối.
Mắt

Tôi đã sửa đổi câu trả lời của mình để sử dụng toLink () từ đối tượng nút, tức là $ node-> toLink () -> toRenderable ();
oknate

Đây là một chạy xuống tốt.
Brady

15

Khả năng thiết lập các thuộc tính dường như bị mất hoặc bị sai trong các ví dụ trước vì chức năng này không rõ ràng. Có hai cách để tạo liên kết tùy thuộc vào việc nó có tuyến đường hay không và mỗi cách ứng xử hơi khác nhau một chút vì vậy đây là các ví dụ.

  1. Với một lộ trình. Điều này có ý nghĩa nhất, bạn chỉ có thể cung cấp nó trong các tùy chọn.

    Link::createFromRoute('My link', 
      'entity.node.canonical',
      ['node' => 123],
      ['attributes' => ['class' => 'special']]));
    
  2. Với một url bên ngoài. Cái này hơi lạ. Không có đối số tùy chọn nên có vẻ như không thể nhưng thực tế nó vẫn ổn. Lý do là các liên kết không thể giải thích không bao giờ có tùy chọn chỉ có URL mà họ mô tả. Điều này có nghĩa là bạn chuyển trong lớp tới URL khi bạn tạo nó và nó sẽ chỉ hoạt động.

    Link::fromTextAndUrl('My link', 
      Url::FromUrl('https://example.com/about',
        ['attributes' => ['class' => 'special']]));
    

    Một hệ quả tất cả những điều này là bạn cũng có thể làm điều này.

    $link = Link::fromTextAndUrl('Example',  Url::fromUri('https://example.com/about'));
    $link->getUrl()->setOption('attributes', ['class' => 'superspecial']);
    

2

Một ví dụ hoàn chỉnh với các thuộc tính và đánh dấu HTML trong văn bản liên kết:

  $url = Url::fromRoute(
   'your.route.name', 
   [], 
   ['attributes' => ['id' => 'add-link', 'class' => ['btn', 'btn-sm', 'btn-primary']]]
  );
  $link = Link::fromTextAndUrl(
    Markup::create('<span class=\'glyphicon glyphicon-plus\'></span> ' . t('Add new item')), 
    $url
  );

0

Tôi cần thêm liên kết vào bảng dưới dạng #suffix, nhưng cần đặt nó dưới dạng html, để đạt được điều này tôi đã làm

\Drupal\Core\Link::fromTextAndUrl("Add New page", Url::fromRoute('mymodule.add_new_page'))->toString();

Trong đó mymodule.add_new_page là tuyến đường từ tệp yml mô-đun của tôi.


0

Các câu trả lời ở đây đã cho tôi một số gợi ý tốt. Tất cả những gì tôi muốn là cung cấp một liên kết đến nút trong nhật ký của tôi ... Vì vậy, đây là những gì tôi đã kết thúc với

  use Drupal\Core\Url;
  use Drupal\Core\Link;
  /* ...
  .. */  
  $url = Url::fromRoute('entity.node.canonical', array('node' => $object->id()));
$strings = array(
  '!node' => Link::fromTextAndUrl($object->getTitle(), $url)->toString(),
  '%nid' => $nid,
);
\Drupal::logger('mymodule_actions')->notice('Updating !node (%nid)', $strings);

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.