Друзья, по умолчанию Друпал (видимо все-таки друпал, а не тема) выводит комментарии в виде "Автор Дата создания". Трабла в том, что "автор" ссылается на страницу профиля юзера, а дата создания является прямой ссылкой на комментарий в виде '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'" дал только строку, которая содержится в строке автора ноды.
Комментарии
<?php/**
* Entity uri callback.
*/
function comment_uri($comment) {
return array(
'path' => 'comment/' . $comment->cid,
'options' => array('fragment' => 'comment-' . $comment->cid),
);
}?>
comment.module line 153
Спасибо большое!
Блин, не могу найти переменную для подстановки урла ноды.
$node_url выводит почему-то cid. О_о
UPD: хм, вот это:
<?php 'path' => 'node/' . $node->nid . $comment->cid, ?>
выводит первый коммент с алиасом ноды, а второй - без.Модулей/template.php затрагивающих комменты нету?
Comment.tpl.php выдаёт информацию генерированную здесь:
<?php
$variables['author'] = theme('username', array('account' => $comment));
$variables['created'] = format_date($comment->created);
?>
Только ансет заголовка комментария.
Хм, что бы это значило?!
У меня undefined variable показывает в логах, когда вставляю туда, к примеру, $node->nid , но в то же время $node->nid используется в строках файла ниже - может быть, переменная определяется где-то ниже просто (надеюсь, не чепуху несу)?
Вообще, вот это:
<?php 'node/' . $node->nid' ?>
- дает результат в первом комменте, во втором подставляется cid: 'cid#comment-cid'. Но при этом также показывает undefined variable.Возможно стоит брать $comment->nid?
через
arg(1)
попробуйте nid вытащитьТогда путь выглядит так 'nidcid#comment-cid'
Стесняюсь спросить, но я не умею так.
<?php $nid = arg(1);?>
Андрей, и снова стесняюсь - полная строка должна выглядеть так:
<?php 'path' => 'node/' . $nid . $comment->cid, ?>
? Тогда также в первом комменте выводится правильно с алиасом, а во втором - 'node/cid#comment-cid'.
UPD: только что заметил, что первый коммент все-таки алиасом ссылается на совсем другую ноду, с которой сабжевая связана разве что общими терминами. Чудеса какие-то!
comment/42 =
<?php 'path' => 'comment/' . $comment->cid, ?>
node/nid =
<?php 'path' => 'node/' . $comment->nid, ?>
Или я что-то не так понял из описанного в первом посте?
Вот тут: переменная $comment->nid уже содержит nid ноды - т.е. если вставить просто:
<?php 'path' => $comment->nid, ?>
, то путь будет: 'nid#comment-cid'На примере: находимся на странице ноды, которая имеет урл: 'my_path', в этой ноде 2 коммента. Нужно, чтобы ссылки в заголовках обоих комментов были такого вида: 'my_path#comment-cid' вместо текущих: 'comment/cid#comment-cid'.
<?php 'path' => request_path(), ?>
Нашел подобный вопрос и ответ Андеда, но ссылки не меняются, а в логах: Notice: Undefined index: uri в функции corolla_preprocess_node()
Возможно так сразу не получится, надо будет определить путь в переменную, например $mypath = request_path();, а потом уже подставить её в код. Это должно вернуть aliased path текущей страницы.
Примерно понял! Пошел учиться.
Большое Спасибо за помощь!
Удалось ли решить проблему?
Нет.
Вернее, удалось, но несколько другим способом - на другом сайте делал комменты на отдельной странице (модуль talk не подошел).
С помощью вьюхи вывел страницу комментов с полями, и в полях заменил ссылки на сами комменты (якоря) на такие, которые нужны (node/[nid]#c-[cid]). В принципе ничего не должно помешать таким же образом вывести блок с такими же комментами под нодой.
Если нужно, могу кинуть экспортнутую вьюху.
Тоже занимаюсь этой темой, правлю comment.module
Функция на строке 1029. Если что получиться отпишу.
Только что исправлял у себя на сайте эти ссылки.
В 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>';
}
Пока сдвигов нету, народ подключайтесь!
Что не кто не решил данный вопрос?
У меня ничего не произошло после данного кода.
Хук вообще вызывался?
Эээ... а как проверить это?
ну вставить туда что нибудь:
drupal_set_message('Работает');
кэш сбосить не забудь
Не знаю, в любое ли место можно вставлять
drupal_set_message
, но вот такой полный код модуля:/**
* 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>';
}
Не выводит тестовое сообщение.
А не, вру, работает! Выводит сообщение. Я так понял сий код не делает новой переменной, а переопределяет
$permalink
? Т.е. в шаблоне ничего менять не надо?Переопределяет $permalink и $submitted. Если они уже есть в шаблоне, то ничего менять не надо.
Да вот что-то не переопределил.
Так не может быть. my_comment_link это название темы/модуля ?
Возможно, где после этого ещё раз переопределяются.
Можно для проверки добавить ещё одну переменную в хук
$vars['permalink_2'] = 'Ещё одна ссылка';
и потом вывести ее в шаблоне.
Я так сделал:
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