Como faço para criar um link para um tema?

8

No Drupal 7 isso foi possível.

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

Mas eu tentei isso com o Drupal 8, e ele não produz nada.

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

Existe uma maneira de renderizar um link sem precisar chamar diretamente o plug-in Link ou criar minha própria função de tema?

Estou criando um formatador de grupo de campos, que deve gerar uma matriz de renderização.
O uso de drupal_render()é preterido e não deve ser chamado diretamente; Estou usando-o aqui para tornar meu exemplo mais claro.

leon.nk
fonte
Na verdade, isso deve funcionar. O que significa não produz nada? Onde você imprime esse HTML renderizado? drupal_render () está obsoleto. Chame o RenderService diretamente: \ Drupal :: service ('renderer') -> render ($ elements, $ is_recursive_call) Apenas para gerar o link, você também pode usar: Link :: fromTextAndUrl ($ text, Url $ url) Veja o link classe .
Rémy 23/05
O que você quer tema ??
Rémy 23/05
Obrigado pela resposta, mas, como indicado, não quero chamar o plugin Link diretamente. Atualizei minha pergunta com um pouco mais de informações básicas para entender meu cenário.
Leon.nk 23/05
Adicionamos informações sobre o que estou usando para a pergunta.
Leon.nk 23/05

Respostas:

8

Eu acho que o problema com o seu código Drupal 8 é que '#url' precisa de um objeto de URL.

URL externo

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

URL interno de uma rota

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

No Drupal 8, você não deve se render. Ao portar código do Drupal 7, remova toda a renderização e retorne apenas matrizes de renderização.

4k4
fonte
Muito obrigado, isso funciona! Sim, eu não sou drupal_render()diretamente, foi apenas o exemplo.
Leon.nk 23/05
1

Aqui está um exemplo de como renderizar um link no Drupal 8 com uma classe personalizada. É um pouco estranho, mas as opções são passadas para o URL, não para a função de link.

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

Isso é útil em um formatador de campo, que espera a marcação retornada. Se você estiver fazendo isso em outro lugar, é melhor convertê-lo em um item de matriz de renderização de link.

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
fonte