Nasıl link oluşturabilirim?


26

blockBaseÖzel bir blok oluşturmak için sınıfı genişlettiğimi ve blockBuildbloğum için bazı işaretlemeler oluşturma yöntemini uyguluyorum . Bunun gibi bir şey:

 class YourModuleBlock extends BlockBase {

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

Bu işaretlemede bir bağlantı vermek isteseydim, D7'de lişlevi kullanırdım, ancak bu artık mevcut değil ( buraya bakın ). Bu yüzden link oluşturmak için yeni D8 metodunu kullanmam gerekiyor. Sadece bir <a>etiket kullanabilirdim , ama bu D7'deki en iyi uygulama değildi.

Öyleyse, bağlantılar oluşturmak için doğru yöntem nedir ve onu fonksiyonum için nasıl uygun hale getirebilirim?


Drupal 8 bağlantıyı oluşturmak için örnek tüm türüne sahip linki aşağıda kontrol edin gist.github.com/r-daneelolivaw/b420b3dc0c40a6cacf76
Swapnil Bijwe

Yanıtlar:


56

\ Drupal :: l kullanımdan kaldırıldı. Belki bu dava birileri için faydalı olabilir

  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
Bu toRenderable()numara çok faydalı, teşekkürler!
Nic

Hala Drupal 8.4 çekirdeği üzerinde çalışıyor
podarok

Brah, hayatımı bununla kurtardın, ben Drupal’da yeniyim ve bu sayede düğümleri işaret etmek için Gruplar modül adları sütununu nasıl değiştireceğimi çözebildim!
Mike Q

24

Birincisi, bu% 100 tamamlanmadı, bu konuyu görün . Bununla birlikte, değişiklik bildiriminden bazı kodlar alıntılayayım :

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

Düzenleme: rota adları moduledirectory/modulename.routing.ymldosyalarda ve (varsayılan olarak) {router}tablodadır.


2
$ Router_name öğesini {router} tablosunda buldum.
24ma13wg

1
Ön sayfa için nasıl link oluşturabilirim. Drupal 7'de, l ('ev', '<front>') olabilir. peki ya drupal 8'de?
Guru

fromRoute('<front>')

7
\ Drupal :: l kullanımdan kaldırıldı. Bunun yerine \ Drupal \ Core \ Link :: fromTextAndUrl ($ text, $ url) kullanın
Eyal


21

Diğer bir seçenek, render dizisinde bir link oluşturmaktır.

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

Drupal, URL'ler ve varlıklara bağlantılar oluşturmak için bize bazı yardımcı yöntemler sunar.

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

Ve

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

Bu cevabı en çok sevdim. Ayrıca #attributesbu bir RenderElement olduğundan eklenebilir .
mradcliffe


Düzenlemeyi başaramadım çünkü çok uzun süre bekledim.
mradcliffe

19

İşte Drupal 8'de link oluşturmanın bazı örnekleri. BlokBase'i genişleten bloklarda $ this-> t ('some text') olduğunu unutmayın. Bunları sahip olmayan başka bir sınıfa kopyalarsanız veya bunları bir .module dosyasında kullanırsanız, bunu t () 1 olarak değiştirmeniz gerekebilir .

Bir düğüme Temel Bağlantı:

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

Bu, şöyle bir render dizisi yaratır:

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

Düğümü bu şekilde yüklemeden render dizisini oluşturabilirsiniz:

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

Veya çekirdek Link sınıfını kullanarak:

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

Bağlantınızın metninde işaretleme kullanmak istiyorsanız, sadece bir dize koyamazsınız. Bir render dizi öğesi kullanmanız gerekir:

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

Mutlak bir bağlantı oluşturmak için, bu seçeneği bağlantıya değil, URL'ye ekleyin:

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

Bağlantınıza bir sınıf eklemek için, bunu bağlantıya değil, URL’ye eklemeniz gerekir:

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

Bağlantınıza bir sorgu dizesi eklemek için, bağlantıya değil, URL’ye yapmanız gerekir:

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

Bağlantıyı target = _blank ile yeni bir pencerede açılacak şekilde ayarlamak için:

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

İşte bir taksonomi terim sayfasına bir link:

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

İşte düğüm düzenleme sayfasına bir link:

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

Harici bir link oluşturmak için:

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

Ana sayfaya bağlantı:

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

Bu url nesnelerinin herhangi birinde, url'yi çağırarak dizge olarak alabileceğinizi unutmayın:

$url->toString();

Örneğin:

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

Bu linkyöntem kullanımdan kaldırılmıştır.
Eyal

$ Node-> toLink () -> toRenderable (), düğüm nesnesinden toLink () işlevini kullanmak için cevabımı değiştirdim;
oknate

Bu iyi bir koşuşturma.
Brady,

15

Öznitelik ayarlama yeteneği, önceki örneklerde kaybolmuş veya sarsılmış gibi görünmektedir, çünkü işlevsellik açık değildir. Bir rota olup olmamasına bağlı olarak bağlantılar oluşturmanın iki yolu vardır ve her biri biraz farklı davranır, işte örnekler.

  1. Bir rota ile. Bu en mantıklı, sadece seçeneklerinde sağlayabilirsiniz.

    Link::createFromRoute('My link', 
      'entity.node.canonical',
      ['node' => 123],
      ['attributes' => ['class' => 'special']]));
  2. Harici bir URL ile. Bu biraz garip. Bir seçenek argümanı yok, bu yüzden imkansız görünebilir ama aslında tamam. Bunun nedeni, açıklanamayan bağlantıların hiçbir zaman yalnızca tanımladıkları URL seçeneklerine sahip olmamasıdır. Bu, sınıfta oluşturduğunuzda URL’ye geçtiğiniz anlamına gelir ve yalnızca çalışır.

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

    Tüm bunların bir sonucu olarak bunu da yapabilirsiniz.

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

2

Bağlantı metninde niteliklere ve HTML işaretlemesine sahip tam bir örnek:

  $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

Tabloya #suffix olarak link eklemem gerekiyordu, fakat bunu başarmak için html olarak koymam gerekiyordu.

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

Mymodule.add_new_page modül yml dosyamdan giderken.


0

Buradaki cevaplar bana bazı iyi işaretler verdi. Tek istediğim, günlüklerimdeki düğüme bir bağlantı sağlamaktı.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.