Как пофиксить "Добавить комментарий Читать далее"

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

Аватар пользователя beer_destroyer beer_destroyer 30 марта 2007 в 11:12

Как пофиксить сие безобразие? Ну не логично предлагать оставлять комментарии человеку, не прочитавшему статью до конца.

А учитывая "альтернативное мышлении" (идиотизм в неполиткорректном языке) некоторых пользователей - штука потенциально опасная.

Комментарии

Аватар пользователя Valeratal Valeratal 31 марта 2007 в 15:00

хм, вот с главной у меня не убралось добавить комментарии, но зато в конце статьи добавилось "читать далее" Smile

А вообще в comment.module заменяемая строка встречается 2 раза, которую править нужно?

Аватар пользователя beer_destroyer beer_destroyer 7 мая 2007 в 10:47

else {
if ($node->comment == COMMENT_NODE_READ_WRITE && !$node->readmore) {
if (user_access('post comments')) {
$links['comment_add'] = array(
'title' => t('Add new comment'),
'href' => "comment/reply/$node->nid",
'attributes' => array('title' => t('Add a new comment to this page.')),
'fragment' => 'comment-form'
);
}
else {
$links['comment_forbidden']['title'] = theme('comment_post_forbidden', $node->nid);
}
}
}
}
}
==============
Так понятнее? Это для 5.1. Без гарантий, естественно, но у меня работает. См. вложение если так непонятно.

Аватар пользователя beer_destroyer beer_destroyer 8 мая 2007 в 4:06

А без моветона черезж0пно.

Получается, я вначале должен сформировать массив, затем внутри THEME_links как-то узнать, в тизере ли я выдаюсь - я так и не понял как это сделать идеологически правильно (как, кстати?). То есть можно скопировать, например THEME__node, добавив что-то типа variable_set('curteaserstatus',$teaser); Затем в THEME_links перебрать уже сформированный массив$links, рискуя, что завтра кто-то что-то изменит...

То есть сделать тройную работу и словить тройные глюки. Тогда как хаком модулей я это делаю добавлением пары переменных в условие. Например в quote.module было:

elseif ($type == 'node' && in_array($post->type, variable_get('quote_node_types', array('blog', 'story'))) && $post->comment == COMMENT_NODE_READ_WRITE && variable_get('quote_node_link_display', 1)) {

стало:

elseif ($type == 'node' && !$main && in_array($post->type, variable_get('quote_node_types', array('blog', 'story'))) && $post->comment == COMMENT_NODE_READ_WRITE && variable_get('quote_node_link_display', 1)) {

И нет больше ссылки "цитировать" при выдаче тизера.

Аватар пользователя SadhooKlay SadhooKlay (не проверено) 8 мая 2007 в 5:40

Так. Народ, что то вы тексты пишите большие и слишком не в тему.

Создаёте в каталоге с темой файл node.tpl.php.
В нем пишите

<div class="<?php print $node_classes ?>" id="node-<?php print $node->nid; ?>">
ХХХ
</div>

Заменя ХХХ на следующие варианты (можно комбинировать):

А) Заголовок статьи, в виде ссылки:

  <?php if ($page == 0): ?>
    <h2 class="title">
      <a href="<?php print $node_url ?>"><?php print $title; ?></a>
    </h2>
  <?php endif; ?>

Б) Разрешаем картинки если они есть.

<?php if ($picture) print $picture; ?>  

В) надписи типа "On пн, 07/05/2007 - 09:47 beer_destroyer says:"

  <?php if ($submitted): ?>
    <span class="submitted">
      <?php print $submitted ?>
    </span>
  <?php endif; ?>

Г) Ссылка на раздел словаря (если модкль таксономии включён)

  <?php if (count($taxonomy)): ?>
    <div class="taxonomy"><?php print t(' in ') . $terms ?></div>
  <?php endif; ?>

Д) Тело материала

  <div class="content">
    <?php print $content; ?>
  </div>

Е) Ссылки типа "Читать далее, Оставить комментарий"

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

Это конечно не всё, но отправной точкой может вам послужить в лёгкую.
Всё, что не укажете, отображаться не будет.

Естественно это не панацея.
Можно менять классы, id, исключать/включать тэги и прочее.

