Comment puis-je thème un lien?

8

Dans Drupal 7, c'était possible.

$link = array(
  '#type'  => 'link',
  '#title' => t('My Title'),
  '#href'  => 'node/1',
);
drupal_render($link);

Mais j'ai essayé cela avec Drupal 8, et il ne produit rien.

$link = array(
  '#type' => 'link',
  '#title' => t('test'),
  '#url' => 'node/1',
);
drupal_render($link);

Existe-t-il un moyen de rendre un lien sans avoir à appeler directement le plugin Link ou à créer ma propre fonction de thème?

Je thématise un formateur de groupe de champs, qui doit produire un tableau de rendu.
L'utilisation de drupal_render()est déconseillée et ne doit pas être appelée directement; Je l'utilise ici pour rendre mon exemple plus clair.

leon.nk
la source
En fait, cela devrait fonctionner. Quel moyen ne produit rien? Où imprimez-vous ce HTML rendu ?? drupal_render () est obsolète. Appelez directement le RenderService: \ Drupal :: service ('renderer') -> render ($ elements, $ is_recursive_call) Juste pour générer le lien que vous pouvez également utiliser: Link :: fromTextAndUrl ($ text, Url $ url) Voir le lien classe .
rémy
Que voulez-vous thème?
rémy
Merci pour la réponse, mais comme indiqué, je ne veux pas appeler directement le plugin Link. J'ai mis à jour ma question avec un peu plus d'informations de fond pour comprendre mon scénario.
leon.nk
Ont ajouté des informations sur ce que je suis à la question.
leon.nk

Réponses:

8

Je pense que le problème avec votre code Drupal 8 est que '#url' a besoin d'un objet URL.

URL externe

'#url' => Url::fromUri('https://www.drupal.org'),

URL interne d'un itinéraire

'#url' => Url::fromRoute('entity.node.canonical', ['node' => 1]),

Dans Drupal 8, vous n'êtes pas censé vous rendre. Lors du portage de code depuis Drupal 7, supprimez tout le rendu et ne retournez que les tableaux de rendu.

4k4
la source
Merci beaucoup, cela fonctionne! Oui, je ne suis pas drupal_render()directement, c'était juste pour l'exemple.
leon.nk
1

Voici un exemple de rendu d'un lien dans Drupal 8 avec une classe personnalisée. C'est un peu étrange, mais les options sont passées dans l'URL, pas dans la fonction de lien.

use Drupal\Core\Url;

$options = array('attributes' => array('class' => 'my-custom-class'));
$url = Url::fromUri('http://www.example.com', $options);
$markup = \Drupal::l(t('Link Text Goes Here!'), $url);

Ceci est utile dans un formateur de champ, qui attend le balisage renvoyé. Si vous faites cela ailleurs, il est préférable de le convertir en élément de tableau de rendu de lien.

use Drupal\Core\Url;

$options = array('attributes' => array('class' => 'my-custom-class'));
$build['examples_link'] = [
  '#title' => t('Link Text Goes Here!'),
  '#type' => 'link',
  '#url' => Url::fromUri('http://www.example.com', $options)
];
oknate
la source