(решено) Темизация ноды с пошаговой проверкой.

6 января 2011 в 4:44
Аватар пользователя Lopar Lopar 0 13

Камрады, подскажите элегантное решение проблемы:

Мне необходимо, чтобы в ленте новостей каждая пятая нода выделялась стилем. Каким образом и куда прикрутить счётчик, чтобы он автоматически отсчитывал пять нод и применял опцию. Всё это с учётом случайности выводимых нод: мне нужно не привязка к определенным нодам, а действие с шагом.

А то мозги уже совсем не варят.
Спасибо.

Комментарии

Выводи новости вьюсом, добавь поле счетчика (во вью 3 есть), добавь custom_field с выводом признака. Ну а дальше это все можно темизировать...

6 января 2011 в 5:06

Да, забыл уточнить, в данной ситуации приходится обходиться без сск и вьювов. Заказчику это почему-то очень критично. Приходится искать именно костыли.

6 января 2011 в 5:33

"Lopar" wrote:
приходится обходиться без сск и вьювов. Заказчику это почему-то очень критично

Поубивал бы таких "грамотных" заказчиков. Smile

6 января 2011 в 6:37
Аватар пользователя Dan Dan 0

Если заказчик знает как надо делать, значит пусть он и делает.
Если заказчик придёт к строителям и скажет "сваи этой многоэтажки будем делать не из бетона, а из дерева - так сейчас моднее", думаете строители кинуться сосны в землю забивать?

С другой стороны, если вы это оговорили ранее, то теперь вам и выкручиваться Smile

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

6 января 2011 в 12:51
Аватар пользователя Dan Dan 0

"Lopar" wrote:
Если заказчик платит за смену ТЗ и за новые условия - это редкий, прям таки золотой заказчик...

Не понял. А что, при изменении ТЗ и условий, цену менять не надо?
Эдак я вам закажу простой блог, а в процессе работы поменяю ТЗ, вписав туда задание на новостной портал. Будете спокойно делать?
Думаю это вполне нормальная ситуация, что в процессе разработки у заказчика возникают дополнительные желания. Продолжая аналогию со строительством, если мне захочется в придачу к строящемуся дому построить и детскую площадку, вполне ожидаемо, что подрядчик выставит мне дополнительную смету на неё, так ведь?
Тут весь вопрос в организации работы. А она проста. Написали ТЗ, согласовали сроки и цены, все дополнения/изменения согласуются отдельно. Да, это бюрократия, но сэкономленные время и деньги того стоят.
Аналогично с вашей ситуацией. Если не оговаривалось, что надо делать без CCK и Views, значит реализация на усмотрение исполнителя (т.к. читать мысли не умеем и понятие "я имел ввиду то-то" в технической документации отсутствует). Если у заказчика вдруг возникли мысли по способу реализации, то это уже, по сути, изменения в ТЗ.

7 января 2011 в 12:10

"Dan" wrote:
Не понял. А что, при изменении ТЗ и условий, цену менять не надо?
Эдак я вам закажу простой блог, а в процессе работы поменяю ТЗ, вписав туда задание на новостной портал. Будете спокойно делать?

Тю, вам что ни разу не попадались люди, которые после заверенного ТЗ начинали канючить "а сюда кнопочку добавьте, чего вам стоит" или "рамки сделайте пошире, я хочу больше воздуха". И обижаются...

А тут человек сразу: сколько вам нужно доплатить чтобы вы...
Я всего лишь говорю что ТАКИХ заказчиков мало. И всё тут.

7 января 2011 в 19:45
Аватар пользователя Dan Dan 0

"Lopar" wrote:
А тут человек сразу: сколько вам нужно доплатить чтобы вы...

Пардон, я не понял, что у вас адекватный заказчик Smile

Так ещё раз, в чём проблема? Вам нужно изменить стандартный вывод нод?
Идём сюда: node_menu, видим что для вывода нод используется ф-ция node_page_default
Делаем hook_menu_alter для изменения стандартного обработчика вывода нод, на свой, по образу и подобию node_page_default, всё что нужно изменить в нашем обработчике, так это код:

$output = '';
  $num_rows = FALSE;
  while ($node = db_fetch_object($result)) {
    $output .= node_view(node_load($node->nid), 1);
    $num_rows = TRUE;
  }

, вставив счётчик, о котором вы и спрашивали. Ещё можно в объект ноды вставить флаг, что это пятая нода, примерно так:

...
  $node_obj = node_load($node->nid);
  $node_obj->five_flag = ($count == 5);
  $output .= node_view($node_obj), 1);
  $count = ($count >= 5)? 0 : $count + 1;
  $num_rows = TRUE;
...

Если вы уже писали свои модули, то никаких сложностей по моему mini-howto у вас возникнуть не должно )

7 января 2011 в 22:19

Занятный вариант. А если удалять промежуточные ноды
(1,2,3,4,5!,6,7,8,9,10!) => (1,3,5,6,7!,9,11,15,16!)

флаги сами перепрыгнут из 5-10 на 7-16?

если туплю - бейте ногами. нехватка здорового сна в организме сказывается...

8 января 2011 в 6:18

node.tpl.php

<?php
$class = '';
if (++$GLOBALS['nodecounter'] == 5) {
  $class = 'five';
  $GLOBALS['nodecounter'] = 0;
}
?>
<div class="node <?php echo $class; ?> ...>
  ...
</div>

можно static переменную в preprocess_node завести

8 января 2011 в 7:46
Аватар пользователя Dan Dan 0

Только надо иметь ввиду, что это будет работать во всех списках, которые используют шаблон node.tpl.php, например в терминах таксономии.

8 января 2011 в 18:39