Анализируйте больше чужой код товарищи : )
И быть может такие вопросы отпадут сами собой.

Учитесь, пока я жив, а то вон, разгонка киллера наймёт скоро : )

Аватар пользователя beer_destroyer beer_destroyer 8 мая 2007 в 13:22

>>>Народ, что то вы тексты пишите большие и слишком не в тему.
Вообще-то я это могу отнести и к вам. В написанном Вами нет ничего про решение конкретной задачи. Описаны методы, которые работают, но не там и не так. Так что звиняйте, коротко не получается.

Давайте я еще раз объясню: модули quote и comments выводят "идеологически неправильные" линки: предлагают соответственно цитировать и коментировать не показав полную ноду. Ваше решение не дает возможность вывести "читать далее" и не вывести "цитировать" и "добавить комментарий": или все или ничего. Я решил это хаком модулей, потому как иное показалось мне уж больно черезж0пным.

Вопрос по переопределению: прототип функции THEME_links($links, $attributes = array('class' => 'links')) Номера ноды в ней нет. Информации, выводится ли нода полностью тоже. Есть функция THEME_node($node, $teaser = FALSE, $page = FALSE) - где все это имеется, но нет линков. Движок дает нам возможность переопределить и передать нужное через variable_set/variable_get или глобальные переменные. Вопрос: есть ли еще методы? Как лучше поступать в таких случаях?

Вопрос #2: массив $links содержит подготовленные к выдаче линки. Мы можем:
1. Убить ненужное по ссылкам - хреново
2. По тексту - еще хуже.
Вопрос: как идеологически правильно избавиться от хаков модулей в этом конкретном случае?

Аватар пользователя gradP gradP 23 октября 2007 в 1:12

А кстати вопрос, никто не придумал все-таки метода без правки кода ядра?
Не люблю я это дело и вам не советую.

Аватар пользователя Valeratal Valeratal 24 октября 2007 в 21:53

у меня есть такое соображение
Есть такой модуль, content template, он позволяет вставлять что либо в ноду или в тизер
Я в ноду вставляю рекламу директовскую к пример
Так вот, можно попробовать вырезать тот код, который отвечает за вывод данной строки (про комментарии) и запихать его именно в ноду (тогда в тизере его не будет)

если подскажите, какой код выводит "добавить комментарии" или "зарегтесь чтобы добавлять", могу попробовать у себя

в node.tpl нашел только про print $links

Аватар пользователя Onza Onza 15 ноября 2007 в 6:04

