"Read more" - только для определенных типов контента

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

Аватар пользователя marazmus marazmus 11 сентября 2006 в 10:23

Добрый всем день Smile

Такая мелкая задачка - собственно сабж.

Т.е. есть нужда задать формирование тизера только для определенных типов контента.

Ну и вытекающая отсюда задачка для темы - показывать линк "read more..." только для ноды, у которой есть тизер.

Куда копать, подскажете?

Прошел вверх по связке node.tpl -> theme.inc -> node.module, но увяз в коде - пока просто нет таких жестоких познаний в пхп. Может, есть какой-нибудь менее болезненный способ?

Спасибо за ответы.

Комментарии

Аватар пользователя marazmus marazmus 11 сентября 2006 в 10:50

По мере копания точнее определяюсь с условиями Smile

Для ноды, у которой тизера нет, нужно просто показать ее саму.
В основном это будут мелкие заметки и прочее, то, что невыгодно "обрабатывать тизерами". Эти мелкие заметки лучше выводить в список статей целиком.

Пока нашел переменную $teaser, доступную из кода темы. Она == true, если нода отображается в списке статей в виде тизера. Это дает возможность "рулить" ссылкой "Read more..." самим, без заботливой theme.inc Smile (или чем там еще регулируется вывод этой ссылки).

Но по-прежнему остается проблема с самими тизерами.

Аватар пользователя marazmus marazmus 11 сентября 2006 в 11:03

Нашел на друпал.орг
http://drupal.org/node/45485

Вот думаю щас - а не сделать ли все это через flexinode?
С ней не работал, есть только смутные познания, что этот модуль позволяет создавать дополнительные поля для типов контента.

Так что может попробовать так (через флексиноде)?:

1) Сделать поле "Тизер" - для мелких статей это поле при вводе контента просто опускаем
2) В теме по вышеприведенному способу химичим с выводом.

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

Аватар пользователя jason32 jason32 11 сентября 2006 в 11:06

Quote:
Нашел на друпал.орг
http://drupal.org/node/45485

Вот думаю щас - а не сделать ли все это через flexinode?
С ней не работал, есть только смутные познания, что этот модуль позволяет создавать дополнительные поля для типов контента.

Так что может попробовать так (через флексиноде)?:

1) Сделать поле “Тизер” - для мелких статей это поле при вводе контента просто опускаем
2) В теме по вышеприведенному способу химичим с выводом.

Так как можно “пощщупать” переменную тизера, то можно понять, пустой он или нет - а это “сигнал” для нас, что нужно сделать вывод основного текста, а не тизера. Ну и заодно линк “Read more…” прибить за ненужностью.


Используй CCK - я пока не рулил этой темой, но она мне тоже нужна - как разберусь с локализацией - так займусь этим, с ССK как говорят удобнее работать

Аватар пользователя dyp@drupal.org dyp@drupal.org 11 сентября 2006 в 13:03

Вообще эта фича по умолчанию работает, и в стандартных нодах (blog, story, page) есть переменая $node->readmore = 1 если есть что почитать еще.
А как сделаны "определенные типы" контента?
В любом случае логика такая
<?php $node->readmore = (strlen($node->teaser) < strlen($node->body)) ?>
Т.е. если тизер и тело статьи равны, то 1 если нет то ничего.

Аватар пользователя inc inc 11 сентября 2006 в 13:18

Модуль excerpt позволяет вручную задавть тизер при редактировании статьи:
http://drupal.org/project/excerpt
Я работал с его версией под 4.6, там разграничения для типов контента не было, может сейчас сделали

Аватар пользователя marazmus marazmus 11 сентября 2006 в 13:27

Это знакомая штука, спасибо.
И полезная, сейчас под 4.7.3 она и стоит.

Но там - или есть тизер - тогда показывается он в списке; или его нет (пустой текстареа) - тогда в списке статей показывается только заголовок статьи. Но разграничения по типам контента нет...

Quote:
Вообще эта фича по умолчанию работает, и в стандартных нодах (blog, story, page) есть переменая $node->readmore = 1 если есть что почитать еще.

Подозреваю, что "мешает" включенный excerpt. На любую статью выдает true Sad Попробую повозиться с отключенным excerpt...

Спасибо всем, оставайтесь на связи Smile

Аватар пользователя marazmus marazmus 11 сентября 2006 в 13:30

Ага. Отключил excerpt - переменная readmore формируется "правильно". Т.е. выдает true, если тизер меньше контента.

Что-то я совсем потерялся... На сайте уже больше 150 статей, сделанных с помощью модуля excerpt. Как-то неохота из-за такой мелкой проблемы связываться с перелопачиванием материалов... Sad

