web-dev-qa-db-fra.com

Comment créer un lien ancre VIDE avec l ()?

J'essaie d'utiliser l() pour obtenir quelque chose comme <a href='#' ...>, À des fins d'appel ajax. https://stackoverflow.com/questions/1698453/drupal-creating-anchor-only-link-with-l est très proche de la bonne chose - utilisez une option dans l() comme 'fragment' => 'foo' pour produire un lien comme <a href='#foo'...> - mais j'essaye d'obtenir un "#" net. Y a-t-il un moyen de le faire, ou devrais-je simplement mettre quelque chose dans le fragment et ne pas m'en inquiéter?

20
Jim Miller

Si vous ne pouviez pas utiliser un "#" propre avec un fragment, je vous suggère d'utiliser <a href="javascript:">link</a>.
Lorsque vous ajoutez "javascript:" ou "javascript: void (0)" à l'attribut href, la balise <a> Ne fera rien. Ensuite, vous pouvez lier "onclick" au lien pour votre objectif ajax.
Vous pouvez l'implémenter en utilisant la fonction l() comme ci-dessous:

     l('link', 'javascript:',  array('external' => TRUE));
12
Sithu

Temps de quiz pop de transtypage PHP! (Divulgation complète: je n'ai pas gagné dans notre bureau).

Comme déjà souligné, c'est le code de l() qui nous intéresse:

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

Voici donc la question: quelle valeur transforme en une chaîne vide mais passe la suivante?

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

La réponse est: FALSE!

Donc, nous pourrions essayer ceci:

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

Ce qui nous donne:

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

Heureusement, nous pouvons supprimer cette barre oblique en passant par external => TRUE:

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

Ce qui nous donne:

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

Boom. Les choses que nous faisons pour éviter de concaténer manuellement les chaînes html, hein?

Postscript:

Je ne suis pas sûr que je recommanderais d'imprimer un lien comme celui-ci à partir de php dans des circonstances normales. Sans votre javascript, tout ce lien va le faire sauter votre utilisateur en haut de la page ( ce qui, à ma légère surprise, est un comportement spéculé ). Il devrait probablement pointer quelque part qui fonctionne sans javascript.

Si le lien vraiment n'a de sens qu'avec du javascript autour (comme les contrôles pour un diaporama js uniquement ou quelque chose comme ça), je pense qu'il vaut mieux ajouter le lien vers la page avec javascript. Alternativement, si vous voulez vraiment le mettre dans votre source, assurez-vous que c'est display:none 'd par défaut. Drupal a le .js classe sur le html pour ensuite l'afficher lorsque javascript est disponible.

15
Stephen Tweeddale

Malheureusement, la fonction url() (que l() appelle en interne) annule à peu près toute chance d'un fragment vide avec les lignes suivantes:

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

Il vérifie que le fragment n'est pas une chaîne vide, c'est ce que vous devez passer pour obtenir le _ #. Je pense que la solution la plus simple serait de choisir l'id d'un élément approprié quelque part dans la page et de l'utiliser à la place pour le fragment (ou javascript:void comme Sithu l'a mentionné).

Cependant ... la manière la plus accessible (et par la suite, dans de nombreux pays, la voie légale; pensez section 508 aux États-Unis, le DDA au Royaume-Uni, etc.) être de fournir le contenu qui est chargé/ajusté par votre lien sur une page séparée, et utilisez l'URL de cette page comme href du lien à la place. Vous utiliseriez alors javascript pour empêcher l'événement sur le lien de rediriger réellement la page pour les navigateurs qui l'ont activé.

De cette façon, vous avez du contenu de secours pour les utilisateurs sans javascript, vous restez légal et vous gardez tout le monde et leur chien heureux :)

7
Clive

Vous ne pouvez pas utiliser clean #.

Mais il est possible d'ajouter space symbol après #:

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

Je viens d'avoir le même problème, mais aucune des solutions n'était satisfaisante, alors j'ai trouvé le mien:

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

Cela produit un #

<a href="#">link</a>
2
David Sidler

J'utiliserais plutôt le type de rendu html_tag parce que je crois que le rendu link reçoit une attention particulière de Drupal. L'inconvénient étant qu'il n'y a pas de fonction de raccourci pour cela, nous devrons donc utiliser un tableau de rendu:

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

C'est fondamentalement la même réponse que j'ai postée ici ... Définir fragment sur un seul espace se convertira en #, et $current_path est inclus car sinon le lien sera simplement défini sur www.example.com/# au lieu de www.example.com/current-page#:

$current_path = check_url(drupal_get_path_alias($_GET['q']));
$link = l('link', $current_path, array('fragment' => ' '));
0
jerdiggity