Было:
if ($node->comment == COMMENT_NODE_READ_WRITE) {
Стало
if ($node->comment == COMMENT_NODE_READ_WRITE && !$node->readmore) {

ок, это работает для зарегистрированных юзеров, для гостей в links все равно выводится после каждого тизера "Войдите в систему или зарегистрируйтесь, чтобы получить блабла"... Интересно, как это убрать?

Аватар пользователя maxsim maxsim (не проверено) 16 января 2008 в 0:44

>>> А без моветона черезж0пно. Получается, я вначале должен сформировать массив, затем внутри THEME_links как-то узнать, в тизере ли я выдаюсь - я так и не понял как это сделать идеологически правильно (как, кстати?).

хм... давайте подумаем:)
У нас есть две ссылки, например, следующего вида:
"Комментировать" –> "http://my-site/?q=comment/reply/3#comment-form"
"Читать далее" –> "http://my-site/?q=node/3"

Обе эти ссылки содержатся в общедоступном массиве $links и обрабатываются функцией theme_links, которую можно переопределить, создав в директории своей темы файл template.php с функцией phptemplate_links.

Задача состоит в том, чтобы:
1. При переборе всего массива $links, определить, указывает ли данная ссылка на форму комментирования, т.е., например, содержит строку «comment/».
2. Если указывает, то определить, какому «ноду» принадлежит форма комментирования, на которую указывает ссылка, т.е. «вытащить» из ссылки номер «нода» (в нашем случае номер «нода» – 3).
3. Определить номер «нода» в url текущей страницы, например, найдя число после строки «node/» в $_GET[“q”] (текущий путь).
4. Если номер «нода» в ссылке не соответствует номеру «нода» в url текущей страницы, удалить ссылку из массива $links.
5. Продолжить перебор массива.

Это теория, а практика вот:
1. Создаём в директории своей темы файл template.php.
2. Содержимое файла:
<?php
// Переопределение функции theme_links($links, $attributes)
function phptemplate_links($links, $attributes = array("class" => "links"))
{
// Перебор массива $links
foreach ($links as $key => $link) {
if (!isset($link["href"])) continue;
// Определение ссылок, которые указывают на форму комментирования
preg_match('{^comment/\\S*/?(\\d+)(#[^#\\s/]*)?$}', $link["href"], $pockets);
if (!isset($pockets[1])) continue;
$node_num = $pockets[1]; // Определение номера «нода» в ссылке
//
// Определение номера «нода» в url текущей страницы
preg_match('{^([^#\\s/][^#\\s]+/)?node/(\\d+)(#[^#\\s/]*)?$}', $_GET["q"], $pockets);
//
/* Удаление ссылки из массива $links, если номер «нода» в url не найден (например, текущая страница – главная, т.е. $_GET[“q”] == “node”) или номер «нода» в ссылке не соответствует номеру «нода» в url */
if (!isset($pockets[2]) || ($node_num != $pockets[2])) unset($links[$key]);
}
/* Вызов theme_links для окончательной обработки массива $links Drupal’ом */
return theme_links($links, $attributes);
}
?>

В простых ситуация, думаю, этого вполне хватит. При необходимости, скорее всего, нужно менять только регулярные выражения в коде. Если не устроит скорость работы, можно попробовать использовать функции поиска подстрок (например, strpos) вместо регулярных выражений и функции preg_match.

P.S. Не особо «черезж0пно» на мой вкус:)
P.P.S. beer_destroyer, а если возникнет необходимость в обновлении Drupal’а, вы будете потом опять лезть в код ядра и модулей и хакать? А если к тому моменту уже кучу хаков наделаете?

Аватар пользователя maxsim maxsim (не проверено) 16 января 2008 в 3:14

Нужно, чтобы строка "добавить комментарий" осталась, но стала обычной строчкой или что?

Аватар пользователя maxsim maxsim (не проверено) 16 января 2008 в 3:16

А что должно меняться для гостей? У меня для них всегда только «Читать далее» и было.

Аватар пользователя Valeratal Valeratal 16 января 2008 в 8:00

нужно, это просто мечта, чтобы внизу тизеров вообще, ни для каких ролей не выводилось добавить коментарии
а в полной естест-но выводилось

Если у Вас для гостей только читать далее, то наверно показ коментариев для них отключен?

Аватар пользователя maxsim maxsim (не проверено) 16 января 2008 в 12:36

>>> Если у Вас для гостей только читать далее, то наверно показ коментариев для них отключен?

Ну да, я забыл про права доступа для гостей… Но это ничего не меняет:)

Смотрите, что делает данный код… Когда гость заходит на сайт, он видит тизеры, под которыми располагается любые ссылки (по умолчанию, только ссылку «Читать далее») кроме ссылки «Комментировать» (если гость имеет права на комментирование). В любых других местах (например, в категориях, результатах поиска и т.д.) тизеры выводятся без ссылки «Комментировать». Когда гость кликает по ссылке «Читать далее», он переходит на страницу «нода», где уже есть полный текст и внизу ссылка «Комментировать». При клике по ней появляется та же страница «нода», но уже внизу с формой комментирования. Причем, хочу отметить, что раньше над формой располагалась ссылка «Комментировать», которая вела на эту же форму, что, как мне кажется, абсолютно лишнее. Теперь она также пропадает, как и под тизерами.

Для зарегистрированных все тоже самое. Скриншоты нужны?

У вас также или что-то не так?

Аватар пользователя maxsim maxsim 16 января 2008 в 22:45