Аватар пользователя marazmus marazmus 11 сентября 2006 в 13:39

Сделал во флексиноде простой тип контента - два текстареа - тизер и основной текст. Основному тексту ставим "насильно" - не показывать в тизерах, т.е. в списке статей. Тизеру такой галочки нет, т.е. когда заходим "внутрь" этой статьи, то тизер также распечатаеся Sad

Пробовал по способу на друпал.орг (http://drupal.org/node/45485), но там такая беда - если делать просто print, то содержимое "флекси-поля" печатается неформатированным Sad
Может, можно как-то "прогнать" это содержимое через фильтры? Чтобы печаталось как фильтрованный текст в "обычных" нодах?

Аватар пользователя marazmus marazmus 11 сентября 2006 в 13:42

И вообще, чую я - не хватает определенных знаний.
Не только в пхп как таковом, а именно в работе друпала (и его тем в частности). Конкретно - как организована эта цепочка - кто кого за какие крючочки дергает, чтобы вытащить данные и отдать теме, к примеру.

Схемку бы какую...

Аватар пользователя inc inc 11 сентября 2006 в 14:08

Чем не устраивает стандартный механизм?
Если в настройках количество символов для тизера поставить 600, то для маленьких нодов teaser целиком будет вмещать body и ссылка Read more не будет показываться.

Аватар пользователя marazmus marazmus 11 сентября 2006 в 14:14

Это понятно, спасибо.

Механизм не устраивает привязкой к количеству букв. Хочется видеть не "оборванный" на непредсказуемом месте текст, а именно сформированный вручную тизер. Excerpt идеально подходи для этого. Но он везде сует ссылку "Read more", даже там, где в ней нет смысла.

А отключить excerpt для определенных типов контента тоже низзя Sad

Ну ладно, в принципе не страшно. Ибо задача свелась к "отключить read more для статьи в списке статей, когда установлен модуль excerpt"...

Пока пытаюсь врубиться в CCK, точнее в его темизацию. Пока непонятно, кто чего за что цепляет. Просек фишку, когда шаблон для конкретного поля нужно назвать в виде field-ИМЯ_ПОЛЯ.tpl.php - прикольно Smile
Но это наверное заслуга друпала, а не ССК Smile

Аватар пользователя dyp@drupal.org dyp@drupal.org 11 сентября 2006 в 14:26

для ссk помоему просто: дедаешь два поля - "тизер" и "статья". В шаблоне пишешь проверку - если в статья имеет значение то ставим read more. если нет то нет.

Аватар пользователя emzi emzi 11 сентября 2006 в 14:29

отключить автообрезалку и ставить < !-- break --> где хочется. Exerpt штука хорошая, но нужна только если текст тизера должен отличаться от текста основного тела

Аватар пользователя marazmus marazmus 11 сентября 2006 в 14:31

АГА! Только что вот доделал Smile Только потом этот коммент увидел...

Это для основного текста Smile
[pre]

<?php
if ($page):
{
print $items[0]['view'];
}
endif;
?>

[/pre]
Работает, млин... Радости полные штаны Smile

Радость омрачает тот факт, что все предыдущие материалы сделаны через "стандарт+excerpt". Щас похоже придется все вручную переносить... Sad

Аватар пользователя marazmus marazmus 11 сентября 2006 в 14:51

Не могу врубиться в цепочку - может кто в курсе?

Если нет ничего, кроме тем для конкретного поля, CCK "берет" для отображения tpl для этого поля, и все. Т.е. если есть два поля - teaser и body - то CCK возьмет field-field_body.tpl.php и field-field_teaser.tpl.php.

Теперь пойдем дальше. Если нужно учесть все поля вместе, то "подключаем" файл field.tpl.php - он "соберет" все остальные поля, "не учтенные" в предыдущем случае. Тоже нормально. Причем для полей в предыдущем случае похоже, что сохранится их оформление в файлах вида field-field_***.tpl.php.

"Верхний" случай - тема для всей ноды в целом - т.е. не только поля, но и остальное - таксономия, линки и т.п. Тут при подключении темы из поставки CCK "все теряется", т.е. перестают учитываться все "подфайлы" темы. Отсюда - все ломается Sad
Есть идея - пробежаться по массиву полей $items "самостоятельно", но он в этом файле, похоже, недоступен (длина = 0) Sad
Как быть? Пользовать пока для темизации CCK-контента только уровень field.tpl.php и меньше?
Как быть тогда со всей нодой?

Аватар пользователя marazmus marazmus 11 сентября 2006 в 15:31

Это... Что прикольно, "остатки" из node.tpl CCK (или друпал?) "добирает" сам.
Т.е. сейчас у меня так:
- для конкретных полей свои шаблоны вида field-field_***.tpl.php
- для остальных, еще "не учтенных" - общий шаблон field.tpl.php
- все остальное "добирается" из node.tpl.php, само по себе

Т.е. такое ощущение, что первые два уровня работают ровно в том месте, которое нужно заменить - здесь:

<?php print $content ?>

Все остальное в node.tpl.php настраивается нормально.

Аватар пользователя inc inc 11 сентября 2006 в 17:41

Оказывается в модуль excerpt уже встроено разграничение для типов контента, спасибо andron13 - помог найти.
Вот где оно:
admin >> settings >> content types >> {настраиваемый тип контента}.
При включенном модуле excerpt там появляется fieldset с именем excerpt, в котором можно выбрать будет ли форма ввода тизера присутствовать при редактировании нод определенного контента (значение Manual excerpt - по-умолчанию) или нет (значение Auto-generated).

А чтобы при включенном модуле excerpt управление появлением ссылки readmore происходило так, как-будто excerpt выключен, достаточно заккоментировать в файле excerpt.module строчку:

 $node->readmore = $node->teaser != $node->body;

это строчка №22 для версии 4.7.

Аватар пользователя marazmus marazmus 11 сентября 2006 в 18:09

Ага, я смотрел на эту строку, но в силу перманентной тупизны в пхп, и напуганный к тому же "низзя" по поводу правок ядра, распространил эти низзя и на модули :). Так что править не рискнул.

