[РЕШЕНО] Вывод 9 нод сортированных по дате в сетке в 9 разных дивах

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

Аватар пользователя mangust59 mangust59 7 июля 2011 в 20:53

Суть в следующем, на сайте есть жесткая сетка 3 на 3, размеченная дивами. Нужно в каждый див выводить анонс ноды. Даже не анонс, а картинку ноды (если есть), название и автора. В первый див - самый свежая нода, во второй свежая - 1, в третий свежая -2 и т.д. Через Views не могу реализовать. Хотел спросить у гуру как это сделать через php, обращаясь напрямую к базе?

Комментарии

Аватар пользователя Serge66 Serge66 7 июля 2011 в 21:05

А какие сложности с вьюсами?
Вывод - сетка
Ко-во материалов 9, пейджера нет
Сортировка по времени
Поля картинка, автор, заголовок
Фильтр тип материала - Новости

Аватар пользователя mangust59 mangust59 7 июля 2011 в 21:30

Объясню подробнее? разметка что-то типа:

<div class=grid>Ячейка 1</div>
<div class=grid>Ячейка 2</div>
<div class=grid>Ячейка 3</div>

<div class=grid>Ячейка 4</div>
<div class=grid>Ячейка 5</div>
<div class=grid>Ячейка 6</div>

<div class=grid>Ячейка 7</div>
<div class=grid>Ячейка 8</div>
<div class=grid>Ячейка 9</div>

В каждую отдельную ячейку надо вывести 1 ноду.

<?php print $content; ?> тут уже не поможет, надо что-то типа

<div class=grid><?php print $node(свежая); ?></div>
<div class=grid><?php print $node(свежая-1); ?></div>
<div class=grid><?php print $node(свежая-2); ?></div>

<div class=grid><?php print $node(свежая-3); ?></div>
<div class=grid><?php print $node(свежая-4); ?></div>
<div class=grid><?php print $node(свежая-5); ?></div>

<div class=grid><?php print $node(свежая-6); ?></div>
<div class=grid><?php print $node(свежая-7); ?></div>
<div class=grid><?php print $node(свежая-8); ?></div>

Аватар пользователя Serge66 Serge66 7 июля 2011 в 22:09

Сделайте во вьсах. Посмотрите какой запрос к базе он делает. И смело вставляйте его в свой модуль. Или страницу, блок...

Аватар пользователя mangust59 mangust59 7 июля 2011 в 22:25

Попробовал, вот что подсмотрел в коде страницы.

<div class=grid>
<div id="node-1" class="node node-type-thing node-promoted node-by-viewer node-teaser build-mode-teaser"><div class="node-inner">
 
      <h2 class="title">
      <a href="/node/1" title="Название">Название</a>
      </h2>
 
      <div class="meta">
              <div class="submitted">
          Опубликовано <a href="/user/1" title="Информация о пользователе.">admin</a>ДАТА</div>
     
          </div>
 
  <div class="content">
      </div>
 
  <ul class="links inline"><li class="comment_add first"><a href="/comment/reply/2#comment-form" title="Добавить комментарий к этой странице.">Добавить комментарий</a></li>
<li class="upload_attachments last"><a href="/node/2#attachments" title="Прочитайте материал целиком, чтобы увидеть приложенные файлы.">1 прикреплённый файл</a></li>
</ul>
</div></div> <!-- /node-inner, /node -->
</div>

Views уже знает что самая свежая статья id="node-1" и в коде страницы не подглядеть как он делает выборку из базы по дате.

Аватар пользователя Serge66 Serge66 8 июля 2011 в 0:06

"mangust59" wrote:
где Views формирует этот запрос?
Это уже военная тайна, которую Вам знать пока рано. Вставляете этот запрос в свою страницу или модуль, полученный результат выводите в свою сетку.
Хотя я все-таки сделал бы это только Вьюсами. С темизацией вывода минут за 5-10.

Аватар пользователя mangust59 mangust59 8 июля 2011 в 0:06

Запрос нашел

