Хитрый вывод последних новостей в новостной ленте

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

Аватар пользователя AQUADES AQUADES 2 мая 2008 в 12:02

Есть новостная лента, в которой необходимо показать, например, по 6 последних новосетей по определенным темам. Причем самая последняя новость конкретной темы должны быть показана в виде анонса, а все остальные 5 новостей по теме должны располагаться ниже в виде списка заголовков. Подобный формат практикуется на многих сайтах, но как ни пытался реализовать на друпале с помощью Views, ни чего не выходит. Знания PHP практически нулевые, все пытался сделать стандартными средствами.
Похожего результата удалось добиться с помощью вьювз блоками: для самой последней новости сделал блок с выводом только 1-го элемента типа новость, указал вывод в виде анонса, указал фильтр по теме, поставил сортировку по дате публикации (самое свежее вверху). Для остальных 5-ти сделал аналогичный блок, но вывод в виде заголовков и количество 5 элементов, сортировка таже, то же фильтр темы. Но тут вылазит одна неувязка: самая последняя новость дублируется 2 раза, в виде анонса и ниже самой первой в списке из 5-ти предыдущих новостей. Скрин прилагается.
Как или какими конкретно средствами можно добиться правильного желаемого вида вывода новостей 1 последняя анонсом + 5 предыдущих заголовками. Пример желаемого вида новостной ленты, например, здесь http://news.np.by/
Буду очень признателен за помощь.

ВложениеРазмер
Иконка изображения news.jpg77.62 КБ

Комментарии

Аватар пользователя Химический Али Химический Али 2 мая 2008 в 12:21

На днях обсуждали сию "трудность". Поиск по "топ-новость".

А еще взгляните на

Node Queue

The Node Queue module allows an administrator to arbitrarily put nodes in a group for some purpose; examples of this might be to highlight one particular node, as in a typical news site's Lead Article. Another use might be to create a block listing teasers for 5 forum posts that the admin thinks are important. Another use might be to create a group of nodes, and then have a block or the front page offer one of these randomly.

Node queue provides a simple UI to manually order any queue. Additionally, it allows nodes to be added and removed from queues without needing edit permissions to the node. Nodes can be added to queues either from a queue management tab or by links on the node teaser.

Аватар пользователя AQUADES AQUADES 2 мая 2008 в 12:45

На днях обсуждали сию "трудность". Поиск по "топ-новость".
Если Вы про это http://drupal.ru/node/12580, то там я был и там автор нигде не упамянул про вьювз, и ему его посоветовали и на этом всё. Согласен, что у меня вопрос аналогичный, но он не решается просто так средствами вьювз, как многие советуют на лету.

Node Queue
Спасибо, при беглом прочтении похоже на искомое. Буду знакомиться ближе.

Есть ещё варианты?

Аватар пользователя AQUADES AQUADES 2 мая 2008 в 17:35

Решил вопрос сниппетом и малек его дописал на свой лад. Результат в аттаче.

А теперь новая непонятка: при попытке после заголовков вывести дату размещения новости таким способом: . format_date($anode->created, 'custom', 'j.m.Y') . получается ерунда 1.01.1970. Реальные даты создания отличаются от 1.01.1970 Smile
Подскажите, где ошибка?

<?php
$taxo_id = 21; // номер термина
$list_no =10; // количество документов в списке
$list_cu = 1; // счетчик
$sql = "SELECT node.title, node.nid FROM node INNER JOIN term_node ON node.nid = term_node.nid WHERE term_node.tid = $taxo_id ORDER BY node.created DESC LIMIT $list_no";
$result = db_query($sql);
while ($anode = db_fetch_object($result)) {
if ($list_cu == 1)
{
$output .= node_view(node_load(array('nid' => $anode->nid)), 1);
$output .= "

    ";
    }
    else
    $output .= "
  • " . l($anode->title, "node/$anode->nid") . " | " . format_date($anode->created, 'custom', 'j.m.Y') . "
  • ";
    $list_cu = 0;
    }
    $output .= "

";
print $output;
?>

Аватар пользователя Roof Roof 2 мая 2008 в 20:59

А зачем обязательно Друпаловскую формат_дат() использовать? В данном случае можно воспользоваться стандратной пхпшной date(), хотя я конечно могу и ошибаться.
А у вас ошибка скорее всего в запросе к БД - из него поле created никак не выбирается.
Попробуйте так:
<?php
$sql = "SELECT node.title, node.nid, node.created FROM node INNER JOIN term_node ON node.nid = term_node.nid WHERE term_node.tid = $taxo_id ORDER BY node.created DESC LIMIT $list_no";
?>

Аватар пользователя AQUADES AQUADES 2 мая 2008 в 22:08

Действительно, ошибка крылась в запросе, выборки node.created не было. Спасибо. Все работает.

