web-dev-qa-db-ja.com

テーマ機能によって、特定のメニューのリンク内のアンカー要素にCSSクラス属性を追加する方法

私は何かを見逃していますか、それとも不可能ですかリンクアンカーHTML要素のテーマを設定します_<ul class="main-menu"><li><a href="" class="put something in here"></li></ul>_テーマレベル(テーマ機能)のターゲットメニューの場合

_<li>_要素とメニューブロック要素にHOOK_menu_link_MENU_NAME()でテーマを設定できます。それを私に指摘してくれた David Thomas に感謝します。しかし、ネストされたアンカー自体を対象とすることはできませんでした。 Devel配列の出力とdrupal.orgのドキュメントでは、theme_menu_item_link()、_theme_links_、theme_link()などにしかアクセスできませんでしたが、ここではエレガントに表示する機会がありません。アンカー要素のCSSクラスの動的値を受け入れますか?

特定のメニューのul> liの_<a>_要素にスタイルクラス属性を追加したい(すべてのメニューではなく、それがtheme_links()が行うこと)...


ノート:

  • 必要なcssクラスはレベル依存であり、上部のhtml要素に適用されるべきではないため、上部の要素を変更することによるネストされたcssターゲティングはここではオプションではありません。

  • そして、はい、私は menu_attributes モジュールを知っています。それは私が頻繁に使用する素晴らしいモジュールです。しかし、アプローチは異なります。 DBのメニューリンクデータを変更するのではなく、出力のみを変更します。

  • Drupal.orgのtheme_links()関数には、そのスコープとその動作に関するいくつかの問題を指摘する問題があります: https://drupal.org/node/588148

    theme_links() :一連のリンクのHTMLを返します。 => theme_links($ variables) https://drupal.org/node/588148 => theme_links()は実際にはテーマ化できない[#588148] => Drupalコア、テーマシステム、通常、作業が必要、49コメント、1 IRC言及

  • 別のオプションは、アンカー要素内に_<span>_要素を追加することです。私はすでにノードオブジェクトに対してこれを行いましたが、これがここで可能かどうか、これが正しい方法であるかどうかはわかりません。

  • 編集:ここに2つの質問があります- 1 - 2 -stackexchangeでatmを読んでいます。多分それはすぐに私を啓発するでしょう...(ありがとう Clive 、私に2番目のものを指摘してくれました。)

1
nilsun

this に基づくと、かなり単純なはずです。

function THEME_menu_link($vars) {
  $element  = $vars['element'];
  $menuname = $element['#original_link']['menu_name'];

  if ($element['#below']) {
    $sub_menu = drupal_render($element['#below']);
  }

  // This is where you check the menu name and assign the class.
  if($menuname == 'main-menu') {
    $element['#localized_options']['attributes']['class'][] = 'main-menu-class-whatever';
    $element['#localized_options']['attributes']['class'][] = 'another-class';
  }

  $output = l($element['#title'], $element['#href'], $element['#localized_options']);

  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . '</li>';
}
3
Beebee

私はおそらくこれを上下逆さまに見ていますが、このメニューを自分でレンダリングしていますか。たとえば、どこかでtheme('links', $variables)を呼び出しており、簡単に_$variables_を変更できますか?

もしそうなら、theme_links()関数自体をざっと見ると、次のコメントがわかります...

_/**
 * Returns HTML for a set of links.
 *
 * @param $variables
 *   An associative array containing:
 *   - links: An associative array of links to be themed. The key for each link
 *     is used as its CSS class. Each link should be itself an array, with the
 *     following elements:
 *     - title: The link text.
 *     - href: The link URL. If omitted, the 'title' is shown as a plain text
 *       item in the links list.
 *     - html: (optional) Whether or not 'title' is HTML. If set, the title
 *       will not be passed through check_plain().
 *     - attributes: (optional) Attributes for the anchor, or for the <span>
 *       tag used in its place if no 'href' is supplied. If element 'class' is
 *       included, it must be an array of one or more class names.
 *     If the 'href' element is supplied, the entire link array is passed to
 *     l() as its $options parameter.
 *   - attributes: A keyed array of attributes for the UL containing the
 *     list of links.
 *
 *  (rest of comment deleted)
 */
_

上記のコメントでも言及されているように、リンク自体を作成しているときに、コードの下の方にあるように、リンクごとにattributesキーに入力する必要があることを示しています。 _$link_パラメータ全体として_$options_パラメータとして、たとえば...

_$output .= l($link['title'], $link['href'], $link);
_

したがって、特別なクラスを必要とするリンクに対して、attributesのキーを持つ配列を指すclassキーを作成し、そのキー自体がその名前を含む配列を指す場合、このクラスはアンカーに追加されます。

3
Jimajamma