Como criar um link somente âncora VAZIO com l ()?

20

Estou tentando usar l()para obter algo como <a href='#' ...>, para fins de chamada de ajax. /programming/1698453/drupal-creating-anchor-only-link-with-l está muito perto da coisa certa - use uma opção em l()como 'fragment' => 'foo'produzir um link como <a href='#foo'...>- mas eu sou tentando obter um '#' limpo. Existe alguma maneira de fazer isso, ou devo colocar algo como parte do fragmento e não me preocupar com isso?

Jim Miller
fonte

Respostas:

12

Se você não puder usar o "#" limpo com fragmento, sugiro que você o use <a href="javascript:">link</a>.
Ao adicionar "javascript:" ou "javascript: void (0)" ao hrefatributo, a <a>tag não fará nada. Em seguida, você pode vincular "onclick" ao link para seu objetivo no ajax.
Você pode implementar isso usando a l()função como abaixo:

     l('link', 'javascript:',  array('external' => TRUE));
Sithu
fonte
o que dizerjavascript:void(0)
Serjas
11
@ Serjas, javascript:e javascript:void(0)são os mesmos. A única diferença é "void (0)" :)
Sithu
Quero dizer l () convert ()?
Serjas 28/11
6
Você nunca deve usar essas travessuras e apenas usar JavaScript orientado a eventos! Este ano é 2012 e não 2004. Por que uma resposta de baixa qualidade é votada? Popular porque é fácil? Mas é extremamente errado. :(
@chx, como você é um mantenedor do núcleo drupal, espero que você não esteja abusando de não usar o segundo parâmetro para a função l () em vez de caminho ou fragmento. Infelizmente, a função aceita "javascript" como um caminho :) Se estiver extremamente errado, por que o Drupal o aceita? Provavelmente, será restrito nas versões posteriores do Drupal.
Sithu
15

PHP tipecasting tempo de teste pop! (Divulgação completa: não ganhei em nosso escritório).

Como já apontado, este é o código no l()qual estamos preocupados:

if (isset($options['fragment']) && $options['fragment'] !== '') {
  $options['fragment'] = '#' . $options['fragment'];
}

Então, aqui está a pergunta: Qual o valor convertido em uma sequência vazia, mas passa o seguinte?

(isset($var) && $var !== '')

A resposta é FALSE:!

Então, poderíamos tentar o seguinte:

l(t('My link'), NULL, array('fragment' => FALSE));

O que nos dá:

<a href="/#">My link</a>

Felizmente, podemos remover essa barra principal passando adiante external => TRUE:

l(t('My link'), NULL, array('external' => TRUE, 'fragment' => FALSE));

O que nos dá:

<a href="#">My link</a>

Estrondo. O que fazemos para evitar concatenar manualmente as strings html, não é?

Postscript:

Não tenho certeza se eu realmente recomendaria imprimir um link como este do php em circunstâncias normais. Sem o seu javascript, todo esse link fará com que ele salte para o topo da página ( que, para minha pequena surpresa, é um comportamento especificado ). Provavelmente deve apontar para algum lugar que funcione sem javascript.

Se o link realmente só faz sentido com o javascript (como os controles de uma apresentação de slides apenas com js ou algo assim), acho melhor adicionar o link à página com javascript. Como alternativa, se você realmente deseja colocá-lo em sua fonte, verifique se está disponível display:nonepor padrão. O Drupal tem a .jsclasse no html para mostrá-lo quando o javascript estiver disponível.

Stephen Tweeddale
fonte
7

Infelizmente, a url()função (que l()chama internamente) reduz a possibilidade de um fragmento vazio com as seguintes linhas:

if (isset($options['fragment']) && $options['fragment'] !== '') {
  $options['fragment'] = '#' . $options['fragment'];
}

Ele verifica se o fragmento não é uma sequência vazia, que é o que você precisa passar para obter a limpeza #. Eu acho que a solução mais fácil seria escolher o id de um elemento adequado em algum lugar da página e usá-lo no fragmento (ou javascript:voidcomo Sithu mencionou).

No entanto ... a maneira mais acessível (e subseqüentemente, em muitos países, a maneira legal; pense na seção 508 nos Estados Unidos, no DDA no Reino Unido etc.) seria fornecer o conteúdo que está sendo carregado / ajustado pelo seu link no uma página separada e, em vez disso, use o URL dessa página como href do link. Você usaria o javascript para impedir que o evento no link redirecionasse a página para os navegadores que a ativaram.

Dessa forma, você tem conteúdo substituto para usuários sem javascript, permanece legal e mantém todo mundo e seu cachorro felizes :)

Clive
fonte
Ótima edição sobre fallback! Se usarmos o URL ajax no href do link, a página de chamada pode ser um HTML renderizável se o javascript estiver desativado? Eu já tive print drupal_json_output($output)na minha página de chamadas do ajax.
Sithu
4

Você não poderia usar limpo #.

Mas é possível adicionar space symboldepois #:

  l('Link title', '# ', array('external' => TRUE));
milkovsky
fonte
2

Acabei de ter o mesmo problema, mas nenhuma das soluções foi satisfatória, então criei a minha:

l('link', '', array('fragment' => ' ', 'html' => TRUE, 'external' => TRUE));

Isso produz uma limpeza #

<a href="#">link</a>
David Sidler
fonte
Fechar, isso produz <a href="# ">link</a>para mim.
tyler.frankenstein
1

Em vez disso, eu usaria o tipo de renderização html_tag porque acredito que o link de renderização receba atenção especial do Drupal. A desvantagem é que não existe uma função de atalho para isso, então teremos que usar uma matriz de renderização:

array (
  '#type' => 'html_tag',
  '#tag' => 'a',
  '#attributes' => array (
    'href' => '#',
  ),
);
Jigarius
fonte
0

Esta é basicamente a mesma resposta que eu postei aqui ... A configuração fragmentde um único espaço será convertida em a #e $current_pathserá incluída porque, caso contrário, o link será definido apenas em www.example.com/#vez de www.example.com/current-page#:

$current_path = check_url(drupal_get_path_alias($_GET['q']));
$link = l('link', $current_path, array('fragment' => ' '));
jerdiggity
fonte
Não há necessidade de obter o alias do caminho porque l () será convertido em alias para você. Na verdade, é preferível usar um caminho sem alias.
ROOBY