Про auto и manual - это я видел. Но почему-то понял, что auto означает не отключение excerpt, а его "авто-работу" для этого типа контента.

Ок, спасибо всем за помощь Smile

Аватар пользователя fl00r fl00r 12 сентября 2006 в 15:47

<?php
foreach ($node as $k => $v) {
echo "\$node[$k]
";
}
?>
$node[nid]
$node[vid]
$node[type]
$node[status]
$node[created]
$node[changed]
$node[comment]
$node[promote]
$node[moderate]
$node[sticky]
$node[revision_timestamp]
$node[title]
$node[teaser]
$node[log]
$node[format]
$node[uid]
$node[name]
$node[picture]
$node[data]
$node[last_comment_timestamp]
$node[last_comment_name]
$node[comment_count]
$node[taxonomy]
$node[files]
$node[readmore]
$node[links]

Аватар пользователя fl00r fl00r 12 сентября 2006 в 17:15

The function sets readmore based on a strlen comparison between $node->teaser and $node->body. The problem enters if $node->teaser doesn't exist (or is set to an empty string) when teasers are disabled. The simple fix is to prepend one or both of the logical tests shown below:

Original:

<?php
function node_prepare($node, $teaser = FALSE) {
$node->readmore = (strlen($node->teaser) < strlen($node->body));
?>

Fixed:

<?php
function node_prepare($node, $teaser = FALSE) {
$node->readmore = $teaser && (strlen($node->teaser)) && (strlen($node->teaser) < strlen($node->body));
?>

Аватар пользователя fl00r fl00r 12 сентября 2006 в 18:26

Как не кручу у меня всюду вылазит "Далее". Даже там где нода из одного символа.
Даже в node.tpl выставил $node->readmore=FALSE всеравно лезет! И пишет что во всех нодах $node->readmore = 1 !
Может проблема с $links[]?

Аватар пользователя fl00r fl00r 12 сентября 2006 в 18:32

Лечим так
<?php
function excerpt_nodeapi(&$node, $op, $arg) {
switch ($op) {
case 'validate':
if (trim($node->teaser) == '') {
$node->teaser = node_teaser($node->body);
}
break;
case 'view':
$node->readmore = $node->teaser != $node->body;
break;
}
}
?>
<?php
function excerpt_nodeapi(&$node, $op, $arg) {
switch ($op) {
case 'validate':
if (trim($node->teaser) == '') {
$node->teaser = node_teaser($node->body);
}
break;
case 'view':
$node->readmore = FALSE;
break;
}
}
?>

Аватар пользователя korj korj 21 декабря 2006 в 21:25

подскажите плиз, как при использование contemplate увидеть этот Read More! пробовал везде где угодно ставить $node->readmore = TRUE; но все равно линк Далее не отображается!

Аватар пользователя korj korj 22 декабря 2006 в 0:32

2korj, как один из вариантов - добавить вот такой вот код в шаблон:

<?php if ($page == 0): ?>
<p><a href="<?php print $node_url ?>" title="<?php print $title ?>">Read More...</a></p>
<?php endif; ?>
Аватар пользователя korj korj 22 декабря 2006 в 18:04

node_url (и node->path) оказывается не везде работает. решение: можно составить линк вручную, через $nid