web-dev-qa-db-ja.com

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

たとえば、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では決してベストプラクティスではありませんでした。

それで、リンクを作成するために使用する正しい方法は何ですか、そしてそれを私の関数で利用できるようにするにはどうすればよいですか?

30
dbj44

\ 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);
61
Eugene

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

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} テーブル。

24
user49

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

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

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'),
];

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

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

属性を設定する機能は、前の例では失われているか複雑であるように見えます。これは、機能が明確でないためです。ルートがあるかどうかによってリンクを作成する方法は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']);
    
15
NecLimDul

リンクテキストに属性と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
  );
2

ここでの答えは私にいくつかの良い指針を与えました。私が欲しかったのは、ログへのノードへのリンクを提供することだけだったので...

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

#suffixとしてテーブルへのリンクを追加する必要がありましたが、htmlとして配置する必要がありました。これを実現するには、

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

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

0
Eugene