Проверялось много раз на drupal-5.2 и drupal-5.5. Там работало. Пока не понимаю что у вас не так:(

Кстати, если есть необходимость не показывать количество уже имеющихся комментариев под тизерами (ссылка на комментарии вида "n комментарий(я/ев)"), необходимо в приведенном коде вместо строки
preg_match('{^comment/\\S*/?(\\d+)(#[^#\\s/]*)?$}', $link["href"], $pockets);
написать
if (strpos($link["fragment"], "comment") === false) continue;
preg_match('{^[^#\\s/][^#\\s]*/(\\d+)$}', $link["href"], $pockets);

Также можно не удалять такую ссылку, а сделать её обычной строкой. Но для этого, сначала необходимо искать в $link["fragment"] строчку "comments" и удалять не весь элемент $links[$key], а только $links[$key]["href"]. После этого уже искать все остальные линки, содержащие строчку "comment" или "comment-form" и удалять элементы полностью.

Аватар пользователя maxsim maxsim 10 ноября 2015 в 11:45

Придумал новый более изящный метод решения текущей проблемы!

Итак, чтобы решить проблему ссылок комментирования нужно… создать свой модуль с двумя функциями, реализующими ловушки hook_link и hook_link_alter.

Код модуля:
<?php
// Реализация ловушки hook_link
// Формирует дополнительные ссылки для определенного $node
function fixideology_link($type, $node = null, $teaser = false)
{
$links = array();
//
if (($type == "node") && isset($node->comment) && $teaser) {
$links["del-links"] = array(
"comment_add", // ссылка "Комментировать"
"comment_comments", // ссылка "n комментарий(я/ев)"
"comment_new_comments", // ссылка "n новый(х) комментарий(я/ев)"
"comment_forbidden" // ссылка "Комментирование запрещено"
);
}
//
return $links;
}

// Реализация ловушки hook_link_alter
// Обрабатывает ссылки для определенного $node,
// после формирования их в других модулях и ловушке fixideology_link
function fixideology_link_alter(&$node, &$links)
{
if (isset($node->comment) && isset($links["del-links"])) {
$del_links = $links["del-links"];
$n = count($del_links);
//
for ($i = 0; $i < $n; $i++) {
if (isset($links[$del_links[$i]])) unset($links[$del_links[$i]]);
}
//
unset($links["del-links"]);
}
}
?>

Готовый модуль в прикрепленном архиве.

Теперь немного теории:) Ловушка которая убирает из массива $links ссылки комментирования – hook_link_alter. Она выполняется Drupal’ом уже после полного формирования массива $links и позволяет его модифицировать. Нам остается только найти эти ссылки и удалить. Но тут есть ограничение – в эту ловушку не передаётся информация о виде данной ноды (тизер или полная). Поэтому необходимо использовать ловушку hook_link. В эту ловушку информация о виде данной ноды передаётся. Она не позволяет модифицировать массив $links, но даёт возможность добавлять в массив $links новые ссылки. Этим и можно воспользоваться, добавив некий «псевдолинк» с перечисленными типами комментариев (я привёл четыре типа комментария… если какие-либо из них нужны под тизерами, необходимо просто их исключить из массива $links["del-links"]), которые необходимо удалить, если вид данной ноды – тизер. Таким образом, если ловушка hook_link_alter находит этот «псевдолинк», то она удаляет из массива $links все ссылки комментирования, имеющие один из типов указанных в массиве $links["del-links"].

Тестировал на drupal-5.5. Кто попробовал потестировать, отпишитесь пожалуйста.

P.S. Возможно есть смысл расширять этот модуль (например, сделать настройку, давать возможность админу выбирать какие линки удалять или заменять на информационный текст и т.д.), т.к. описанная проблема, ИМХО, важна.
P.P.S. В drupal-4.* вроде нет ловушки hook_link_alter, т.е. модуль работать не будет.

Аватар пользователя andypost@drupal.org andypost@drupal.org 17 января 2008 в 3:17

на мой взгляд лучше проверить $node->readmore можно будет точно сказать выведен полный материал или нет.
еще один вариант использовать hook_nodeapi в режиме "view"

Аватар пользователя maxsim maxsim 17 января 2008 в 12:35

Расскажите, пожалуйста, о $node->readmore поподробнее, т.к. у меня это свойство всегда равно 1 для любого вида нода (полный материал или нет). Как с помощью этого свойства точно сказать выведен полный материал или нет?

Аватар пользователя Valeratal Valeratal 17 января 2008 в 13:36

