「返信」リンクをボタンに置き換えたい。中間ソリューションとして、CSSを使用してリンクをボタンとしてスタイル設定しましたが、実際のhtml 'button'要素にしたいのです。その理由は、返信リンクが検索エンジンに表示されないようにするためです。代わりに、JavaScriptでボタンのクリックを処理したいのです。
drupalサイト: https://www.drupal.org/node/3317 でこの10年前のディスカッションを見つけました。
カスタムcomment.tpl.php
を作成し、$links['comment']['#links']['comment-reply']
配列を変更しようとしましたが、成功しませんでした。
以下の2つの方法があります。 2つ目は、_<button>
_要素をリンクのリストから取り出して、テンプレートの他の場所に配置する必要があることを除いて、どちらも同等に効果的です。これは、あなたが何をしようとしているのかによって、煩わしいか素晴らしいものです。
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()
をオーバーライドする必要があります。
リンクリストから「返信」を完全に削除してもかまわない場合は、この方法も機能します。コメントプリプロセッサを使用してリンクの設定を解除しますが、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; ?>
_
変更を有効にするためにキャッシュをクリアします。