web-dev-qa-db-ja.com

l()で空のアンカーのみのリンクを作成するにはどうすればよいですか?

私はl()を使用して、ajax呼び出しの目的で<a href='#' ...>のようなものを取得しようとしています。 https://stackoverflow.com/questions/1698453/drupal-creating-anchor-only-link-with-l は適切なものに非常に近い-l()のオプションを使用する'fragment' => 'foo'のようなリンクを生成するには<a href='#foo'...>のようにします-しかし、クリーンな「#」を取得しようとしています。これを行う方法はありますか、それともフラグメントの一部として何かを入れて心配する必要はありませんか?

20
Jim Miller

フラグメントでクリーンな「#」を使用できない場合は、_<a href="javascript:">link</a>_を使用することをお勧めします。
「javascript:」または「javascript:void(0)」をhref属性に追加すると、_<a>_タグは何もしません。次に、「onclick」をリンクにバインドして、ajaxの目的に使用できます。
これは、以下のようにl()関数を使用して実装できます。

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

PHP型キャストポップクイズの時間! (完全な開示:私のオフィスでは勝てませんでした)。

既に指摘したように、これはl()のコードであり、以下が関係しています。

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

だからここに質問があります:空の文字列にキャストする値は何ですか?

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

答えは:FALSE

だから、これを試すことができます:

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

それは私たちに与えます:

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

ありがたいことに、external => TRUEを渡すことで、先頭のスラッシュを取り除くことができます。

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

それは私たちに与えます:

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

ブーム。 HTML文字列を手動で連結しないようにするために行うこと、

追記:

通常の状況では、このようなリンクをphpから印刷することを実際にお勧めするかどうかはわかりません。 JavaScriptがなければ、そのリンクが実行することで、ユーザーはページの上部に移動します( これは、ちょっとした驚きですが、動作が特定されています )。それはおそらくJavaScriptなしで動作するどこかを指すはずです。

リンクreallyがJavaScriptでのみ意味がある場合(jsのみのスライドショーのコントロールなど)、JavaScriptを使用してページへのリンクを追加することをお勧めします。または、本当にソースに入れたい場合は、デフォルトでdisplay:noneになっていることを確認してください。 Drupalは、JavaScriptが使用されているときにそれを表示するために、htmlに.jsクラスを持っています。

15

残念ながら url() 関数(これはl()が内部で呼び出します)は、次の行で空のフラグメントが発生する可能性をかなり高めています。

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

フラグメントが空の文字列でないことを確認します。これは、クリーンな#を取得するために渡す必要があるものです。最も簡単な解決策は、ページ内の適切な要素のIDを選択し、代わりにフラグメントに使用することです(またはSithuが述べたようにjavascript:void)。

ただし...最もアクセスしやすい方法(そして、多くの国では、合法的な方法。米国では セクション508 、英国では DDA などと考えてください)別のページのリンクによってロード/調整されているコンテンツを提供し、代わりにそのページのURLをリンクのhrefとして使用します。次に、JavaScriptを使用して、リンク上のイベントが、ページが有効になっているブラウザーのページを実際にリダイレクトしないようにします。

これにより、JavaScriptを使用しないユーザー向けのフォールバックコンテンツが作成され、合法性が維持され、すべての人と犬を幸せに保つことができます。

7
Clive

クリーン#を使用できませんでした。

ただし、space symbolの後に#を追加することもできます。

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

私は同じ問題を抱えていましたが、解決策のどれも満足できなかったので、私は自分の問題を思いつきました:

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

これにより、クリーンな#

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

代わりにレンダータイプhtml_tagを使用します。これは、レンダーlinkがDrupalから特別な注意を引くと考えているためです。欠点はショートカット関数がないため、レンダー配列を使用する必要があることです。

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

これは基本的に私が投稿した答えと同じです here ... fragmentを単一のスペースに設定すると#に変換され、そうでない場合は$current_pathが含まれますリンクはwww.example.com/#ではなくwww.example.com/current-page#に設定されます。

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