Добрый всем день
Такая мелкая задачка - собственно сабж.
Т.е. есть нужда задать формирование тизера только для определенных типов контента.
Ну и вытекающая отсюда задачка для темы - показывать линк "read more..." только для ноды, у которой есть тизер.
Куда копать, подскажете?
Прошел вверх по связке node.tpl -> theme.inc -> node.module, но увяз в коде - пока просто нет таких жестоких познаний в пхп. Может, есть какой-нибудь менее болезненный способ?
Спасибо за ответы.
Комментарии
По мере копания точнее определяюсь с условиями
Для ноды, у которой тизера нет, нужно просто показать ее саму.
В основном это будут мелкие заметки и прочее, то, что невыгодно "обрабатывать тизерами". Эти мелкие заметки лучше выводить в список статей целиком.
Пока нашел переменную $teaser, доступную из кода темы. Она == true, если нода отображается в списке статей в виде тизера. Это дает возможность "рулить" ссылкой "Read more..." самим, без заботливой theme.inc (или чем там еще регулируется вывод этой ссылки).
Но по-прежнему остается проблема с самими тизерами.
Нашел на друпал.орг
http://drupal.org/node/45485
Вот думаю щас - а не сделать ли все это через flexinode?
С ней не работал, есть только смутные познания, что этот модуль позволяет создавать дополнительные поля для типов контента.
Так что может попробовать так (через флексиноде)?:
1) Сделать поле "Тизер" - для мелких статей это поле при вводе контента просто опускаем
2) В теме по вышеприведенному способу химичим с выводом.
Так как можно "пощщупать" переменную тизера, то можно понять, пустой он или нет - а это "сигнал" для нас, что нужно сделать вывод основного текста, а не тизера. Ну и заодно линк "Read more..." прибить за ненужностью.
Используй CCK - я пока не рулил этой темой, но она мне тоже нужна - как разберусь с локализацией - так займусь этим, с ССK как говорят удобнее работать
readmore не выводится
Вообще эта фича по умолчанию работает, и в стандартных нодах (blog, story, page) есть переменая $node->readmore = 1 если есть что почитать еще.
А как сделаны "определенные типы" контента?
В любом случае логика такая
<?php $node->readmore = (strlen($node->teaser) < strlen($node->body)) ?>
Т.е. если тизер и тело статьи равны, то 1 если нет то ничего.
Модуль excerpt позволяет вручную задавть тизер при редактировании статьи:
http://drupal.org/project/excerpt
Я работал с его версией под 4.6, там разграничения для типов контента не было, может сейчас сделали
Это знакомая штука, спасибо.
И полезная, сейчас под 4.7.3 она и стоит.
Но там - или есть тизер - тогда показывается он в списке; или его нет (пустой текстареа) - тогда в списке статей показывается только заголовок статьи. Но разграничения по типам контента нет...
Подозреваю, что "мешает" включенный excerpt. На любую статью выдает true Попробую повозиться с отключенным excerpt...
Спасибо всем, оставайтесь на связи
Ага. Отключил excerpt - переменная readmore формируется "правильно". Т.е. выдает true, если тизер меньше контента.
Что-то я совсем потерялся... На сайте уже больше 150 статей, сделанных с помощью модуля excerpt. Как-то неохота из-за такой мелкой проблемы связываться с перелопачиванием материалов...
Сделал во флексиноде простой тип контента - два текстареа - тизер и основной текст. Основному тексту ставим "насильно" - не показывать в тизерах, т.е. в списке статей. Тизеру такой галочки нет, т.е. когда заходим "внутрь" этой статьи, то тизер также распечатаеся
Пробовал по способу на друпал.орг (http://drupal.org/node/45485), но там такая беда - если делать просто print, то содержимое "флекси-поля" печатается неформатированным
Может, можно как-то "прогнать" это содержимое через фильтры? Чтобы печаталось как фильтрованный текст в "обычных" нодах?
И вообще, чую я - не хватает определенных знаний.
Не только в пхп как таковом, а именно в работе друпала (и его тем в частности). Конкретно - как организована эта цепочка - кто кого за какие крючочки дергает, чтобы вытащить данные и отдать теме, к примеру.
Схемку бы какую...
Чем не устраивает стандартный механизм?
Если в настройках количество символов для тизера поставить 600, то для маленьких нодов teaser целиком будет вмещать body и ссылка Read more не будет показываться.
Это понятно, спасибо.
Механизм не устраивает привязкой к количеству букв. Хочется видеть не "оборванный" на непредсказуемом месте текст, а именно сформированный вручную тизер. Excerpt идеально подходи для этого. Но он везде сует ссылку "Read more", даже там, где в ней нет смысла.
А отключить excerpt для определенных типов контента тоже низзя
Ну ладно, в принципе не страшно. Ибо задача свелась к "отключить read more для статьи в списке статей, когда установлен модуль excerpt"...
Пока пытаюсь врубиться в CCK, точнее в его темизацию. Пока непонятно, кто чего за что цепляет. Просек фишку, когда шаблон для конкретного поля нужно назвать в виде field-ИМЯ_ПОЛЯ.tpl.php - прикольно
Но это наверное заслуга друпала, а не ССК
для ссk помоему просто: дедаешь два поля - "тизер" и "статья". В шаблоне пишешь проверку - если в статья имеет значение то ставим read more. если нет то нет.
отключить автообрезалку и ставить
< !-- break -->
где хочется. Exerpt штука хорошая, но нужна только если текст тизера должен отличаться от текста основного телаАГА! Только что вот доделал Только потом этот коммент увидел...
Это для основного текста
[pre]
if ($page):
{
print $items[0]['view'];
}
endif;
?>
[/pre]
Работает, млин... Радости полные штаны
Радость омрачает тот факт, что все предыдущие материалы сделаны через "стандарт+excerpt". Щас похоже придется все вручную переносить...
Не могу врубиться в цепочку - может кто в курсе?
Если нет ничего, кроме тем для конкретного поля, CCK "берет" для отображения tpl для этого поля, и все. Т.е. если есть два поля - teaser и body - то CCK возьмет field-field_body.tpl.php и field-field_teaser.tpl.php.
Теперь пойдем дальше. Если нужно учесть все поля вместе, то "подключаем" файл field.tpl.php - он "соберет" все остальные поля, "не учтенные" в предыдущем случае. Тоже нормально. Причем для полей в предыдущем случае похоже, что сохранится их оформление в файлах вида field-field_***.tpl.php.
"Верхний" случай - тема для всей ноды в целом - т.е. не только поля, но и остальное - таксономия, линки и т.п. Тут при подключении темы из поставки CCK "все теряется", т.е. перестают учитываться все "подфайлы" темы. Отсюда - все ломается
Есть идея - пробежаться по массиву полей $items "самостоятельно", но он в этом файле, похоже, недоступен (длина = 0)
Как быть? Пользовать пока для темизации CCK-контента только уровень field.tpl.php и меньше?
Как быть тогда со всей нодой?
можно пользовать модуль contemplate. Я думаю даже нужно.
Только в этом случае будет 1 шаблон для всех типов нод - node.tpl.php
Это... Что прикольно, "остатки" из node.tpl CCK (или друпал?) "добирает" сам.
Т.е. сейчас у меня так:
- для конкретных полей свои шаблоны вида field-field_***.tpl.php
- для остальных, еще "не учтенных" - общий шаблон field.tpl.php
- все остальное "добирается" из node.tpl.php, само по себе
Т.е. такое ощущение, что первые два уровня работают ровно в том месте, которое нужно заменить - здесь:
Все остальное в node.tpl.php настраивается нормально.
Оказывается в модуль excerpt уже встроено разграничение для типов контента, спасибо andron13 - помог найти.
Вот где оно:
admin >> settings >> content types >> {настраиваемый тип контента}.
При включенном модуле excerpt там появляется fieldset с именем excerpt, в котором можно выбрать будет ли форма ввода тизера присутствовать при редактировании нод определенного контента (значение Manual excerpt - по-умолчанию) или нет (значение Auto-generated).
А чтобы при включенном модуле excerpt управление появлением ссылки readmore происходило так, как-будто excerpt выключен, достаточно заккоментировать в файле excerpt.module строчку:
это строчка №22 для версии 4.7.
Ага, я смотрел на эту строку, но в силу перманентной тупизны в пхп, и напуганный к тому же "низзя" по поводу правок ядра, распространил эти низзя и на модули :). Так что править не рискнул.
Про auto и manual - это я видел. Но почему-то понял, что auto означает не отключение excerpt, а его "авто-работу" для этого типа контента.
Ок, спасибо всем за помощь
$node->body пишет равен 0 везде...
а $body?
$body - тоже 0
<?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]
Вот
это $content
нет. не то.
Можно поподробней
Попробуйте:
print_r($node);
?>
Обошел рекурсивно дерево node.
А что с эти делать то?
Проблема сводится к тому чтобы узнать strlen ($node->body) для объекта... на который ссылается тизер
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));
?>
И это не помогло.
$content это teaser+body
а почему не то?
Content это либо node->teaser лио node->body в зависимости от места приложения
Пожалуйста, опишите Вашу проблему подробнее
Как не кручу у меня всюду вылазит "Далее". Даже там где нода из одного символа.
Даже в node.tpl выставил $node->readmore=FALSE всеравно лезет! И пишет что во всех нодах $node->readmore = 1 !
Может проблема с $links[]?
Все.
Найден виновник.
Модуль excerpt.
РРРРРРРРРР!
Лечим так
<?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;
}
}
?>
подскажите плиз, как при использование contemplate увидеть этот Read More! пробовал везде где угодно ставить $node->readmore = TRUE; но все равно линк Далее не отображается!
2korj, как один из вариантов - добавить вот такой вот код в шаблон:
<p><a href="<?php print $node_url ?>" title="<?php print $title ?>">Read More...</a></p>
<?php endif; ?>
node_url (и node->path) оказывается не везде работает. решение: можно составить линк вручную, через $nid