如何创建链接?


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 '17

Answers:


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()技巧非常有用,谢谢!
Nic

仍可

布拉赫,您救了我的命,这对Drupal来说是新来的,因此,我能够弄清楚如何更改“组”模块名称列以指向节点。
Mike Q

24

一,这不是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。
13wg

1
如何创建首页链接。在drupal 7中,它可以是l('home','<front>')。但是在drupal 8中呢?
大师

fromRoute('<front>')

7
\ Drupal :: l已弃用。使用\ Drupal \ Core \ Link :: fromTextAndUrl($ text,$ url)代替
Eyal


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中创建链接的一些示例。请注意,在扩展BlockBase的块中可以使用$ this-> t('some text')。如果将它们复制到另一个没有的类或在.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();

如果要在链接的文本中使用标记,则不能仅输入字符串。您需要使用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);

要创建绝对链接,请将此选项添加到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方法已弃用。
Eyal

我修改了答案,使用了来自节点对象的toLink(),即$ node-> toLink()-> toRenderable();
oknate

这是一个很好的失败。
布雷迪

15

在前面的示例中,设置属性的功能似乎丢失或复杂化,因为功能并不明显。有两种创建链接的方法,具体取决于它是否具有路由,并且每种行为的行为都略有不同,因此这里是示例。

  1. 有路线。这是最有意义的,您只需在选项中提供即可。

    Link::createFromRoute('My link', 
      'entity.node.canonical',
      ['node' => 123],
      ['attributes' => ['class' => 'special']]));
    
  2. 使用外部网址。这个有点奇怪。没有选项参数,因此似乎不可能,但实际上可以。原因是,莫名其妙的链接从来没有选项,只有它们描述的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

我需要将链接添加为表的后缀#,但需要将其作为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);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.