Как пофиксить сие безобразие? Ну не логично предлагать оставлять комментарии человеку, не прочитавшему статью до конца.
А учитывая "альтернативное мышлении" (идиотизм в неполиткорректном языке) некоторых пользователей - штука потенциально опасная.
Как пофиксить сие безобразие? Ну не логично предлагать оставлять комментарии человеку, не прочитавшему статью до конца.
А учитывая "альтернативное мышлении" (идиотизм в неполиткорректном языке) некоторых пользователей - штука потенциально опасная.
Комментарии
Я знаю как: в comment.module
Было:
Стало
Мне тоже это интересно, проверю сегодня
Заранее спасибо
хм, вот с главной у меня не убралось добавить комментарии, но зато в конце статьи добавилось "читать далее"
А вообще в comment.module заменяемая строка встречается 2 раза, которую править нужно?
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. Без гарантий, естественно, но у меня работает. См. вложение если так непонятно.
Хаки ядра и модулей считаются моветотоном. Лучше переопределить функцию вывода THEME_links.
А без моветона черезж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)) {
И нет больше ссылки "цитировать" при выдаче тизера.
Так. Народ, что то вы тексты пишите большие и слишком не в тему.
Создаёте в каталоге с темой файл node.tpl.php.
В нем пишите
ХХХ
</div>
Заменя ХХХ на следующие варианты (можно комбинировать):
А) Заголовок статьи, в виде ссылки:
<h2 class="title">
<a href="<?php print $node_url ?>"><?php print $title; ?></a>
</h2>
<?php endif; ?>
Б) Разрешаем картинки если они есть.
В) надписи типа "On пн, 07/05/2007 - 09:47 beer_destroyer says:"
<span class="submitted">
<?php print $submitted ?>
</span>
<?php endif; ?>
Г) Ссылка на раздел словаря (если модкль таксономии включён)
<div class="taxonomy"><?php print t(' in ') . $terms ?></div>
<?php endif; ?>
Д) Тело материала
<?php print $content; ?>
</div>
Е) Ссылки типа "Читать далее, Оставить комментарий"
<div class="links">
<?php print $links; ?>
</div>
<?php endif; ?>
Это конечно не всё, но отправной точкой может вам послужить в лёгкую.
Всё, что не укажете, отображаться не будет.
Естественно это не панацея.
Можно менять классы, id, исключать/включать тэги и прочее.
Анализируйте больше чужой код товарищи : )
И быть может такие вопросы отпадут сами собой.
Учитесь, пока я жив, а то вон, разгонка киллера наймёт скоро : )
>>>Народ, что то вы тексты пишите большие и слишком не в тему.
Вообще-то я это могу отнести и к вам. В написанном Вами нет ничего про решение конкретной задачи. Описаны методы, которые работают, но не там и не так. Так что звиняйте, коротко не получается.
Давайте я еще раз объясню: модули 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. По тексту - еще хуже.
Вопрос: как идеологически правильно избавиться от хаков модулей в этом конкретном случае?
большое человеческое спасиб.
Ого как спамят!!! Axel, как они умудряются пробить? Может пора пришивать защиту помощнее?
А кстати вопрос, никто не придумал все-таки метода без правки кода ядра?
Не люблю я это дело и вам не советую.
у меня есть такое соображение
Есть такой модуль, content template, он позволяет вставлять что либо в ноду или в тизер
Я в ноду вставляю рекламу директовскую к пример
Так вот, можно попробовать вырезать тот код, который отвечает за вывод данной строки (про комментарии) и запихать его именно в ноду (тогда в тизере его не будет)
если подскажите, какой код выводит "добавить комментарии" или "зарегтесь чтобы добавлять", могу попробовать у себя
в node.tpl нашел только про print $links
gradP, давно уже придумано - через темы и phptemplate, переопределением.
KCEOH
Спасибо, покопаем в этом направлении
KCEOH
можно подробнее?
Было:
if ($node->comment == COMMENT_NODE_READ_WRITE) {
Стало
if ($node->comment == COMMENT_NODE_READ_WRITE && !$node->readmore) {
ок, это работает для зарегистрированных юзеров, для гостей в links все равно выводится после каждого тизера "Войдите в систему или зарегистрируйтесь, чтобы получить блабла"... Интересно, как это убрать?
>>> А без моветона черезж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’а, вы будете потом опять лезть в код ядра и модулей и хакать? А если к тому моменту уже кучу хаков наделаете?
у мну это код вообще удаляет строку с "добавить комментарий"
а для гостей вооще ничего не меняется
Нужно, чтобы строка "добавить комментарий" осталась, но стала обычной строчкой или что?
А что должно меняться для гостей? У меня для них всегда только «Читать далее» и было.
нужно, это просто мечта, чтобы внизу тизеров вообще, ни для каких ролей не выводилось добавить коментарии
а в полной естест-но выводилось
Если у Вас для гостей только читать далее, то наверно показ коментариев для них отключен?
>>> Если у Вас для гостей только читать далее, то наверно показ коментариев для них отключен?
Ну да, я забыл про права доступа для гостей… Но это ничего не меняет:)
Смотрите, что делает данный код… Когда гость заходит на сайт, он видит тизеры, под которыми располагается любые ссылки (по умолчанию, только ссылку «Читать далее») кроме ссылки «Комментировать» (если гость имеет права на комментирование). В любых других местах (например, в категориях, результатах поиска и т.д.) тизеры выводятся без ссылки «Комментировать». Когда гость кликает по ссылке «Читать далее», он переходит на страницу «нода», где уже есть полный текст и внизу ссылка «Комментировать». При клике по ней появляется та же страница «нода», но уже внизу с формой комментирования. Причем, хочу отметить, что раньше над формой располагалась ссылка «Комментировать», которая вела на эту же форму, что, как мне кажется, абсолютно лишнее. Теперь она также пропадает, как и под тизерами.
Для зарегистрированных все тоже самое. Скриншоты нужны?
У вас также или что-то не так?
вот ссылка "комментировать" и пропадает в полных нодах
вечером могу прислать скрин
А какой вид внутренних путей «нодов»? В коде для http://my-site/?q=node/3 и подобных рассчитано.
у путей путь нормальный, то есть нода/номер
Проверялось много раз на 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" и удалять элементы полностью.
Придумал новый более изящный метод решения текущей проблемы!
Итак, чтобы решить проблему ссылок комментирования нужно… создать свой модуль с двумя функциями, реализующими ловушки 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, т.е. модуль работать не будет.
на мой взгляд лучше проверить $node->readmore можно будет точно сказать выведен полный материал или нет.
еще один вариант использовать hook_nodeapi в режиме "view"
Расскажите, пожалуйста, о $node->readmore поподробнее, т.к. у меня это свойство всегда равно 1 для любого вида нода (полный материал или нет). Как с помощью этого свойства точно сказать выведен полный материал или нет?
вот у человека была подобна трабла
http://www.ficaka.ru/archives/8
решил повесил вызов ява-скрипта на onload
То есть, судя по тому что я нашел в нете, ошибка в яве
Но, почему в друпале она возникает - вот вопрос
О чем вы?
сорри, не туда запостил
Ну а модуль помог справиться с ссылками?
да, спасибо, модуль работает
Правда, есть одна засада, почему то для гостей не показывается тег HR который у меня разделяет тизеры
А на мой взгляд, ссылка "Читатть далее" вовсе не нужна. Просто делайте сылкой заголовок
Вы будете смеятся, но я понял что сайт Таргем (Разрабы игры Ex Machina) сделан на друпале по тексту "Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии"
Вы правы, похоже сайт Таргем на Друпале. Они себя пропалили на странице 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 оставили.
Думаю, что логичнее ставить одновременно и кликабельные заголовки и ссылки типа "читать далее", ибо на свете немалое количество людей, слабо ориентирующихся в интернете. И если им не написать русским по белому "Продолжение здесь" или "Жмите тут", то они и не нажмут....
Если читать далее засоряет - нужно использовать графический елемент - типа стрелочка или подобное что-то
Хаки ядра и модулей считаются моветотоном. Лучше переопределить функцию вывода THEME_links.
>> Думаю, что логичнее ставить одновременно и кликабельные заголовки и ссылки типа "читать далее", ибо на свете немалое количество людей, слабо ориентирующихся в интернете. И если им не написать русским по белому "Продолжение здесь" или "Жмите тут", то они и не нажмут....
"В данном вопросе тебя, камрад, решительно поддерживаю." © Дмитрий Пучков
>> Хаки ядра и модулей считаются моветотоном. Лучше переопределить функцию вывода THEME_links.
Несомненно. Чисто для справки, выше в комментариях приводятся варианты решения текущей задачи как переопределением функции theme_links, так и отдельным модулем fixideology.
Касательно модуля 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
уже задавали подобный вопрос.
6й друпал
все перечисленное перепробовала, ничего не работала
чувствую чем-то задним, что все должно быть просто
и в результате заработало когда в ноде в конце дописали: если тизер ложь - выводить линки
код:
<?php if(!$teaser):?>
<?php if ($links) { ?>
<?php }; ?>
<?php endif;?>
естественно, больше в ноде линки не упоминаются
а ларчик просто открывался
А как под 6-ку убрать вывод заголовков комментариев или вывод только тех заголовков, которые пишут сами пользователи, а не автогенеряться?
или где-то эту гадость всё-таки можно отключить, а я и не заметил?
2Graf_Mur:
Содержание - типы материалов - (выбираем нужный)Изменить - группа "Установки комментариев" - Поле темы комментария: - Отключено...
з.ы. - это нужно было? Я прально понял?
ну вы тут нашумели
А что должно меняться для гостей? У меня для них всегда только «Читать далее» и было.
Настройка Windows
Мне нужно было с тизеров убрать "добавить комментарий" и оставить "читать далее".
А в полной версии оставить "Добавить коментарий".
в node.tpl.php заменил код:
на подкоректированный код от beshbel:
<?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;?>
Решение для 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']); //убрать, если нужны ссылка на блог автора
}
}
---
?>
спасибо !
красивое "спортивное" решение, много времени сэкономил
Что то не хотит это красивое решение работать в 6.13 - убирает ссылку "добавить комментарий" и при просмотре записи в целом.
В каком месте архив-то?
Обновил тот коммент. Вот сам архив: http://www.drupal.ru/files/fixideology.zip
Народ, может, я что упустил, но сеть же модуль Read More Tweak...
да, дело не в ридмо
а в том, что выводится внизу тизера всякая ерунда - типа добавать каммент, или еще хуже "зарегистрируйтесь, чтобы добавить каммент" и тд.
у меня Drupal 6.10, незаработало, пока не поменял условие
было: if ($node->readmore) {
стало: if (frontpage) {
Спасибо, но по-моему модуль только скрывает отображение и получаются большие отступы между тизерами. Похоже выход один - темизация главной страницы...
Черт, для анонимов не убралась надпись:
"Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии"
И мне потребовалось. В 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;
?>
а! Почему здесь нет кнопки спасибо?
Я всё почти расковырял но избавится от Content Template не получалось (а хотелось).
Но в node.tpl.php links приходит уже не массивом и строкой.
И вот оно то чего мне не хватало:
$links = theme_links($node->links);
Я так понимаю это пересобирает строку links?
Вообщем СПАСИБО - всё работает. Теперь ссылками можно вертеть как угодно без Content Template.
А есть ли подобная функция которой можно в шаблоне пересобрать контент?
fairwind спасибо, это то что нужно
http://drupal.org/node/267302
http://drupal.org/node/195161
display: none;
}
кто знает как в это место воткнуть ссылку с количеством неопубликованных комментариев
Мне тоже помогло.
Да количество неопубликованных хотелось бы вывести.
Блин, кодеры собрались))) Не проще ли найти class или id элемента и прописать ему display:none; в таблице стилей? Можно даже для пущей верность добавить !important. Я делаю именно так и все нормально выходит как в Drupal 7 так и в Drupal 6.
Правда есть один минус - ссылка на добавление комментариев исчезнет и в полной ноде, но и тут есть выход - выводить форму для добавления комментариев полностью