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

20

J'essaie d'utiliser l()pour obtenir quelque chose comme <a href='#' ...>, à des fins d'appel ajax. /programming/1698453/drupal-creating-anchor-only-link-with-l est très proche de la bonne chose - utilisez une option dans l()like 'fragment' => 'foo'pour produire un lien comme <a href='#foo'...>- mais je suis essayer d'obtenir un «#» propre. 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?

Jim Miller
la source

Réponses:

12

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

     l('link', 'javascript:',  array('external' => TRUE));
Sithu
la source
Qu'enjavascript:void(0)
Serjas
1
@Serjas, javascript:et javascript:void(0)sont les mêmes. La seule différence est "void (0)" :)
Sithu
Je veux dire que l () convertira ()?
Serjas
6
Vous ne devriez jamais utiliser de tels manigances et simplement utiliser JavaScript piloté par les événements! Nous sommes en 2012 et non en 2004. Pourquoi une telle réponse de mauvaise qualité a-t-elle été votée? Populaire parce que c'est facile? Mais c'est extrêmement faux. :(
@chx, comme vous êtes un mainteneur drupal, j'espère que vous n'abusez pas de ne pas utiliser le second paramètre de la fonction l () plutôt que chemin ou fragment. Malheureusement, la fonction accepte "javascript" comme chemin :) Si c'est extrêmement faux, pourquoi Drupal l'accepte-t-il. Probablement, il sera limité dans les dernières versions de Drupal.
Sithu
15

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

Comme l()nous l'avons déjà souligné, voici le code en ce qui nous concerne:

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 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?

Post-scriptum:

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 n'a vraiment de sens qu'avec javascript (comme les contrôles pour un diaporama js uniquement ou quelque chose comme ça), je pense qu'il est préférable d'ajouter le lien vers la page avec javascript. Alternativement, si vous voulez vraiment le mettre dans votre source, assurez-vous que c'est display:nonepar défaut. Drupal a la .jsclasse sur le html pour ensuite l'afficher lorsque javascript est autour.

Stephen Tweeddale
la source
7

Malheureusement, la url()fonction (qui l()appelle en interne) annule à peu près toute chance de 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 nettoyage #. 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:voidcomme Sithu l'a mentionné).

Cependant ... la manière la plus accessible (et par la suite, dans de nombreux pays, la voie légale; pensez à l' article 508 aux États-Unis, au DDA au Royaume-Uni, etc.) serait de fournir le contenu qui est chargé / ajusté par votre lien sur une page distincte 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 :)

Clive
la source
Super montage sur le repli! Si nous utilisons l'URL ajax dans le href du lien, la page appelante peut-elle être un HTML affichable si javascript est désactivé? J'ai jamais eu print drupal_json_output($output)dans ma page d'appel ajax.
Sithu
4

Vous ne pouvez pas utiliser propre #.

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

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

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 nettoyage #

<a href="#">link</a>
David Sidler
la source
Fermer, cela produit <a href="# ">link</a>pour moi.
tyler.frankenstein
1

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

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

C'est essentiellement la même réponse que j'ai postée ici ... La définition fragmentd'un espace unique se convertira en un #, et $current_pathest incluse car sinon le lien sera simplement défini sur au www.example.com/#lieu de www.example.com/current-page#:

$current_path = check_url(drupal_get_path_alias($_GET['q']));
$link = l('link', $current_path, array('fragment' => ' '));
jerdiggity
la source
Il n'est pas nécessaire d'obtenir l'alias du chemin car l () se convertira en alias pour vous. Il est en fait préférable d'utiliser un chemin sans alias.
Rooby