снипет для вывода новостей

20 июня 2008 в 13:43

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

<?php
global $locale;
unset ($output);
$node_type = "news"; // тип документа
$sql = "SELECT node.title, node.type, node.nid, node_revisions.body, localizernode.locale, node.created FROM {node},{node_revisions},{localizernode} WHERE node.type = '$node_type' AND node.status='1' AND node.nid=localizernode.nid AND localizernode.locale='$locale' AND node_revisions.nid=node.nid ORDER BY node.created DESC LIMIT 1";

$result = db_query($sql);
$anode = db_fetch_object($result);
echo "".date('Y-m-d',$anode->created)."
";
echo "".$anode->title."

";
echo $anode->body;
echo "


";

unset ($output);
$node_type = "news"; // тип документа
$sql = "SELECT node.title, node.type, node.nid, node.created, localizernode.nid, localizernode.locale FROM {node},{localizernode} WHERE node.type = '$node_type' AND node.status =1 AND localizernode.locale='$locale' AND node.nid=localizernode.nid ORDER BY node.created DESC LIMIT 3";

$output .= "

    ";
    $result = db_query($sql);

    while ($anode = db_fetch_object($result)) {
    if (date('Y',$anode->created)==2008)
    {
    $output .= "

  • ".date('Y-m-d',$anode->created)." ".l($anode->title, "node/$anode->nid")."
  • ";
    }
    }

    $output .= "

";

print $output;
?>

Комментарии

Хм.....
Я думаю лучше сделать вот как:
1)Если всёже хочется хардкора - то по крайней мере сипользуй node_load с параметарми
2)ИМХО идеологически правильней взять View и кастомизировать его вывод так чтобы первая новость отображалась целиком, а остальные - списком заголовков. И всё это загнать в блок.
В конце концов View как и CCK в 8 версии войдут в ядро.

20 июня 2008 в 15:17

вот как изменил теперь все ок.
<?php
SELECT node.title, node.type, node.nid, node_revisions.body, localizernode.locale, node.created FROM {node},{node_revisions},{localizernode} WHERE node.type = '$node_type' AND node.status='1' AND node.nid=localizernode.nid AND localizernode.locale='$locale' AND node_revisions.nid=node.nid AND node_revisions.vid=node.vid ORDER BY node.created DESC LIMIT 1
?>

Добавил "AND node_revisions.vid=node.vid".
View как и CCK вроде к 7ой версии обещали....

20 июня 2008 в 15:59

в 7-м? о! тогда точно как я говорил - 6-й можно пропустить )))
наконец то они догадались что самое важное должно быть в ядре - удалить всегда можно, как неудачный модуль book например

20 июня 2008 в 19:46

вообще-то неправильно поменяли
ошибка вашего запроса сейчас в том, что если версий несколько,то он берёт не последнюю,как правильно,а первую
кроме того, не факт, что nid=vid, если версий хотя бы у одной ноды было две
изначальная ошибка запроса в том, что если ревизий несколько-он вернёт не один результат,а несколько,и нужно не fetch_object, а fetch_array.

21 июня 2008 в 13:03

node_revisions.nid=node.nid AND node_revisions.vid=node.vid достаточно только второго предиката, тогда будет выбираться текущая версия (ревизия) ноды
Еще очень хорошо использовать альясы типа {node} n чтобы через db_rewrite_sql можно было прикручивать права доступа к материалам, а не в последствии переписывать все запросы.
Ну и LIMIT вносить в запрос не этично - если понадобится переносить на другйо тип базы данных опять переписывать, для этого db_query_range

21 июня 2008 в 14:08