вот у человека была подобна трабла
http://www.ficaka.ru/archives/8

решил повесил вызов ява-скрипта на onload

То есть, судя по тому что я нашел в нете, ошибка в яве
Но, почему в друпале она возникает - вот вопрос

Аватар пользователя Valeratal Valeratal 17 января 2008 в 21:41

да, спасибо, модуль работает
Правда, есть одна засада, почему то для гостей не показывается тег HR который у меня разделяет тизеры

Аватар пользователя Valeratal Valeratal 30 апреля 2008 в 21:56

Вы будете смеятся, но я понял что сайт Таргем (Разрабы игры Ex Machina) сделан на друпале по тексту "Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии"
Smile

Аватар пользователя Granty Granty (не проверено) 10 мая 2008 в 12:29

Вы правы, похоже сайт Таргем на Друпале. Они себя пропалили на странице eng.targem.ru, у них в английской версии сайта вываливается ошибка Mysql:

warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /web/targem/site/www/modules/smfforum/includes/smf_api_2.php on line 83.

по-моему достаточно типичная для этой CMS.

PS: ombu.ru/?q=user/register - тож самое, только они явно ссылку на drupal оставили.

Аватар пользователя CTygeHT CTygeHT (не проверено) 12 мая 2008 в 15:23

Думаю, что логичнее ставить одновременно и кликабельные заголовки и ссылки типа "читать далее", ибо на свете немалое количество людей, слабо ориентирующихся в интернете. И если им не написать русским по белому "Продолжение здесь" или "Жмите тут", то они и не нажмут....

Аватар пользователя maxsim maxsim 24 мая 2008 в 17:18

>> Думаю, что логичнее ставить одновременно и кликабельные заголовки и ссылки типа "читать далее", ибо на свете немалое количество людей, слабо ориентирующихся в интернете. И если им не написать русским по белому "Продолжение здесь" или "Жмите тут", то они и не нажмут....

"В данном вопросе тебя, камрад, решительно поддерживаю." © Дмитрий Пучков

>> Хаки ядра и модулей считаются моветотоном. Лучше переопределить функцию вывода THEME_links.
Несомненно. Чисто для справки, выше в комментариях приводятся варианты решения текущей задачи как переопределением функции theme_links, так и отдельным модулем fixideology.

Аватар пользователя mrvoo mrvoo 18 июля 2008 в 12:27

Касательно модуля fixideology:

мне захотелось также убрать из тизера "блог пользователя Х", для этого добавил в массив links:

"blog_usernames_blog".

Получилось:

