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

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

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

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

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

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

Комментарии

Аватар пользователя kodo kodo 6 января 2011 в 5:06

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

Аватар пользователя Lopar Lopar 6 января 2011 в 5:33

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

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

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

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

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

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

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

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

Аватар пользователя Dan Dan 7 января 2011 в 12:10

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

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

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

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

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

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

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

"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 у вас возникнуть не должно )

Аватар пользователя Lopar Lopar 8 января 2011 в 6:18

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

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

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

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

node.tpl.php

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

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

Аватар пользователя Dan Dan 8 января 2011 в 18:39

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