web-dev-qa-db-ja.com

「返信」リンクをボタンに置​​き換える方法は?

「返信」リンクをボタンに置​​き換えたい。中間ソリューションとして、CSSを使用してリンクをボタンとしてスタイル設定しましたが、実際のhtml 'button'要素にしたいのです。その理由は、返信リンクが検索エンジンに表示されないようにするためです。代わりに、JavaScriptでボタンのクリックを処理したいのです。

drupalサイト: https://www.drupal.org/node/3317 でこの10年前のディスカッションを見つけました。

カスタムcomment.tpl.phpを作成し、$links['comment']['#links']['comment-reply']配列を変更しようとしましたが、成功しませんでした。

5
hennadiy.verkh

以下の2つの方法があります。 2つ目は、_<button>_要素をリンクのリストから取り出して、テンプレートの他の場所に配置する必要があることを除いて、どちらも同等に効果的です。これは、あなたが何をしようとしているのかによって、煩わしいか素晴らしいものです。

方法1:MYTHEME_links()をオーバーライドする

Drupal 7では、コアのtheme_links()関数をオーバーライドすることで、コメントの[返信]リンクを_<button>_要素に変えることができます。これはきれいではありませんが、効果的です。

以下の関数をテーマのtemplate.phpファイルに追加します(「MYTHEME」をテーマ名に置き換えます)。変更を有効にするためにキャッシュをクリアします。

_function MYTHEME_links($variables) {
  $links = $variables ['links'];
  $attributes = $variables ['attributes'];
  $heading = $variables ['heading'];
  global $language_url;
  $output = '';

  if (count($links) > 0) {
    // Treat the heading first if it is present to prepend it to the
    // list of links.
    if (!empty($heading)) {
      if (is_string($heading)) {
        // Prepare the array that will be used when the passed heading
        // is a string.
        $heading = array(
          'text' => $heading,
          // Set the default level of the heading.
          'level' => 'h2',
        );
      }
      $output .= '<' . $heading ['level'];
      if (!empty($heading ['class'])) {
        $output .= drupal_attributes(array('class' => $heading ['class']));
      }
      $output .= '>' . check_plain($heading ['text']) . '</' . $heading ['level'] . '>';
    }

    $output .= '<ul' . drupal_attributes($attributes) . '>';

    $num_links = count($links);
    $i = 1;

    foreach ($links as $key => $link) {
      $class = array($key);

      // Add first, last and active classes to the list of links to help out themers.
      if ($i == 1) {
        $class [] = 'first';
      }
      if ($i == $num_links) {
        $class [] = 'last';
      }
      if (isset($link ['href']) && ($link ['href'] == $_GET ['q'] || ($link ['href'] == '<front>' && drupal_is_front_page()))
         && (empty($link ['language']) || $link ['language']->language == $language_url->language)) {
        $class [] = 'active';
      }
      $output .= '<li' . drupal_attributes(array('class' => $class)) . '>';

      if (isset($link ['href'])) {
        if ($key == 'comment-reply') {
          // Special handling for comment 'Reply' link.
          $output .= '<button type="button">' . $link ['title'] . '</button>';
        }
        else {
          // Pass in $link as $options, they share the same keys.
          $output .= l($link ['title'], $link ['href'], $link);
        }
      }

      elseif (!empty($link ['title'])) {
        // Some links are actually not links, but we wrap these in <span> for adding title and class attributes.
        if (empty($link ['html'])) {
          $link ['title'] = check_plain($link ['title']);
        }
        $span_attributes = '';
        if (isset($link ['attributes'])) {
          $span_attributes = drupal_attributes($link ['attributes']);
        }
        $output .= '<span' . $span_attributes . '>' . $link ['title'] . '</span>';
      }

      $i++;
      $output .= "</li>\n";
    }

    $output .= '</ul>';
  }

  return $output;
}
_

壊す...

このコードのビット:

_      if (isset($link ['href'])) {
        // Pass in $link as $options, they share the same keys.
        $output .= l($link ['title'], $link ['href'], $link);
      }
_

に変更されました

_      if (isset($link ['href'])) {
        if ($key == 'comment-reply') {
          // Special handling for comment 'Reply' link.
          $output .= '<button type="button">' . $link ['title'] . '</button>';
        }
        else {
          // Pass in $link as $options, they share the same keys.
          $output .= l($link ['title'], $link ['href'], $link);
        }
      }
_

もちろん、それが_<form>_ラッパーであろうとonclick属性であろうと、必要に応じて出力をカスタマイズする必要があります。

残念ながら、theme('button'...)を使用することはできません。これは、入力要素を提供するためです。もちろん、theme_button()をオーバーライドすることでそれを変更できますが、サイトのすべての入力要素に影響するため、呼び出すにはtheme_links()をオーバーライドする必要があります。

方法2:MYTHEME_preprocess_comment()

リンクリストから「返信」を完全に削除してもかまわない場合は、この方法も機能します。コメントプリプロセッサを使用してリンクの設定を解除しますが、URLの値を取得して新しい変数に詰める前には使用しません。

もう一度、以下の関数をテーマのtemplate.phpファイルに追加します(「MYTHEME」をテーマ名に置き換えます)。

_function MYTHEME_preprocess_comment(&$variables) {
  if (isset($variables['content']['links']['comment']['#links']['comment-reply'])) {
    $variables['reply_url'] = $variables['content']['links']['comment']['#links']['comment-reply']['href'];
    unset($variables['content']['links']['comment']['#links']['comment-reply']);
  }
}
_

次に、これ(またはそのバリエーション)を、comment.tpl.phpのコピーのどこにでも表示したい場所に追加します。

_<?php if (isset($reply_url)): ?>
<button onclick="window.location.href='<?php print $reply_url ?>'">Reply</button>
<?php endif; ?>
_

変更を有効にするためにキャッシュをクリアします。

5
othermachines