Если кому-нибудь вдруг понадобится что-то подобное, вот собственно оно:
<?php
$taxo_id = 21; // номер термина
$list_no =6; // количество документов в списке
$node_first = true; // для определения первой ноды по списку
$sql = "SELECT node.title, node.nid, node.created FROM node INNER JOIN term_node ON node.nid = term_node.nid WHERE term_node.tid = $taxo_id ORDER BY node.created DESC LIMIT $list_no"; // выборка из базы указанного количества нод указанной темы и сортировка их по дате создания
$result = db_query($sql); // присваиваем переменной $result результат обращения к базе
// перебираем полученный результат
while ($anode = db_fetch_object($result)) {
// если $node_first равна true значит мы в начале списка полученного результата, и сейчас обрабатывается первая по списку нода (самая свежая) и мы выводим её в виде анонса
if ($node_first)
{
$output .= node_view(node_load(array('nid' => $anode->nid)), 1); // вывод анонса
$output .= "

    "; // начинаем формировать список из оставшихся нод
    }
    // иначе (нода не первая) продолжаем формировать список заголовков оставшихся нод 2,3,4... из полученного результата
    else
    $output .= "
  • " . l($anode->title, "node/$anode->nid") . " | " . format_date($anode->created, 'custom', 'j.m.Y') . "
  • "; // заголовок ноды + дата её создания
    $node_first = false; // определив первую по списку ноду и выполнив над ней все необходимые действия мы меняем значение $node_first на false, чтобы далее по условию выводились только заголовки оставшихся в списке нод 2,3,4...
    }
    $output .= "

"; // закрываем список
$output .= "". l("История событий", "taxonomy/term/$taxo_id") .""; // добавляем ссылку на все материалы с термином $taxo_id
print $output; // получаем ожидаемый результат
?>

Окончательный результат в аттаче

Аватар пользователя kiev1 kiev1 3 мая 2008 в 3:34

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

Аватар пользователя Алексей Дёмин Алексей Дёмин 3 мая 2008 в 13:12

через темизацию views это элементарно делается - настраивается вид так что бы он отбирал то что нужно, потом создается тема оформления вида в которой вводится глобальная переменная - при выводе первой новости в соответствующем дизайне эта переменная сбрасывается и последующие новости выводятся одной строкой.
А с этого места попрошу поподробней! Smile

вобщем идея интересная... мне нужно было вывести с главной новости... понятно что надо сделать проверку на node.promote=1
$sql = "SELECT node.title, node.nid, node.created FROM node WHERE node.promote = 1 ORDER BY node.stiky=1, node.created DESC LIMIT $li

Но всеже хотелось бы с темизацией Smile

Аватар пользователя kiev1 kiev1 3 мая 2008 в 18:46

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

Аватар пользователя MAMONT MAMONT 6 мая 2008 в 22:00

с Views я недавно начал работать, то что написал kiev1 в предыдущем посте честно говоря не понял. Можно подробней? Или у кого то может есть готовая реализация?

Аватар пользователя kiev1 kiev1 7 мая 2008 в 5:42

1 - делаем блочный вид который отберет 6 новостей по теме, ID темы можно сделать в виде аргумента
2 - создаем тему оформления этого вида в котором выводим первую новость с картинкой, остальные заголовками - определять что новость первая можно введя глобальную переменную.

Аватар пользователя oleg365@drupal.org oleg365@drupal.org 18 апреля 2009 в 3:47

RE:

"AQUADES" wrote:
Опубликовано AQUADES в пт, 02/05/2008 - 18:08.

Замечательный код, предложенный выше AQUADES, сможет выводить содержание из нескольких терминов таксономии, а не только одного, если внести три маленьких изменения в двух строках:

1. в первой строке перечислить идентификаторы через запятую и заключить их в кавычки [$taxo_id = "21, 22, 40";],
2. в SQL запросе заменить условие отбора, - вместо сравнивания [WHERE term_node.tid = $taxo_id] использовать проверку на принадлежность к списку [WHERE term_node.tid in ($taxo_id)],
3. использовать ключевое слово distinct [SELECT DISTINCT] во избежание повторения материала, если он привязан к нескольким категориям/подкатегориям таксономии.

Однако, при этом перестанет работать ссылка "История событий", представленная в коде третьей строкой снизу:

Quote:
$output .= "<p>". l("История событий", "taxonomy/term/$taxo_id") ."</p>"; // добавляем ссылку на все материалы с термином $taxo_id

Это происходит из-за того, что переменная $taxo_id в этой строке больше не является интеджером (раз уж выше мы изменили тип этой переменной с числового на строковый). Поэтому эту строку можно закомментировать.

В результате, изменения в коде AQUADES от 02/05/2008 - 18:08 будут выглядеть следующим образом:
<?php
$taxo_id = "21, 22, 40"; // список идентификаторов терминов tid через запятую

- - -
- - -
- - -

$sql = "SELECT DISTINCT node.title, node.nid, node.created FROM node INNER JOIN term_node ON node.nid = term_node.nid WHERE term_node.tid in ($taxo_id) ORDER BY node.created DESC LIMIT $list_no"; // выборка из базы указанного количества нод указанных терминов и сортировка их по дате создания

- - -
- - -
- - -
// $output .= "". l("История событий", "taxonomy/term/$taxo_id") .""; // добавляем ссылку на все материалы с термином $taxo_id
- - -
?>

Аватар пользователя MITSUFAN MITSUFAN 11 мая 2009 в 18:06

Тема продолжает жить и получает новые трансформации - это приятно.
Но что касается чисто новостного формата, то вот эта самая трансформация моего кода ни есть улучшение, т.к. теряется эта самая ссылка "История событий", хотя с третьей стороны предположу, что её можно было оставить и даже в Вашем варианте, проставив только лишь "плюсы", естественно приведя подстановку терминов в порядок (а пока только показать суть):

<?php
$output 
.= "<p>"l("История событий""taxonomy/term/21+22+40") ."</p>"// добавляем ссылку на все материалы с терминами 21 22 и 40
?>

З.Ы.
AQUADES = MITSUFAN (так получилось, когда сайт штормило)