Возникла тут с дикого утреннего бодуна после отгремевшего вчера предновогоднего корпоративчика мысль раскрасить друпал в цвета российского флага. Точнее его таблицы.
Возможность отличить четную строку таблицы от нечетной предоставляется в ядре Drupal, в стандартом выводе таблиц для каждой строки tr присутствуют классы odd и even. А при выводе нод есть переменная с метким названием $zebra, указывающая на четность или нечетность ноды в списке. Но иногда возникает необходимость (дизайнер, гад, нарисовал) отличать каждую третью или десятую строку таблицы и соответствующим образом изменять её внешний вид при помощи CSS-правил.
За вывод табличного содержимого в Drupal отвечает функция theme_table(). Чтобы добавить в вывод таблиц свои возможности надо написать в файле вашей темы template.php пользовательскую функцию с названием phptemplate_table(). Параметры функции должны совпадать с исходной, а код мы скопируем оттуда же и лишь немного дополним его. Для данного примера мои приправы в этот PHP-супчик находятся в строках 59-69:
-
// Add sticky headers, if applicable.
-
// Add 'sticky-enabled' class to the table to identify it for JS.
-
// This is needed to target tables constructed by this function.
-
$attributes['class'] = empty($attributes['class']) ? 'sticky-enabled' : ($attributes['class'] .' sticky-enabled');
-
}
-
$output .= '<caption>'. $caption ."</caption>\n";
-
}
-
// Format the table header:
-
// HTML requires that the thead tag has tr tags in it follwed by tbody
-
// tags. Using ternary operator to check and see if we have any rows.
-
foreach ($header as $cell) {
-
}
-
// Using ternary operator to close the tags based on whether or not there are rows
-
}
-
else {
-
}
-
// Format the table rows:
-
$output .= "<tbody>\n";
-
$class = 'even';
-
foreach ($rows as $number => $row) {
-
// Check if we're dealing with a simple or complex row
-
foreach ($row as $key => $value) {
-
if ($key == 'data') {
-
$cells = $value;
-
}
-
else {
-
$attributes[$key] = $value;
-
}
-
}
-
}
-
else {
-
$cells = $row;
-
}
-
// Add odd/even class
-
$class = $flip[$class];
-
$attributes['class'] .= ' '. $class;
-
}
-
else {
-
$attributes['class'] = $class;
-
}
-
switch ($number % 3) {
-
case 0:
-
break;
-
case 1:
-
break;
-
case 2:
-
break;
-
}
-
// Build row
-
$i = 0;
-
foreach ($cells as $cell) {
-
}
-
$output .= " </tr>\n";
-
}
-
}
-
-
$output .= "</tbody>\n";
-
}
-
-
$output .= "</table>\n";
-
return $output;
-
}
Если кому-то непонятно, почему 0 - это один, 1 - это два, а 2 - это три, отвечу, что так считают даже трезвые программисты.
Теперь добавим в файл стилей темы (обычно style.css) немного краски
background: white;
}
.two, tr.two {
background: blue;
}
.three, tr.three {
background: red;
}
И результат:
Мдя, такие дурацкие ура-патриотические идеи приходят в голову именно с похмелья. Тут, пожалуй, хороший дизайнер должен подобрать цвета получше. Но нам важен принцип работы кода, а не его внешний вид, который может быть любым.
Если вам необходимо использовать в дизайне таблиц пять цветов, то добавленный код дожен быть таким:
case 0:
$attributes['class'] = empty($attributes['class']) ? 'one' : ($attributes['class'] .' one');
break;
case 1:
$attributes['class'] = empty($attributes['class']) ? 'two' : ($attributes['class'] .' two');
break;
case 2:
$attributes['class'] = empty($attributes['class']) ? 'three' : ($attributes['class'] .' three');
break;
case 3:
$attributes['class'] = empty($attributes['class']) ? 'four' : ($attributes['class'] .' four');
break;
case 4:
$attributes['class'] = empty($attributes['class']) ? 'five' : ($attributes['class'] .' five');
break;
}
А если просто выделить каждую десятую строку, то так:
И не забудьте про соответствующие этим классам CSS-правила в файле стилей.
Источники:
[ru-api=theme_table]
Мътросы на зебрахъ, или Как раскрасить Drupal в цвета российского флага
ЗЫ. Всех с Новым 2009-м годом!
Комментарии
Есть предложение создать раздел ПЕРЛЫ С БОДУНА :))))).
По сути топика - полезно, плюсанул бы.
С наступающим НГ.
спасибо, полезно
Выглядит неэстетично, но патриотично Плюс одинъ
Спасибо! Да, практично. А если еще креатив к CSS приложить, то работа в админке веселее и эстетичнее будет. И для зарегенных юзеров, у кого они есть.
Ну, визуальный креатив как-то не в моих возможностях.
Предпосылки и конечный вид весьма забавны, но главное — реализация. За её растолковывание отдельное Вам спасибо!
судя по скрину вы чтото выкурили )))))))
Я? да я всего лишь взял три самых известных в России цвета...
У нас, конечно, приханкайские поляны знамениты не менее чуйских долин, но корпоративы в нашей конторе проходят под шампанское и коньячок.
Хорошая заметка. Полезно.
Отмечу лишь мелкую «опечатку»
В место 5 явно 10 просится
Спасибо, исправил. Этот кусок кода я не тестил.
Патриоты Drupalъ, браво !
Даешь новый аватар!!!))))))
Всех с Новым Годом!
Ну, а по-моему, статья совершенно не информативна.
Это все равно что расписать как же нам добавить на каждую страничку еще один логотипчик. Действительно,о Боже, как?!
Вот если бы написали, как это все проделать для какой-то конкретной вьюхи или таблицы.
Вообще это минус финкции, что на классы odd и even вообще ничто не влияет; - хорошо хоть можно для тегов table и td передавать свои классы. Интересно чем tr перед разработчиками провинилося?
Хм, что интересно, половина топиков этого сайта как раз об этом - люди не знают как в страничку добавить еще один логотипчик. Вот и поделитесь тоже с народом, как это сделать.
В функции [ru-api=theme_table] имеется параметр attributes. Приличные модули выводя таблицы добавляют туда класс или айди имени себя. Пишете такую же функцию, проверяете параметры, если совпало - ваш код, если нет - прямой вызов системной theme_table.
CSS на них очень даже влияет... Для того и нужны.
direqtor, я этого не писал
Извиняюсь... Какой-то глюк. Вроде пользовался кнопкой Цитировать, но почему-то ваше имя встало... И не отредактируешь уже, почему-то (ушол биться ап стену)
У меня тоже однажды было такое, потом древовидные включил.
CSS на все влияет =)))
Как раз сегодня надо было выделить строки если они входят в определенный словарь, думал
по-быренькому найти готовое, ан нет, пришлось выдумывать
Ну вот надо мне выделить,например, 5 строчку. Я сначала думал что есть какая то возможность указать функции на то, чтобы вместо класса 'odd' или 'even' она использовала тот, что я передам (как,это уже другой вопрос). А тут все жестко или белое или серое.
Собственно вот этим боком и относятся.
...
Аааа, как глухой со слепым!
Я к тому что нет возможности заменить стандартные классы строки через параметры функции (как например добавление класса к тегу table), а не к тому как окрасить сто какую-то там строку; это как раз тривиально.
Ладно, будем считать, что мы оба не поняли друг-друга.
Если вы формируете таблицу сами - например в модуле, то можете ставить строкам какие угодно классы.
Как сделать такое же если нужно раскрасить вывод views, в нетабличном виде?