Bagaimana cara membuat tautan?

26

Katakanlah saya memperluas blockBaseKelas untuk membuat blok kustom, dan saya menerapkan blockBuildmetode untuk membuat beberapa markup untuk blok saya. Sesuatu seperti ini:

 class YourModuleBlock extends BlockBase {

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

Jika saya ingin memberikan tautan di markup ini, di D7 saya akan menggunakan lfungsinya, tetapi ini tidak lagi tersedia ( lihat di sini ). Jadi, saya perlu menyediakan metode D8 baru untuk menghasilkan tautan. Saya hanya bisa menggunakan <a>tag, tapi ini bukan praktik terbaik di D7.

Jadi, apa metode yang tepat untuk digunakan untuk membuat tautan dan bagaimana cara membuatnya tersedia untuk fungsi saya?

24ma13wg
sumber
Silakan periksa tautan di bawah ini yang memiliki semua jenis contoh untuk menghasilkan tautan di drupal 8 gist.github.com/r-daneelolivaw/b420b3dc0c40a6cacf76
Swapnil Bijwe

Jawaban:

56

\ Drupal :: l sudah usang. Mungkin kasus ini akan bermanfaat bagi seseorang

  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);
Eugene
sumber
2
Ini toRenderable()trik ini sangat berguna, terima kasih!
Nic
Masih bekerja pada Drupal 8.4 core
podarok
Brah, Anda menyelamatkan hidup saya dengan yang ini, saya baru mengenal Drupal dan dapat mengetahui cara mengubah kolom nama-nama modul Grup untuk menunjuk ke simpul berkat ini!
Mike Q
24

Satu, ini belum 100% selesai, lihat masalah ini . Dengan itu, izinkan saya mengutip beberapa kode dari pemberitahuan perubahan :

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);

Sunting: nama rute ada di moduledirectory/modulename.routing.ymlfile dan (secara default) di {router}tabel.


sumber
2
Saya menemukan $ router_name di tabel {router}.
24ma13wg
1
Bagaimana saya bisa membuat tautan untuk halaman depan. Di drupal 7, bisa l ('home', '<front>'). tapi bagaimana dengan drupal 8?
Guru
fromRoute('<front>')
7
\ Drupal :: l sudah usang. Gunakan \ Drupal \ Core \ Link :: fromTextAndUrl ($ text, $ url) sebagai gantinya
Eyal
Drupal :: l pemberitahuan penghentian api.drupal.org/api/drupal/core!lib!Drupal.php/function/…
leymannx
21

Pilihan lain adalah membuat tautan dalam array render

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

Drupal memberi kami beberapa metode pembantu untuk membuat url dan tautan ke entitas.

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

Dan

$link = Node::load(NID)->toLink(t('link text'), 'edit-form');
$link_render_array = $link->toRenderable();
Eyal
sumber
Saya suka jawaban ini yang terbaik. Selain itu #attributesdapat ditambahkan karena ini adalah RenderElement .
mradcliffe
Tautan haruslah api.drupal.org/api/drupal/…
mradcliffe
Saya tidak dapat mengeditnya karena saya menunggu terlalu lama.
mradcliffe
19

Berikut adalah beberapa contoh membuat tautan di Drupal 8. Perhatikan bahwa $ this-> t ('some text') tersedia dalam blok yang memperpanjang BlockBase. Jika Anda menyalin ini ke kelas lain yang tidak memilikinya atau menggunakannya dalam file .module, Anda mungkin perlu mengubahnya ke t () 1 .

Tautan Dasar ke sebuah simpul:

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

Ini membuat array render seperti ini:

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

Anda dapat membuat array render tanpa memuat simpul dengan cara ini:

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

Atau menggunakan kelas inti Tautan:

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

Jika Anda ingin menggunakan markup dalam teks tautan Anda, Anda tidak bisa hanya memasukkan string. Anda perlu menggunakan elemen array render:

$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);

Untuk membuat tautan absolut, Anda menambahkan opsi ini ke URL, bukan tautan:

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

Untuk menambahkan kelas ke tautan Anda, Anda juga perlu menambahkan ini ke URL, bukan tautan:

$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();

Untuk menambahkan string kueri ke tautan Anda, Anda juga perlu ini ke URL, bukan tautan:

$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();

Untuk mengatur tautan agar terbuka di jendela baru dengan 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();

Berikut tautan ke halaman istilah taksonomi:

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

Inilah tautan ke halaman edit simpul:

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

Untuk membuat tautan eksternal:

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

Tautan ke beranda:

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

Perhatikan bahwa pada salah satu objek url ini, Anda bisa mendapatkan url sebagai string dengan memanggil:

$url->toString();

Sebagai contoh:

$url_string = Url::fromRoute('<front>')->toString();
oknate
sumber
The linkMetode sudah ditinggalkan.
Eyal
Saya telah merevisi jawaban saya untuk menggunakan toLink () dari objek node, yaitu $ node-> toLink () -> toRenderable ();
oknate
Ini adalah run down yang bagus.
Brady
15

Kemampuan untuk mengatur atribut tampaknya hilang atau berbelit-belit dalam contoh sebelumnya karena fungsinya tidak jelas. Ada dua cara untuk membuat tautan tergantung pada apakah ada rute atau tidak dan masing-masing berperilaku sedikit berbeda jadi di sini adalah contohnya.

  1. Dengan sebuah rute. Ini paling masuk akal, Anda bisa menyediakannya dalam opsi.

    Link::createFromRoute('My link', 
      'entity.node.canonical',
      ['node' => 123],
      ['attributes' => ['class' => 'special']]));
  2. Dengan url eksternal. Yang ini agak aneh. Tidak ada argumen opsi sehingga mungkin tampak mustahil tetapi sebenarnya OK. Alasannya adalah bahwa tautan yang tidak dapat dijelaskan tidak pernah memiliki opsi hanya URL yang mereka jelaskan. Ini berarti Anda meneruskan kelas ke URL saat Anda membuatnya dan itu hanya akan berfungsi.

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

    Akibat dari semua ini adalah Anda juga bisa melakukan ini.

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

Contoh lengkap dengan atribut dan markup HTML di teks tautan:

  $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
  );
Cristian Romanescu
sumber
0

Saya perlu menambahkan tautan ke tabel sebagai #suffix, tetapi harus meletakkannya sebagai html, untuk Mencapai ini saya lakukan

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

Di mana mymodule.add_new_page adalah rute dari file modul yml saya.

Eugene
sumber
0

Jawaban di sini memberi saya beberapa petunjuk bagus. Yang saya inginkan adalah memberikan tautan ke simpul di log saya ... Jadi, inilah yang akhirnya saya dapatkan

  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);
dman
sumber
-3
\Drupal\Core\Link::createFromRoute(t('TEXT'), 'ROUTE')->toString()
Rami Neifar
sumber