Digamos que estou estendendo a blockBase
classe para criar um bloco personalizado e estou implementando o blockBuild
método para criar alguma marcação para o meu bloco. Algo assim:
class YourModuleBlock extends BlockBase {
/**
* Implements \Drupal\block\BlockBase::blockBuild().
*/
public function build() {
return array(
'#markup' => 'This is a block!',
);
}
}
Se eu quisesse fornecer um link nessa marcação, no D7 eu teria usado a l
função, mas ela não está mais disponível ( veja aqui ). Portanto, preciso disponibilizar o novo método D8 para gerar links. Eu poderia apenas usar uma <a>
tag, mas essa nunca foi a melhor prática no D7.
Então, qual é o método certo para criar links e como disponibilizá-lo para minha função?
navigation
8
24ma13wg
fonte
fonte
Respostas:
\ Drupal :: l está obsoleto. Talvez este caso seja útil para alguém
fonte
toRenderable()
truque é muito útil, obrigado!Primeiro, isso não está 100% completo, veja esse problema . Com isso dito, deixe-me citar alguns códigos do aviso de alteração :
Drupal 7:
Drupal 8:
Editar: os nomes das rotas estão nos
moduledirectory/modulename.routing.yml
arquivos e (por padrão) na{router}
tabela.fonte
fromRoute('<front>')
Outra opção é criar um link em uma matriz de renderização
O Drupal nos fornece alguns métodos auxiliares para criar URLs e links para entidades.
E
fonte
#attributes
pode ser adicionado porque este é um RenderElement .Aqui estão alguns exemplos de criação de links no Drupal 8. Observe que $ this-> t ('algum texto') está disponível em blocos que estendem o BlockBase. Se você copiá-las para outra classe que não a possui ou usá-las em um arquivo .module, pode ser necessário alterá-lo para t () 1 .
Link básico para um nó:
Isso cria uma matriz de renderização como esta:
Você pode criar a matriz de renderização sem carregar o nó desta maneira:
Ou usando a classe Link principal:
Se você deseja usar a marcação no texto do seu link, não pode simplesmente inserir uma string. É necessário usar um elemento de matriz de renderização:
Para criar um link absoluto, você adiciona esta opção ao URL, não ao link:
Para adicionar uma classe ao seu link, você também precisa adicioná-lo ao URL, não ao link:
Para adicionar uma string de consulta ao seu link, você também precisa fazer isso no URL, não no link:
Para definir o link para abrir em uma nova janela com target = _blank:
Aqui está um link para uma página de termos de taxonomia:
Aqui está um link para a página de edição do nó:
Para criar um link externo:
Link para a página inicial:
Observe que em qualquer um desses objetos de URL, você pode obtê-lo como uma string chamando:
Por exemplo:
fonte
link
método está obsoleto.A capacidade de definir atributos parece perdida ou complicada nos exemplos anteriores, porque a funcionalidade simplesmente não é óbvia. Existem duas maneiras de criar links, dependendo se ele tem uma rota ou não e cada uma se comporta um pouco diferente, então aqui estão os exemplos.
Com uma rota. Isso faz mais sentido, basta fornecê-lo nas opções.
Com um URL externo. Este é um pouco estranho. Não existe um argumento de opção, por isso pode parecer impossível, mas está realmente bom. O motivo é que os links inexplicavelmente nunca têm opções apenas o URL que descrevem. Isso significa que você passa a classe para a URL quando a cria e ela simplesmente funciona.
Um corolário de tudo isso é que você também pode fazer isso.
fonte
Um exemplo completo com atributos e marcação HTML no texto do link:
fonte
Eu precisava adicionar link à tabela como #suffix, mas precisava colocá-lo como html, para conseguir isso, fiz
\Drupal\Core\Link::fromTextAndUrl("Add New page", Url::fromRoute('mymodule.add_new_page'))->toString();
Onde mymodule.add_new_page está a rota do meu arquivo yml do módulo.
fonte
As respostas aqui me deram algumas boas dicas. Tudo o que eu queria era fornecer um link para o nó nos meus logs ... Então, aqui está o que eu acabei com
fonte
fonte