Изменить ссылку комментария с 'comment/cid#...' на 'node_url/#...' (Drupal 7)

Главные вкладки

Аватар пользователя Айдар Айдар 21 января 2012 в 21:07

Друзья, по умолчанию Друпал (видимо все-таки друпал, а не тема) выводит комментарии в виде "Автор Дата создания". Трабла в том, что "автор" ссылается на страницу профиля юзера, а дата создания является прямой ссылкой на комментарий в виде 'comment/cid#comment-cid', что, имхо, не логично, и потому хочу переделать ссылку с "Дата создания" на 'node_url#comment-cid'.

Например, если нода имеет путь 'my-node', а id коммента == 42, то ссылка на коммент по умолчанию выводится так: 'comment/42#comment-42', а нужно так: 'my-node#comment-42'.

К сожалению, в comment.tpl.php содержится переменная '$submitted', которая выводит уже сразу все вместе. А с comment.module такое:
<?php $variables['submitted'] = t('Submitted by !username on !datetime', array('!username' => $variables['author'], '!datetime' => $variables['created'])); ?>

Поиск по переводу "Submitted by !username on !datetime'" дал только строку, которая содержится в строке автора ноды.

Комментарии

Аватар пользователя Darteg Darteg 21 января 2012 в 21:13
<?php/**
 * Entity uri callback.
 */
function comment_uri($comment) {
  return array(
    'path' => 'comment/' . $comment->cid,
    'options' => array('fragment' => 'comment-' . $comment->cid),
  );
}?>

comment.module line 153

Аватар пользователя Айдар Айдар 21 января 2012 в 22:02

Блин, не могу найти переменную для подстановки урла ноды. Sad
$node_url выводит почему-то cid. О_о

UPD: хм, вот это: <?php  'path' => 'node/' $node->nid $comment->cid?> выводит первый коммент с алиасом ноды, а второй - без.

Аватар пользователя Darteg Darteg 21 января 2012 в 22:31

Модулей/template.php затрагивающих комменты нету?

Comment.tpl.php выдаёт информацию генерированную здесь:

<?php
$variables
['author']    = theme('username', array('account' => $comment));
$variables['created']   = format_date($comment->created);
?>
Аватар пользователя Айдар Айдар 21 января 2012 в 23:40

"Darteg" wrote:
Модулей/template.php затрагивающих комменты нету?

Только ансет заголовка комментария.

"Darteg" wrote:
Comment.tpl.php выдаёт информацию генерированную здесь

Хм, что бы это значило?! Smile
У меня undefined variable показывает в логах, когда вставляю туда, к примеру, $node->nid , но в то же время $node->nid используется в строках файла ниже - может быть, переменная определяется где-то ниже просто (надеюсь, не чепуху несу)?

Вообще, вот это: <?php 'node/' $node->nid' ?> - дает результат в первом комменте, во втором подставляется cid: 'cid#comment-cid'. Но при этом также показывает undefined variable.

Аватар пользователя Айдар Айдар 22 января 2012 в 0:04

"Darteg" wrote:
Возможно стоит брать $comment->nid?

Тогда путь выглядит так 'nidcid#comment-cid'

"Andruxa" wrote:
через arg(1) попробуйте nid вытащить

Стесняюсь спросить, но я не умею так. Sad

Аватар пользователя Айдар Айдар 22 января 2012 в 0:37

Андрей, и снова стесняюсь - полная строка должна выглядеть так:
<?php 'path' => 'node/' $nid $comment->cid?>
? Тогда также в первом комменте выводится правильно с алиасом, а во втором - 'node/cid#comment-cid'.

UPD: только что заметил, что первый коммент все-таки алиасом ссылается на совсем другую ноду, с которой сабжевая связана разве что общими терминами. Чудеса какие-то!

Аватар пользователя Darteg Darteg 22 января 2012 в 0:37

comment/42 = <?php 'path' => 'comment/' $comment->cid?>

node/nid = <?php 'path' => 'node/' $comment->nid?>

Или я что-то не так понял из описанного в первом посте?

Аватар пользователя Айдар Айдар 22 января 2012 в 0:49

"Darteg" wrote:
node/nid = <?php 'path' => 'node/' . $comment->nid, ?>

Вот тут: переменная $comment->nid уже содержит nid ноды - т.е. если вставить просто: <?php 'path' => $comment->nid?>, то путь будет: 'nid#comment-cid'

"Darteg" wrote:
Или я что-то не так понял из описанного в первом посте?

На примере: находимся на странице ноды, которая имеет урл: 'my_path', в этой ноде 2 коммента. Нужно, чтобы ссылки в заголовках обоих комментов были такого вида: 'my_path#comment-cid' вместо текущих: 'comment/cid#comment-cid'.

Аватар пользователя Darteg Darteg 22 января 2012 в 1:40

"Darteg" wrote:
<?php 'path' => request_path(), ?>

Возможно так сразу не получится, надо будет определить путь в переменную, например $mypath = request_path();, а потом уже подставить её в код. Это должно вернуть aliased path текущей страницы.

Аватар пользователя Айдар Айдар 3 марта 2012 в 11:30

