Как создать ссылку?

Скажем, что я расширяю класс 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.

Итак, какой правильный метод использовать для создания ссылок и как сделать его доступным для моей функции?

20 голосов | спросил 24ma13wg 22 Jam1000000amThu, 22 Jan 2015 03:02:40 +030015 2015, 03:02:40

10 ответов


50

\ 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);
ответил Eugene 14 MonEurope/Moscow2015-12-14T17:33:30+03:00Europe/Moscow12bEurope/MoscowMon, 14 Dec 2015 17:33:30 +0300 2015, 17:33:30
20

Во-первых, это не 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}.

ответил 22 Jam1000000amThu, 22 Jan 2015 03:38:13 +030015 2015, 03:38:13
14

Другой вариант - создать ссылку в массиве рендеринга

$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();
ответил Eyal 22 Jpm1000000pmFri, 22 Jan 2016 20:43:34 +030016 2016, 20:43:34
11

Возможность установки атрибутов кажется потерянной или запутанной в предыдущих примерах, потому что функциональность просто не очевидна. Существует два способа создания ссылок в зависимости от того, имеет ли он маршрут или нет, и каждый ведет себя немного по-другому, поэтому вот примеры.

  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']);
    
ответил NecLimDul 22 Jpm1000000pmFri, 22 Jan 2016 19:13:48 +030016 2016, 19:13:48
8

Вот несколько примеров создания ссылок в 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();
ответил oknate 26 PMpTue, 26 Apr 2016 23:12:59 +030012Tuesday 2016, 23:12:59
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
  );
ответил Cristian Romanescu 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 17 Sep 2016 12:00:43 +0300 2016, 12:00:43
0

Мне нужно было добавить ссылку на таблицу как #suffix, но нужно было поместить ее как html, чтобы добиться этого.

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

Где mymodule.add_new_page является маршрутом из моего модуля yml-файла.

ответил Eugene 9 PMpSat, 09 Apr 2016 13:49:47 +030049Saturday 2016, 13:49:47
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);
ответил dman 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 12 Sep 2016 05:33:33 +0300 2016, 05:33:33
0

Пожалуйста, проверьте код ниже, у которого есть все типы примеров для создания ссылки в Drupal 8:

<?php

// Autoload Url and Link classes.
use Drupal\Core\Url;
use Drupal\Core\Link;

/**
 * External link
 */
$url = Url::fromUri('https://colorfield.be');
$link = Link::fromTextAndUrl(t('Colorfield'), $url);
$link = $link->toRenderable();
$link['#attributes'] = array('class' => array('external'));
$output = render($link); 

/**
 * Internal route
 */
$url = Url::fromRoute('contact.site_page'); // a route provided in .routing.yml
$link = Link::fromTextAndUrl(t("Contact"), $url);
$link = $link->toRenderable();
$link['#attributes'] = array('class' => array('internal'));
$output = render($link);

/**
 * Entities, e.g. node
 * @see http://stackoverflow.com/questions/35397009/creating-a-link-from-node-id-in-drupal-8
 */
$options = ['absolute' => TRUE];
$url = Url::fromRoute('entity.node.canonical', ['node' => 1], $options);
//$url = $url->toString();
$link = Link::fromTextAndUrl("Node title", $url);
$link = $link->toRenderable();
$link['#attributes'] = array('class' => array('internal'));
$output = render($link);

/**
 * Internal path
 */
$path = '/my/path'; // prefixed with / 
$url = Url::fromUri('internal:'.$path);
$link = Link::fromTextAndUrl($label, $url);
$link = $link->toRenderable();
$link['#attributes'] = array('class' => array('internal'));
$output = render($link); 

/**
 * Anchor (current page)
 */
$url = Url::fromRoute('<current>', array(), array('fragment' => $name));
$link = Link::fromTextAndUrl($label, $url);
$link =  $link->toRenderable(); 
$output = render($link); 

Источник: Drupal 8 ссылок или где моя функция l () .

ответил Swapnil Bijwe 6 +03002017-10-06T13:19:18+03:00312017bEurope/MoscowFri, 06 Oct 2017 13:19:18 +0300 2017, 13:19:18
-3
\Drupal\Core\Link::createFromRoute(t('TEXT'), 'ROUTE')->toString()
ответил Rami Neifar 12 PM00000040000005331 2016, 16:01:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132