Come faccio a creare un collegamento?


26

Supponiamo che sto estendendo la blockBaseclasse per creare un blocco personalizzato e sto implementando il blockBuildmetodo per creare un markup per il mio blocco. Qualcosa come questo:

 class YourModuleBlock extends BlockBase {

   /**
     * Implements \Drupal\block\BlockBase::blockBuild().
     */
     public function build() {
      return array(
        '#markup' => 'This is a block!',
      );
     }
   }

Se avessi voluto fornire un link in questo markup, in D7 avrei usato la lfunzione, ma questa non è più disponibile ( vedi qui ). Quindi, devo rendere disponibile il nuovo metodo D8 per generare collegamenti. Potrei semplicemente usare un <a>tag, ma questa non è mai stata la migliore pratica in D7.

Quindi, qual è il metodo giusto da utilizzare per creare collegamenti e come posso renderlo disponibile per la mia funzione?


Controlla sotto il link che ha tutti i tipi di esempio per generare link in drupal 8 gist.github.com/r-daneelolivaw/b420b3dc0c40a6cacf76
Bijwe

Risposte:


56

\ Drupal :: l è deprecato. Forse questo caso sarà utile per qualcuno

  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
Questo toRenderable()trucco è molto utile, grazie!
Nic,

Funziona ancora su Drupal 8.4 core
podarok

Brah, mi hai salvato la vita con questo, sono nuovo di Drupal e sono stato in grado di capire come cambiare la colonna dei nomi dei moduli dei gruppi per puntare ai nodi grazie a questo!
Mike Q,

24

Uno, questo non è completo al 100%, vedi questo problema . Detto questo, vorrei citare un po 'di codice dall'avviso di modifica :

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

Modifica: i nomi delle rotte sono nei moduledirectory/modulename.routing.ymlfile e (per impostazione predefinita) nella {router}tabella.


2
Ho trovato $ router_name nella tabella {router}.
24ma13wg,

1
Come posso creare un link per la prima pagina. In drupal 7, può essere l ('home', '<front>'). ma che dire di drupal 8?
Guru,

fromRoute('<front>')

7
\ Drupal :: l è deprecato. Usa invece \ Drupal \ Core \ Link :: fromTextAndUrl ($ text, $ url) invece
Eyal


21

Un'altra opzione è quella di creare un collegamento in un array di rendering

$url = Url::fromRoute('entity.node.edit_form', array('node' => NID));
$link = [
  '#type' => 'link',
  '#url' => $url,
  '#title' => t('This link was rendered')
];

Drupal ci fornisce alcuni metodi di supporto per creare URL e collegamenti a entità.

$url = Node::load(NID)->toUrl('edit-form');

E

$link = Node::load(NID)->toLink(t('link text'), 'edit-form');
$link_render_array = $link->toRenderable();

Mi piace questa risposta al meglio. Inoltre #attributespuò essere aggiunto perché questo è un RenderElement .
mradcliffe,

Il link dovrebbe essere api.drupal.org/api/drupal/…
mradcliffe

Non sono riuscito a modificarlo perché ho aspettato troppo a lungo.
mradcliffe,

19

Ecco alcuni esempi di creazione di collegamenti in Drupal 8. Nota che $ this-> t ('alcuni testi') è disponibile all'interno di blocchi che estendono BlockBase. Se li copi in un'altra classe che non li possiede o li usi in un file .module, potresti doverlo modificare in t () 1 .

Collegamento di base a un nodo:

$node = Node::load($nid);
$build['node_link'] = $node->toLink()->toRenderable();

Questo crea un array di rendering come questo:

$link = [
  '#type' => 'link',
  '#url' => $url_object,
  '#title' => 'Title of Node',
];

È possibile creare l'array di rendering senza caricare il nodo in questo modo:

$url_object = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$link = [
  '#type' => 'link',
  '#url' => $url_object,
  '#title' => $this->t('Read More'),
];

O usando la classe Link principale:

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Se vuoi usare il markup nel testo del tuo link, non puoi semplicemente inserire una stringa. Devi usare un elemento array di rendering:

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

Per creare un collegamento assoluto, aggiungi questa opzione all'URL, non al collegamento:

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid], ['absolute' => TRUE]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Per aggiungere una classe al tuo link, devi anche aggiungere questo all'URL, non al link:

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

Per aggiungere una stringa di query al tuo link, devi anche farlo all'URL, non al link:

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

Per impostare il collegamento da aprire in una nuova finestra con 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();

Ecco un link alla pagina dei termini della tassonomia:

$url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term' => $tid]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Ecco un link alla pagina di modifica del nodo:

$url = Url::fromRoute('entity.node.edit_form', ['node' => $nid]);
$link = Link::fromTextAndUrl($this->t('Edit'), $url);
$build['read_more'] = $link->toRenderable();

Per creare un collegamento esterno:

$url = Url::fromUri('http://www.example.com/');
$link = Link::fromTextAndUrl($this->t('Vist this example site'), $url);
$build['external_link'] = $link->toRenderable();

Link alla homepage:

$url = Url::fromRoute('<front>');
$link = Link::fromTextAndUrl($this->t('Home'), $url);
$build['homepage_link'] = $link->toRenderable();

Si noti che su uno di questi oggetti url, è possibile ottenere l'URL come stringa chiamando:

$url->toString();

Per esempio:

$url_string = Url::fromRoute('<front>')->toString();

Il linkmetodo è obsoleto.
Eyal

Ho modificato la mia risposta per utilizzare toLink () dall'oggetto nodo, ovvero $ node-> toLink () -> toRenderable ();
Oknate,

Questo è un bel malandato.
Brady,

15

La capacità di impostare gli attributi sembra persa o contorta negli esempi precedenti perché la funzionalità non è ovvia. Esistono due modi per creare collegamenti a seconda che abbia una route o meno e ognuno si comporta in modo leggermente diverso, quindi ecco gli esempi.

  1. Con un percorso. Questo ha più senso, puoi semplicemente fornirlo nelle opzioni.

    Link::createFromRoute('My link', 
      'entity.node.canonical',
      ['node' => 123],
      ['attributes' => ['class' => 'special']]));
  2. Con un URL esterno. Questo è un po 'strano. Non esiste un argomento opzionale, quindi potrebbe sembrare impossibile, ma in realtà è OK. Il motivo è che i collegamenti inspiegabili non hanno mai opzioni solo l'URL che descrivono. Questo significa che passi la classe all'URL quando lo crei e funzionerà.

    Link::fromTextAndUrl('My link', 
      Url::FromUrl('https://example.com/about',
        ['attributes' => ['class' => 'special']]));

    Un corollario di tutto ciò è che puoi anche farlo.

    $link = Link::fromTextAndUrl('Example',  Url::fromUri('https://example.com/about'));
    $link->getUrl()->setOption('attributes', ['class' => 'superspecial']);

2

Un esempio completo con attributi e markup HTML nel testo del link:

  $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

Avevo bisogno di aggiungere un link alla tabella come #suffix, ma dovevo metterlo come html, per ottenere questo ho fatto

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

Dove mymodule.add_new_page è il percorso dal mio file yml del modulo.


0

Le risposte qui mi hanno dato alcuni buoni suggerimenti. Tutto quello che volevo era fornire un collegamento al nodo nei miei registri ... Quindi ecco cosa ho finito

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

-3
\Drupal\Core\Link::createFromRoute(t('TEXT'), 'ROUTE')->toString()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.