2016-02-14 10 views
12

Sto controllando Drupal 8 e provo a generare un collegamento basato sull'ID del nodo di un articolo. in Drupal 7 è qualcosa di simile:Creazione di un collegamento dall'ID nodo in Drupal 8

$options = array('absolute' => TRUE); 
$nid = 1; // Node ID 
$url = url('node/' . $nid, $options); 

Ciò si traduce in un collegamento assoluto con l'URL corretto-alias.

Quindi la funzione url() - sembra essere deprecata; qual è il modo Drupal-8? Sembra una funzione davvero semplice per me ma non ho trovato riferimenti utili.

risposta

23

È necessario utilizzare la classe \Drupal\Core\Url, in particolare il metodo statico fromRoute. Drupal 8 usa rotte che hanno un nome diverso dal loro attuale percorso URL. Nel tuo caso, il percorso da utilizzare è il percorso canonico per un'entità nodo: entity.node.canonical. \Drupal\Core\Url::fromRoute() non restituirà una stringa, ma un oggetto. Per ottenere l'URL come stringa, devi chiamare il suo metodo toString().

$options = ['absolute' => TRUE]; 
$url = \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 1], $options); 
$url = $url->toString(); 

Il metodo statico non è facilmente verificabile, $url->toString() richiedono un contenitore inizializzata. È possibile sostituire il metodo statico con una chiamata a UrlGeneratorInterface::generateFromRoute() sul servizio url_generator.

$options = ['absolute' => TRUE]; 
$url = $this->url_generator->generateFromRoute('entity.node.canonical', ['node' => 1], $options); 
$url = $url->toString(); 

Sfortunatamente, questo metodo viene contrassegnato come @internal modo che non si suppone di utilizzare nel codice utente (es. Fuori Drupal core).

+0

questo ha fatto per me. grazie per il frammento! se un alias è definito ottengo l'alias, altrimenti ottengo il link con .../node/id. – Nicensin

+0

Potresti spiegare come usarlo? Dove ho cambiato/aggiunto codice? Nel tema> pre-elaborazione? Url.php o il core? È difficile trovare una risposta globale all'avvio di Drupal. –

+1

@PaulLeclerc Non si dovrebbe mai modificare qualcosa nel core come nota generale. È possibile utilizzare gli esempi di codice sopra ovunque sia necessario. Funziona in tutti i file in cui è possibile utilizzare php. Ovviamente non possiamo rispondere a questo per te perché non sappiamo cosa vuoi fare. – Nicensin

-1

È necessario utilizzare la classe Drupal\Core\Url;.

$url= Url::fromRoute('root', $route_parameters=array()); 

$link = \Drupal::l(t('label'), $url); 

Esempio:

Se si passa argomento

$url = Url::fromRoute('test.page', $route_parameters = array('test' => 1)); 

Altrimenti

$url = Url::fromRoute('test.page'); 
$link = \Drupal::l(t('Label'), $url); 
+1

L'OP chiede specificamente un URL nodo dall'id ID, questa risposta è incompleta0 Inoltre, l'OP chiede un URL assoluto (per codice originale), questa risposta non produce URL assoluto. Infine, '\ Drupal :: l()' è deprecato, usa invece 'Link :: fromTextAndUrl()'. –

2

Crea URL assoluto:

$options = ['absolute' => TRUE]; 
$url_object = Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => $nid], $options); 
// will output http://example.com/path-to-my-node 

creare l'oggetto collegamento assoluto:

$options = ['absolute' => TRUE, 'attributes' => ['class' => 'this-class']]; 
$node_title = Drupal\Core\Render\Markup::create('<span>' . $node_title . '</span>'); 
$link_object = Drupal\Core\Link::createFromRoute($node_title, 'entity.node.canonical', ['node' => $nid], $options); 
// will output <a href="http://example.com/path-to-my-node" class="this-class"><span>My Node's Title</span></a> 
0

hehe, questa è la merda in termini di ottenere URL dal campo (versione Ramoscello di ottenere quel URL)

Se si desidera che l'URL (e il titolo) che è in un campo che si deve arrivare a oggetto della classe: Drupal \ core \ URL

Se hai il nodo drupal_entity (Twig Tweaks) poi si deve: (userò "tab" come quel nodo) . Scheda [ '# nodo'] field_link

Questo vi dà utilizzando:

scheda [ '# nodo'] field_link..uri -> URI (URI non è URL)

scheda [ '# nodo'] field_link.title -.> il titolo

ma, che non è la fine.

è meglio acess Drupal \ collegamento \ plugin \ Campo \ FieldType \ LinkItem da:.

scheda [ '# nodo'] field_link.get (0)

scheda [ '#node'] field_link [0]

(entrambi fanno lo stesso)

allora si può accedere a ciò che è più interessante:.

scheda [ '# nodo']. Field_tab_link [0] .getUrl() un Drupal \ Core \ URL oggetto .

È possibile accedere a questo oggetto anche utilizzando questa linea di seguito, dal di dentro che è file modello nodo: content.field_link [0] [ '# url'] (questo è anche Drupal \ Core \ URL oggetto)

Questo oggetto ha metodi:

  • isExternal() -> è link per esterno (ossia http://cnn.com.)
  • isRouted() -> viene link alla all'interno del tuo sito
  • getRouteName() -> nome della rotta
  • getRouteParameters() -> che vi dà una matrice di valori, qui (otteniamo ID di quel nodo) si avrebbe [ 'nodo' => ID]

si dovrebbe usare in quel modo:

{% set tabURL = tab['#node'].field_link[0].getUrl() %} 

{% if tabURL.isExternal() %} 
    {% set link_path = tab['#node'].field_tab_link.uri %} 

{% elseif tabURL.isRouted() %} 
    {% set link_path = path(tabURL.getRouteName(), tabURL.getRouteParameters()) %} {# /node/12 #} 

{% endif %} 
2

Nel caso in cui si è a pieno carico oggetto nodo si può semplicemente chiamare $node->toUrl() per ottenere l'URL richiesto. Per impostazione predefinita restituisce l'URL canonico per un nodo (nodo/NID) ma è possibile creare altri URL elencati nella definizione dell'entità nodo (vedere Drupal \ node \ Entity \ Node.php). Lo stesso vale per altri tipi di entità.

$options = ['absolute' => TRUE]; 
$view_link = Link::fromTextAndUrl(t('View'), $node->toUrl('canonical', $options)); 
$edit_link = Link::fromTextAndUrl(t('Edit'), $node->toUrl('edit-form', $options)); 
$delete_link = Link::fromTextAndUrl(t('Delete'), $node->toUrl('delete-form', $options)); 
Problemi correlati