Возникла тут с дикого утреннего бодуна после отгремевшего вчера предновогоднего корпоративчика мысль раскрасить друпал в цвета российского флага. Точнее его таблицы.
Возможность отличить четную строку таблицы от нечетной предоставляется в ядре 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-м годом!
Комментарии
Есть предложение создать раздел ПЕРЛЫ С БОДУНА :))))).![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
По сути топика - полезно, плюсанул бы.
С наступающим НГ.
спасибо, полезно![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
Выглядит неэстетично, но патриотично
Плюс одинъ ![Wink](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/wink.gif)
Спасибо! Да, практично. А если еще креатив к CSS приложить, то работа в админке веселее и эстетичнее будет. И для зарегенных юзеров, у кого они есть.
Ну, визуальный креатив как-то не в моих возможностях.
Предпосылки и конечный вид весьма забавны, но главное — реализация. За её растолковывание отдельное Вам спасибо!
судя по скрину вы чтото выкурили )))))))
Я? да я всего лишь взял три самых известных в России цвета...
У нас, конечно, приханкайские поляны знамениты не менее чуйских долин, но корпоративы в нашей конторе проходят под шампанское и коньячок.
Хорошая заметка. Полезно.
Отмечу лишь мелкую «опечатку»
В место 5 явно 10 просится
Спасибо, исправил. Этот кусок кода я не тестил.
Патриоты Drupalъ, браво !![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
Даешь новый аватар!!!))))))
Всех с Новым Годом!
Ну, а по-моему, статья совершенно не информативна.![ROFL](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/ROFL.gif)
Это все равно что расписать как же нам добавить на каждую страничку еще один логотипчик. Действительно,о Боже, как?!
Вот если бы написали, как это все проделать для какой-то конкретной вьюхи или таблицы.
Вообще это минус финкции, что на классы odd и even вообще ничто не влияет; - хорошо хоть можно для тегов table и td передавать свои классы. Интересно чем tr перед разработчиками провинилося?
Хм, что интересно, половина топиков этого сайта как раз об этом - люди не знают как в страничку добавить еще один логотипчик. Вот и поделитесь тоже с народом, как это сделать.
В функции [ru-api=theme_table] имеется параметр attributes. Приличные модули выводя таблицы добавляют туда класс или айди имени себя. Пишете такую же функцию, проверяете параметры, если совпало - ваш код, если нет - прямой вызов системной theme_table.
CSS на них очень даже влияет... Для того и нужны.
direqtor, я этого не писал![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
Извиняюсь... Какой-то глюк. Вроде пользовался кнопкой Цитировать, но почему-то ваше имя встало... И не отредактируешь уже, почему-то
(ушол биться ап стену)
У меня тоже однажды было такое, потом древовидные включил.
CSS на все влияет =)))
Как раз сегодня надо было выделить строки если они входят в определенный словарь, думал
по-быренькому найти готовое, ан нет, пришлось выдумывать
Ну вот надо мне выделить,например, 5 строчку. Я сначала думал что есть какая то возможность указать функции на то, чтобы вместо класса 'odd' или 'even' она использовала тот, что я передам (как,это уже другой вопрос). А тут все жестко или белое или серое.
Собственно вот этим боком и относятся.
...
Аааа, как глухой со слепым!![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
Я к тому что нет возможности заменить стандартные классы строки через параметры функции (как например добавление класса к тегу table), а не к тому как окрасить сто какую-то там строку; это как раз тривиально.
Ладно, будем считать, что мы оба не поняли друг-друга.
Если вы формируете таблицу сами - например в модуле, то можете ставить строкам какие угодно классы.
Как сделать такое же если нужно раскрасить вывод views, в нетабличном виде?