Вроде все просто - нужно в блоке выводить определенный материал (Вопрос решен!)

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

Аватар пользователя sadmin sadmin 27 марта 2008 в 17:40

Новый тип материал создал, как теперь в теле блока прописать чтобы этот материал выводился?
Уж извините за ламерский вопрос, но очень нужна помощь! Решил на сайте фразы студентов с экзаменов записывать.

Комментарии

Аватар пользователя avatar avatar 27 марта 2008 в 17:44

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

Аватар пользователя VladSavitsky VladSavitsky 27 марта 2008 в 21:00

Почему это не решаются в друпале такие задачи?
Модуль views потребляет очень много ресурсов. Его мощь и преимущество в том, что он может помочь быстро сделать вывод на страницу опред. материалов (списков, таблиц, анонсов и др.). Именно быстро сделать, но это не работает быстро.
Лично я стараюсь использовать этот модуль тогда, когда на странице с материалами нужно использовать фильтры - с этим модуль справляется превосходно, а повторить своими силами это трудно.
Итак, альтернативное решение - добавить в тело блока PHP-код, который будет выводить эти самые цитаты.
Чтобы не мучиться, привожу код (недавно делал блок для вывода рекламных сообщений):

<?php
unset ($output);
$nmbr_reklama=3;//Количество сообщений рекламы
if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
  $node = node_load(arg(1));
  $sql="SELECT n.title, n.nid FROM {node} AS n WHERE n.status=1 AND n.type='reklama' GROUP BY n.nid LIMIT ".$nmbr_reklama;
  $result = db_query($sql);
  while ($anode = db_fetch_object($result)) {
    $reklama= node_load($anode->nid);
    $output .= '
      <div class="node"><h3 class="title">'
.$reklama->title.'</h3>'. $reklama->body.'</div>';
  }
  return $output;
}
?>

Как-то так...
PS. Формат ввода нужно установить в PHP.
PPS. Статья сохранена: http://drupalcookbook.ru/node/25

Аватар пользователя Гость Гость (не проверено) 27 марта 2008 в 21:11

кстати, тестировал views под 6ку - он обладает замечательным свойством - сам показывает, каким sql-запросом он будет пользоваться.

Аватар пользователя andypost@drupal.org andypost@drupal.org 29 марта 2008 в 3:20

Влад, в корне не верное утверждение! Тот код, который у вас написан - намного оптимальнее выводить с помощью views - будет всего пара запросов к базе данных, а то что написано:
1) запрос списка нод
2) цикл с node_load - это загрузка ноды, и от каждого модуля, который подключает свои поля к ноде будет как минимум по одному запросу:
- select ... from node
- select ... from files
- select ... from comentstatistics и так далее

Вывод блока из 10 нод таким образом генерирует около 70ти запросов к базе! поэтому лучше выбирать нужные поля одним запросом, как это делает views

Потом, зачем загружать ноду и не использовать её, к чему в следущем запросе группировка еще и первичному ключу?
Проще в настройках блока указать на каких страницах он выводится!

<?php
$output = '';
$ncount = 3; //Количество сообщений рекламы
$ntype = 'story'; //Тип материала

$sql="SELECT n.nid, n.title, r.teaser, r.format FROM {node} n INNER JOIN {node_revisions} r ON r.vid = n.vid WHERE n.type='%s' ORDER by n.created DESC";
$result = db_query_range($sql, $ntype, 0, $ncount);
while ($node = db_fetch_object($result)) {
$output .= '

';
$output .= '

'. check_plain($node->title) .'

'; // если есть желание сделать ссылко на ноду, то раскоментровать следущую строку
//$output .= '

'. l($node->title, 'node/'. $node->nid) .'

';
$output .= check_markup($node->teaser, $node->format, FALSE);
$output .= l(t('Read more'), 'node/'. $node->nid); //ссылка читать далее, можно закоментировать
$output .= '

';
}
return $output;

?>

Аватар пользователя sadmin sadmin 2 апреля 2008 в 18:34

Спасибо VladSavitsky и andypost@drupal.org - вопрос принципиально решен

Теперь знаю оба способа вывода собственных нод. Результат - блок "Студенты говорят" То есть пока решил поэкспериментировать на приведенном коде.

Как теперь сделать чтобы пользователь сайта, мог при желании посмотреть не только
три ноды указанных в коде

$ncount = 3; //Количество сообщений nod

но и перейти к следующей тройке (четверке или пятерке) нод?
если решать в лоб, то сделал бы в конце блока ссылку на отдельную страницу, а на ней уже бы парсил поличество нод и номера страниц.