Як створити посилання?


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

Відповіді:


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()трюк дуже корисний, дякую!
Нік

Ще працює над ядром Drupal 8.4
подарок

Бра, ти врятував мені життя завдяки цьому, я новачок у Drupal і зміг зрозуміти, як змінити стовпчик назв модуля Групи, щоб вказати на вузли завдяки цьому!
Майк 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_name у таблиці {router}.
24ma13wg

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

Посилання має бути api.drupal.org/api/drupal/…
mradcliffe

Я не зміг її відредагувати, тому що занадто довго чекав.
mradcliffe

19

Ось кілька прикладів створення посилань в Drupal 8. Зауважте, що $ this-> t ('деякий текст') доступний у блоках, що розширюють 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();

linkМетод є застарілим.
Eyal

Я переглянув свою відповідь на використання toLink () від об'єкта node, тобто $ node-> toLink () -> toRenderable ();
окнат

Це хороший біг вниз.
Брейді

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

Мені потрібно було додати посилання на таблицю як #suffix, але потрібно було поставити його як 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);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.