링크는 어떻게 만듭니 까?


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에서는 모범 사례가 아닙니다.

그렇다면 링크를 만드는 데 사용하는 올바른 방법은 무엇이며 어떻게 기능에 사용할 수 있습니까?


드루팔 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()트릭은 매우 유용합니다. 감사합니다!
Nic

여전히 Drupal 8.4 코어에서 작동
podarok

Brah, 당신은 이것으로 나의 생명을 구했습니다. Drupal을 처음 사용했고 이것으로 인해 노드를 가리 키도록 Groups 모듈 이름 열을 변경하는 방법을 알아낼 수있었습니다!
Mike Q

24

하나, 이것은 100 % 완료되지 않았습니다 . 이 문제를 참조하십시오 . 그 말로 변경 통지 에서 코드를 인용하겠습니다 .

드루팔 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));

드루팔 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>') 일 수 있습니다. 드루팔 8은 어때요?
Guru

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

이 답변이 가장 좋습니다. 또한 RenderElement#attributes 이므로 추가 할 수 있습니다 .
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메소드는 더 이상 사용되지 않습니다.
Eyal

노드 객체에서 toLink ()를 사용하도록 내 대답을 수정했습니다. 즉 $ node-> toLink ()-> toRenderable ();
oknate

이것은 좋은 결과입니다.
Brady

15

기능이 명확하지 않기 때문에 이전 예제에서 속성을 설정하는 기능이 손실되거나 복잡해 보입니다. 경로가 있는지 여부에 따라 링크를 작성하는 방법에는 두 가지가 있으며 각각 경로가 약간 다르게 작동하므로 여기에 예가 있습니다.

  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

테이블에 # 접미사로 링크를 추가해야했지만 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.