SELECT node.nid AS nid, node.created AS node_created FROM node node  WHERE (node.status <> 0) AND (node.type IN ('thing')) ORDER BY node_created DESC

Но по этому запросу Views выдает все материалы типа thing, сортированные по дате создания. Мне же по сути надо 9 различных запросов по 1 материалу в div. Причем каждый следующий материал декремент на 1 по дате создания.

Аватар пользователя mangust59 mangust59 8 июля 2011 в 0:08

"Serge66" wrote:
Это уже военная тайна, которую Вам знать пока рано. Вставляете этот запрос в свою страницу или модуль, полученный результат выводите в свою сетку.
Хотя я все-таки сделал бы это только Вьюсами. С темизацией вывода минут за 5-10.

Может подскажете где настроить темизацию вывода? Может и на самом деле не стоит заморачиваться со сниппетами.

Аватар пользователя Serge66 Serge66 8 июля 2011 в 1:33

Да легко. Хотя уже писал об этом.
В дополнение
Если хотите сетку divами, а не таблицей, то неформатированный список. Файрбагом смотрите классы дивов, В style.css дописываете что-то типа

.views-row {
        float: left;
        width: 33%;
}

Более конкретно сказать не могу. Д6 под рукой нет.

Аватар пользователя mangust59 mangust59 8 июля 2011 в 7:57

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

В данный момент нашел такой снипет. (с)drupalka.ru


<?php
/* «Набиваем» в массив типы нод, тизеры которых желаем выводить. */
$types 'thing'

/* Указываем количество публикаций для отображения. */
$num_nodes 9

