web-dev-qa-db-ja.com

Nodecomment $ linksの変更

ノードがトピックの下にリストされているときに、ノードコメントのコメントに追加された「返信」リンクを変更しようとしています。私が抱えている問題は、ユーザーをインライン送信フォームに制限したいのですが、Nodecommentがスタンドアロンの返信ページにリンクを追加していることです。

Hook_link_alter()を使用してリンクを検証しようとしているときに、ノードコメントのコメントが通常のコメントと同様に扱われ、hook_link_alter()が実行されていないようです。次に例を示します。

/**
* Alter module links. 
*
*/
function mymodule_link_alter(&$links, $node) {

    // This is an example of altering links that works as expected
    if (isset($links['comment_add']) && node_access('create', $node)) {
      $links['comment_reply'] = array(
        'title' => t('reply'),
        'title' => t('Link altered'),
        'href' => 'http://example.com',
      );
    }

    // This is an example of altering nodecomment links failing.
    // When rendering a list of topic replies, the comment_reply link
    // will not be altered.
    if (isset($links['comment_reply']) && node_access('create', $node)) {
      $links['comment_reply'] = array(
        'title' => t('reply'),
        'title' => t('Link altered'),
        'href' => 'http://example.com',
      );
    }
}

(理想的には)テーマではなく、サイトのカスタムモジュールにパッケージ化できるソリューションを探しています。

3
Codeblind

hook_link_alter() のドキュメントを読む次の文を見つけます。

ノードまたはコメントのリンクがレンダリングされる前に変更を実行します。

使用しているフックの実装に最後の引数がありません:ドキュメントで指定されたフックの定義はhook_link_alter(&$links, $node, $comment = NULL)です。

ノードのすべてのコメントをレンダリングする関数である comment_render() のコードを見ると、データがからロードされた直後にhook_link_alter()が呼び出されていることがわかりますデータベース(そしてもちろんhook_link()の後)。

_if ($comment = db_fetch_object($result)) {
  $comment->name = $comment->uid ? $comment->registered_name : $comment->name;
  $links = module_invoke_all('link', 'comment', $comment, 1);
  drupal_alter('link', $links, $node, $comment);

  $output .= theme('comment_view', $comment, $node, $links);
} 
_

_hook_comment_は theme_comment_view() から呼び出されます。

_if ($visible) {
  $comment->comment = check_markup($comment->comment, $comment->format, FALSE);

  // Comment API hook
  comment_invoke_comment($comment, 'view');

  $output .= theme('comment', $comment, $node, $links);
}
else {
  $output .= theme('comment_folded', $comment);
}
_

hook_comment()の呼び出しで呼び出されるcomment_invoke_comment()は、表示されていないコメントに対しては呼び出されません。

作成したhook_link_alter()の実装は、特定のコメントのみを変更することになっている場合は、変更するコメントを少なくとも確認する必要があります。少なくとも、最後のパラメーター(_$comment_)がNULLではないことを確認する必要があります。これが発生した場合、フックが呼び出されてノードリンクが変更されますが、コメントリンクを変更する必要があるため、これは望ましくありません。

2
kiamlaluno

Drupalコメントのようにレンダリングされている場合、なぜ hook_comment() を使用しないのですか?

これがキックスタートです:

function mymodule_comment(&$a1, $op) {
  if ($op === 'view') {
    // $a1 is the comment object
  }
}
0
Alex Weber