$links["del-links"] = array(
"comment_add", // ссылка "Комментировать"
"blog_usernames_blog", // ссылка "Блог пользователя Х"
"comment_comments", // ссылка "n комментарий(я/ев)"
"comment_new_comments", // ссылка "n новый(х) комментарий(я/ев)"
"comment_forbidden" // ссылка "Комментирование запрещено"

Думаю, что это может быть полезно еще кому-то, потому что вот тут:
http://www.drupal.ru/node/16797
уже задавали подобный вопрос.

Аватар пользователя beshbel beshbel 27 сентября 2008 в 11:52

6й друпал
все перечисленное перепробовала, ничего не работала
чувствую чем-то задним, что все должно быть просто
и в результате заработало когда в ноде в конце дописали: если тизер ложь - выводить линки

код:
<?php if(!$teaser):?>
<?php if ($links) { ?>

<?php }; ?>
<?php endif;?>

естественно, больше в ноде линки не упоминаются

а ларчик просто открывался

Аватар пользователя Graf_Mur Graf_Mur 11 октября 2008 в 0:43

А как под 6-ку убрать вывод заголовков комментариев или вывод только тех заголовков, которые пишут сами пользователи, а не автогенеряться?
или где-то эту гадость всё-таки можно отключить, а я и не заметил?

Аватар пользователя Тыдж Тыдж 29 октября 2008 в 2:17

2Graf_Mur:
Содержание - типы материалов - (выбираем нужный)Изменить - группа "Установки комментариев" - Поле темы комментария: - Отключено...

з.ы. - это нужно было? Я прально понял?

Аватар пользователя Dmitriy.ua Dmitriy.ua 19 января 2009 в 0:33

Мне нужно было с тизеров убрать "добавить комментарий" и оставить "читать далее".
А в полной версии оставить "Добавить коментарий".

в node.tpl.php заменил код:

<?php if ($links) { ?><div class="links"> <?php print $links?></div><?php }; ?>

на подкоректированный код от beshbel:

<?php if(!$teaser):?>
<?php if ($logged_in):?>
<?php if ($links) { ?> <div class="links"><a href="<?php print $node->links['comment_add']['href']?>">Добавить комментарий</a></div>
<?php }; ?>
<?php endif;?>
<?php endif;?>
   
<?php if($teaser):?>
<?php if ($node->type !== 'blog'):?>
<?php if ($links) { ?><div class="links"><a href="<?php print $node->links['node_read_more']['href']?>">Читать далее</a></div>
<?php }; ?>
<?php endif;?>
<?php endif;?>
Аватар пользователя andypost@drupal.org andypost@drupal.org 19 января 2009 в 20:53

Решение для drupal 6 - свой модуль с одним хуком
<?php
файл bonus.info
---
; $Id$
name = "Bonus"
description = "Bonus"
core = "6.x"
---
файл bonus.module
---
function bonus_link_alter(&$links, $node) {
if ($node->readmore) {
unset($links['comment_add']);
unset($links['blog_usernames_blog']); //убрать, если нужны ссылка на блог автора
}
}
---
?>

Аватар пользователя sigma sigma 17 июля 2009 в 8:06

<a href="mailto:andypost@drupal.org">andypost@drupal.org</a> wrote:
Решение для drupal 6 - свой модуль с одним хуком

спасибо !
красивое "спортивное" решение, много времени сэкономил Smile

Аватар пользователя Resistant Resistant 29 июля 2009 в 14:41

sigma wrote:
<a href="mailto:andypost@drupal.org">andypost@drupal.org</a> wrote:
Решение для drupal 6 - свой модуль с одним хуком

спасибо !
красивое "спортивное" решение, много времени сэкономил :)

Что то не хотит это красивое решение работать в 6.13 - убирает ссылку "добавить комментарий" и при просмотре записи в целом.

Аватар пользователя Valeratal Valeratal 19 февраля 2009 в 10:19

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

Аватар пользователя Serg_M Serg_M 10 апреля 2009 в 21:01

"<a href="mailto:andypost@drupal.org">andypost@drupal.org</a>" wrote:
Решение для drupal 6 - свой модуль с одним хуком

у меня Drupal 6.10, незаработало, пока не поменял условие
было: if ($node->readmore) {
стало: if (frontpage) {

Спасибо, но по-моему модуль только скрывает отображение и получаются большие отступы между тизерами. Похоже выход один - темизация главной страницы...

Черт, для анонимов не убралась надпись:
"Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии"

Аватар пользователя fairwind fairwind 14 мая 2009 в 9:48

И мне потребовалось. В node.tpl.php заменить

<?php
print $links
?>

на


<?php 
  
if ($teaser) {
    unset(
$node->links['comment_add']);
    unset(
$node->links['comment_forbidden']);
     
$links theme_links($node->links);
  }
  print 
$links
?>
Аватар пользователя Tankha Tankha 30 мая 2009 в 13:51

а! Почему здесь нет кнопки спасибо? Lol
Я всё почти расковырял но избавится от Content Template не получалось (а хотелось).
Но в node.tpl.php links приходит уже не массивом и строкой.

И вот оно то чего мне не хватало:
$links = theme_links($node->links);

Я так понимаю это пересобирает строку links?
Вообщем СПАСИБО - всё работает. Теперь ссылками можно вертеть как угодно без Content Template.

Аватар пользователя humorist humorist 15 марта 2012 в 14:58

Блин, кодеры собрались))) Не проще ли найти class или id элемента и прописать ему display:none; в таблице стилей? Можно даже для пущей верность добавить !important. Я делаю именно так и все нормально выходит как в Drupal 7 так и в Drupal 6.

Правда есть один минус - ссылка на добавление комментариев исчезнет и в полной ноде, но и тут есть выход - выводить форму для добавления комментариев полностью