/* Формируем запрос к базе для получения необходимых данных(в данном случае nid ноды). */
$sql       "  
SELECT n.nid
FROM {node} n
WHERE n.status = 1
AND n.type IN ("
db_placeholders($types'text') .")
ORDER BY n.created DESC
"
;
/* Ограничиваем количество возвращаемых из БД значений с помощью функции db_query_range(), подставляя ей аргументом значение переменной $num_nodes. */
$result db_query_range(db_rewrite_sql($sql), $types0$num_nodes);

/* И в завершении «проходимся» циклом по отобранным данным, выводя на экран конечный результат - тизеры/анонсы нод - с помощью функции node_view(). */ 
while ($n db_fetch_object($result)) {
print 
node_view(node_load($n->nid), 10);
}
?>

Но данный сниппет выводит все 9 нод в одном месте. Какие я вижу пути?

Вместо

<?php
/* И в завершении «проходимся» циклом по отобранным данным, выводя на экран конечный результат - тизеры/анонсы нод - с помощью функции node_view(). */ 
while ($n db_fetch_object($result)) {
print 
node_view(node_load($n->nid), 10);
}
?>

сделать следующую конструкцию

while ($n = db_fetch_object($result)) {
если $node.1 = '' делаем $node.1 = node_view(node_load($n->nid), 1, 0)
иначе #node.n+1
}

и уже в сетке сделать вывод типа:

<div class=grid><?php print $node.1; ?></div>
<div class=grid><?php print $node.2; ?></div>
<div class=grid><?php print $node.3; ?></div>

Это я так вижу рациональный вариант.

Аватар пользователя varvashenia varvashenia 8 июля 2011 в 8:19
<?php
print '<div class="grid">'.node_view(node_load($n->nid), 10).'</div>';
?>

и в каждом снипете (для каждого $types) сделайте свой $num_nodes
Хотя я запихнул-бы вьюсы в блоки и расставил в нужном порядке и в нужном месте и не парился.

Аватар пользователя Serge66 Serge66 8 июля 2011 в 14:29

"varvashenia" wrote:
Хотя я запихнул-бы вьюсы в блоки и расставил в нужном порядке и в нужном месте и не парился.

9 вюсов в одном блоке? Или как?
"mangust59" wrote:
рациональный вариант.
Уже нет..
Посмотри как во вьюсах сделан тот же стандартный трекер. У тебя в принципе то же, только с ограничением на тип материала и вывод в сетке.

Аватар пользователя varvashenia varvashenia 10 ноября 2015 в 11:47

Подробный алгоритм:
1. делаем новое представление для материалов (views-1.gif)
2. вбиваем общие настройки для всех представлений. Стиль (views-2.gif), критерии сортировки (views-3.gif), фильтры (views-4.gif)
3. создаём новый вид типа блок (views-5.gif)
4. для него переопределяем фильтр тип материала (views-6.gif)
5. создаём ещё один блок (views-7.gif)
6. переопределяем тип материала на следующий нужный (views-8.gif)
7. настраиваем количество отображаемых элементов сразу для всех видоблоков или для каждого по отдельности (views-9.gif)
8. повторяем до наступления сатисфакции
9. сохраняемся и идём в управление блоками, где включаем нужные блоки в нужном порядке и для нужных страниц (views-10.gif)
10. в теме накатываем CSS до соотвествия дизайну

Аватар пользователя mangust59 mangust59 9 июля 2011 в 12:38

[РЕШЕНО]

Решил таки, собрав сделав 9 Views, с сортировкой по убыванию, с пропусканием n+1 материала в каждом следующем за первом Views.

Вывод реализовал следующем образом:

<!-- ЯЧЕЙКА 1 -->
<div class=grid>
<?php
print views_embed_view('НАЗВАНИЕ ПРЕДСТАВЛЕНИЯ',  'ID БЛОКА', $node->nid);
?>
</div>

И так девять раз подряд, изменяя лишь ID БЛОКА на +1.

Кто подскажет насколько правильное это решение и не повлечет ли оно за собой проблем в будущем?

Аватар пользователя Serge66 Serge66 9 июля 2011 в 13:48

Сколько материалов в одном блоке?
Блоки выводишь в отдельном регионе или они должны выводиться в какой-либо ноде?

Аватар пользователя Serge66 Serge66 10 июля 2011 в 6:26

Слава изобретателям велосипедов на костыльном ходу!
Нахрена делать то, что должен делать Друпал. Ты firebug'ом смотрел на свою страницу?

Аватар пользователя Dan Dan 10 июля 2011 в 7:34

Вы чо, все, ебанулись?! 9 views! А чего не 18, по 0.5 ноды?

Делай нормальную выборку 9-ти последних нод с помощью views, потом нажимай Theme: information и темизируй.

Если темизацию не осилил, используй Semantic Views

Аватар пользователя varvashenia varvashenia 11 июля 2011 в 8:04

Dan wrote:
Вы чо, все, ебанулись?! 9 views! А чего не 18, по 0.5 ноды?
Делай нормальную выборку 9-ти последних нод с помощью views, потом нажимай Theme: information и темизируй.
Если темизацию не осилил, используй Semantic Views

Дык так-же вроде подтянулись разные типы контента в каждом блоке - если тип один, то тогда однозначно один вьюс в блоке + ccs.

Аватар пользователя Serge66 Serge66 10 июля 2011 в 9:13

Как я догадываюсь ТС сделал верстку страницы в HTML, а теперь пытается втолкнуть в нее Друпал

"Dan" wrote:
Вы чо, все, ебанулись
Ну, допустим не все. Я еще в первом коменте более-менее подробно все написал.

Аватар пользователя Dan Dan 10 июля 2011 в 10:01

"Serge66" wrote:
Ну, допустим не все. Я еще в первом коменте более-менее подробно все написал.

Ты бездействовал. Надо было всех расстрелять! Smile

Аватар пользователя Dan Dan 11 июля 2011 в 12:33

Не вижу, где ТС говорит про разные типы контента. Ему практически подошёл сниппет с drupalka.ru, а там один тип контента.

Аватар пользователя varvashenia varvashenia 11 июля 2011 в 20:47

Dan wrote:
Не вижу, где ТС говорит про разные типы контента. Ему практически подошёл сниппет с drupalka.ru, а там один тип контента.

вот из этого я такой вывод сделал:
"mangust59" wrote:
Да и потом еще на этой же странице другой тип материалов тоже в ячейках надо будет выводить.