"Я" wrote:
Нет.

Вернее, удалось, но несколько другим способом - на другом сайте делал комменты на отдельной странице (модуль talk не подошел).

С помощью вьюхи вывел страницу комментов с полями, и в полях заменил ссылки на сами комменты (якоря) на такие, которые нужны (node/[nid]#c-[cid]). В принципе ничего не должно помешать таким же образом вывести блок с такими же комментами под нодой.

Если нужно, могу кинуть экспортнутую вьюху.

Аватар пользователя Ch Ch 4 марта 2012 в 11:07

Только что исправлял у себя на сайте эти ссылки.
В comment.tpl.php есть переменная $permalink, в которой содержится постоянная ссылка на комментарий.

/**
 * Override or insert variables into the comment template.
 */

function HOOK_preprocess_comment(&$vars) {

  // Формируем постоянную ссылку на комментарий.
  // @see http://www.drupal.ru/node/74903#comment-455364
  $vars['permalink'] = l(
    '#' . $vars['id'],
    'node/' . $vars['elements']['#comment']->nid,
    array(
      'fragment' => 'comment-' . $vars['elements']['#comment']->cid,
      'attributes' => array('class' => array('permalink'), 'rel' => 'bookmark'),
    )
  );

  // Автор и дата.
  $vars['submitted'] = $vars['author'] . ' <span class="submitted">' . $vars['created'] . '</span>';
}

Аватар пользователя Айдар Айдар 4 мая 2012 в 21:32

Не знаю, в любое ли место можно вставлять drupal_set_message, но вот такой полный код модуля:

<?php

/**
 * Override or insert variables into the comment template.
 */

function my_comment_link_preprocess_comment(&$vars) {
 
  // @see http://www.drupal.ru/node/74903#comment-455364
  $vars['permalink'] = l(
    '#' . $vars['id'],
    'node/' . $vars['elements']['#comment']->nid,
    array(
      'fragment' => 'comment-' . $vars['elements']['#comment']->cid,
      'attributes' => array('class' => array('permalink'), 'rel' => 'bookmark'),
    )
  );
 drupal_set_message('Работает');
  $vars['submitted'] = $vars['author'] . ' <span class="submitted">' . $vars['created'] . '</span>';
}

Не выводит тестовое сообщение.

Аватар пользователя Айдар Айдар 4 мая 2012 в 21:34

А не, вру, работает! Выводит сообщение. Я так понял сий код не делает новой переменной, а переопределяет $permalink? Т.е. в шаблоне ничего менять не надо?

Аватар пользователя Ch Ch 5 мая 2012 в 12:06

Так не может быть. my_comment_link это название темы/модуля ?
Возможно, где после этого ещё раз переопределяются.
Можно для проверки добавить ещё одну переменную в хук
$vars['permalink_2'] = 'Ещё одна ссылка';
и потом вывести ее в шаблоне.

Аватар пользователя sadad sadad 8 мая 2012 в 16:33

Я так сделал:

comment.tpl.php

Вывод: Subject с якорем, затем всё остальное + у меня еще ip комментатора для админов выводится

В роботс.ткст запретил всё, что /comments/ (у меня успели эти ссылки проиндексироваться, пока заметил эту бяку)

"<?php" в начале и "?>" в конце — зачем-то редактор вставляет - их убрать

<?php

<article<?php print $attributes?>>
  <header>
    <?php print render($title_prefix); ?>
    <?php if ($title): ?>
    <a name="<?php print $comment->cid ?>"></a>
    <a href="#<?php print $comment->cid ?>"><h3<?php print $title_attributes;?>><?php print $comment->subject?>
        </h3></a>

    <?php endif; ?>
    <?php print render($title_suffix); ?>
    <?php if ($new): ?>
      <em class="new"><?php print $new ?></em>
    <?php endif; ?>
    <?php if (isset($unpublished)): ?>
      <em class="unpublished"><?php print $unpublished?></em>
    <?php endif; ?>
  </header>

  <?php print $picture?>

  <footer class="comment-submitted">
   <?php
      
print t('Submitted by !username on !datetime',
      array(
'!username' => $author'!datetime' => '<time datetime="' $datetime '">' $created '</time>'));
    
?>
    <?php 
    
if (user_access('administer comments')){
        if (
$comment->uid == '0'){
            
$comment_host_query "SELECT hostname FROM {comment} WHERE cid='" $comment->cid "';";
            if (
$comment_host_result db_query($comment_host_query)->fetchField()){
                echo 
' | IP: '$comment_host_result;
                }
            }
    }
    
?>
  </footer>

  <div<?php print $content_attributes?>>
    <?php
      hide
($content['links']);
      print 
render($content);
    
?>
  </div>

  <?php if ($signature): ?>
    <div class="user-signature"><?php print $signature ?></div>
  <?php endif; ?>

  <?php if (!empty($content['links'])): ?>
    <nav class="links comment-links clearfix"><?php print render($content['links']); ?></nav>
  <?php endif; ?>

</article>

?>

UPD^ Забыл сказать... Надо еще в блок коммент ресент (если используете) ссылки поменять. Это уже через Views