링크는 어떻게 만듭니 까?


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.