リンクを作成するにはどうすればよいですか?


26

blockBaseクラスを拡張してカスタムブロックblockBuildを作成し、ブロックのマークアップを作成するメソッドを実装しているとします。このようなもの:

 class YourModuleBlock extends BlockBase {

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

このマークアップでリンクを提供したい場合、D7ではlこの関数を使用していましたが、これは使用できなくなりました(こちらを参照)。そのため、リンクを生成するための新しいD8メソッドを利用可能にする必要があります。<a>タグを使用することもできましたが、これはD7のベストプラクティスではありませんでした。

それでは、リンクを作成するために使用する適切な方法は何であり、どのようにそれを私の機能で利用可能にするのですか?


drupalの8のリンクを生成するために、例のすべての種類を持っているリンクの下にご確認くださいgist.github.com/r-daneelolivaw/b420b3dc0c40a6cacf76
Swapnil Bijwe

回答:


56

\ Drupal :: lは非推奨です。たぶん、このケースは誰かに役立つでしょう

  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
このtoRenderable()トリックは非常に便利です、ありがとう!
ニック

Drupal 8.4コアで
引き続き

Brah、これで私の命を救ってくれました。私はDrupalの初心者であり、これによりGroupsモジュール名の列がノードを指すように変更する方法を見つけることができました!
マイクQ

24

1つは、これは100%完全ではありません。この問題を参照してください。それで、変更通知からいくつかのコードを引用させてください:

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

編集:ルート名はmoduledirectory/modulename.routing.ymlファイルと(デフォルトで){router}テーブルにあります。


2
{router}テーブルで$ router_nameを見つけました。
24ma13wg

1
フロントページのリンクを作成するにはどうすればよいですか。drupal 7では、l( 'home'、 '<front>')になります。しかし、drupal 8ではどうでしょうか?
達人

fromRoute('<front>')

7
\ Drupal :: lは非推奨です。使用\ Drupalの\コア\リンク:: fromTextAndUrl($テキスト、$ URL)の代わりに
エヤル


21

別のオプションは、レンダー配列にリンクを作成することです

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

Drupalは、URLとエンティティへのリンクを作成するためのヘルパーメソッドを提供します。

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

そして

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

この答えが一番好きです。#attributesこれはRenderElementであるため、さらに追加できます。
mradcliffe


あまりにも長く待っていたため、編集できませんでした。
-mradcliffe

19

Drupal 8でリンクを作成する例を次に示します。$ this-> t( 'some text')は、BlockBaseを拡張するブロック内で使用できることに注意してください。これらを持たない別のクラスにこれらをコピーするか、.moduleファイルで使用する場合、これをt()1に変更する必要があります。

ノードへの基本リンク:

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

これにより、次のようなレンダー配列が作成されます。

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

この方法でノードをロードせずにレンダー配列を作成できます。

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

または、コアリンククラスを使用します。

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

リンクのテキストでマークアップを使用する場合は、単に文字列を挿入することはできません。レンダー配列要素を使用する必要があります。

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

絶対リンクを作成するには、このオプションをリンクではなくURLに追加します。

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

クラスをリンクに追加するには、これをリンクではなくURLに追加する必要もあります。

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

リンクにクエリ文字列を追加するには、リンクではなくURLにこれを追加する必要があります。

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

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

分類用語ページへのリンクは次のとおりです。

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

ノード編集ページへのリンクは次のとおりです。

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

外部リンクを作成するには:

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

ホームページへのリンク:

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

これらのurlオブジェクトのいずれかで、次を呼び出してURLを文字列として取得できることに注意してください。

$url->toString();

例えば:

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

このlinkメソッドは非推奨です。
エアル

ノードオブジェクトからtoLink()を使用するように回答を修正しました。つまり、$ node-> toLink()-> toRenderable();
oknate

これは良いランダウンです。
ブレイディ

15

機能が明らかではないため、前の例では属性を設定する機能が失われているか複雑になっています。リンクがあるかどうかに応じてリンクを作成する方法は2つあり、それぞれ異なる動作をするので、例を示します。

  1. ルート付き。これは最も理にかなっています。オプションで指定するだけです。

    Link::createFromRoute('My link', 
      'entity.node.canonical',
      ['node' => 123],
      ['attributes' => ['class' => 'special']]));
  2. 外部URLを使用します。これは少し奇妙です。オプション引数がないため、不可能に思えるかもしれませんが、実際には問題ありません。理由は、不可解なことに、リンクにはそれらが記述するURLのみのオプションが含まれないからです。これは、クラスを作成するときにURLにクラスを渡すと、機能することを意味します。

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

    これらすべての結果は、これもできるということです。

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

2

リンクテキストに属性とHTMLマークアップを含む完全な例:

  $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

#suffixとしてテーブルにリンクを追加する必要がありましたが、これを達成するために、htmlとしてそれを配置する必要がありました

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

mymodule.add_new_pageは、私のモジュールのymlファイルからのルートです。


0

ここでの回答は、良い指針をくれました。私が望んでいたのは、ログにノードへのリンクを提供することでした...

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.