Массив $terms - приведение к html-списку

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

Аватар пользователя marazmus marazmus 8 сентября 2006 в 13:05

Есть массив $terms, содержимое которого выводится в конце каждой ноды - ссылки на элементы таксономии, которые "присвоены" это ноде.

Плохо то, что в нем один элемент, который есть просто набор ссылок, разделенных символом "|". Прикольно, но в моем случае крайне неудобно, т.к. есть необходимость этот список ссылок представить в виде элементов неупорядоченного списка (ul-li). Где копать, подскажите пожалуйста.

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

Спасибо заранее.

Комментарии

Аватар пользователя marazmus marazmus 8 сентября 2006 в 13:24

Нашел что-то похожее на правду - в файле theme.inc есть функция theme_links, которая возвращает отданный ей массив в виде "те же элементы массива + прилепленный к ним делимитер"...

Щас бы еще разобраться, как "безопасно" заменить это все на список ul-li

Аватар пользователя marazmus marazmus 8 сентября 2006 в 14:15

Сделал так:

//  return implode($delimiter, $links);
return $links;

т.е. function theme_links возвращает не "схлопнутый" массив, а массив ссылок, с которыми можно делать что угодно дальше в теме - что я и сделал, "запихав" их уже в node.tpl в html-список.

Аватар пользователя rgb rgb 8 сентября 2006 в 23:14

Могу и ошибаться, но у $node (она доступна в контексте node.tpl.php) есть поле taxonomy, которое и содержит искомый массив ссылок на термины.

И один совет: не надо без особой необходимости править ядро (theme.inc, в частности) - меньше проблем будет как со сторониими модулями (которые пишутся в расчёте на определенное поведение ядра), так и с обновлениями Дрюпала.

Если это не то, что Вам надо, пишите - помогу найти другой вариант Smile

Аватар пользователя marazmus marazmus 9 сентября 2006 в 17:45

Quote:
Могу и ошибаться, но у $node (она доступна в контексте node.tpl.php) есть поле taxonomy, которое и содержит искомый массив ссылок на термины.

Это именно массив? Т.е. не implode-нутая строка, а массив ссылок, по которому можно "пробежаться" foreach? Тогда все нормально, буду использовать это поле Smile

Quote:
И один совет: не надо без особой необходимости править ядро (theme.inc, в частности) - меньше проблем будет как со сторониими модулями (которые пишутся в расчёте на определенное поведение ядра), так и с обновлениями Дрюпала.

Да это я понял, спасибо. Больше уж от безысходности туда залез, "по следам бременских музыкантов", т.к. пока нет четкого понимания, как работает "темизация" друпала. А пхп сам по себе ввергает меня в жестокое уныние...

Спасибо всем за советы Smile

Аватар пользователя Dan Dan 9 сентября 2006 в 2:39

Не стоит править код в ядре, всё можно сделать снаружи.
Навскидку сделал следующее (тема - bluemarine):
1. в каталоге темы создал файл template.php
2. в этот файл вставил функцию:
<?php
function bluemarine_links($links, $delimiter = ' | ') {
if( $delimiter == 'links' )
return '

  • '.implode('
  • ', $links).'

';
else
return implode($delimiter, $links);
}
?>
смысл следующий: при стандартном вызове, все ссылки формируются с разделителем "|" иначе, при вызове с параметром-разделителем 'links', должен выводиться список ссылок.
3. смотрю страницу - ничего не изменилось. всё по плану.
4. вставляю в node.tpl.php вместо строки
<?php if ($links) print '

'?>
строку
<?php if ($node->links) print '

'?>
5. вместо списка получаю "read morelinkscomment", то есть проблема в 3-й строке файла template.php: <?php if( $delimiter == 'links' ) ?>, - функция получает в качестве параметра 'links', но сравнение почему-то не проходит...
пробовал использовать двойные кавычки и ф-ю srtcmp для сравнения - нуль. Кто что скажет?

Аватар пользователя rgb rgb 9 сентября 2006 в 10:51

На сколько я понял, человеку надобно было просто вывести термины в том виде, как он хочет:

Quote:
...есть необходимость этот список ссылок представить в виде элементов неупорядоченного списка (ul-li).

В этом случае всё проще (см. выше). Вы же описали пример более "хардкорного" кастомайзинга темы Smile

Аватар пользователя dyp@drupal.org dyp@drupal.org 9 сентября 2006 в 22:16

чтобы не сомневаться можно поставить модуль contemplate, он показывает все переменные дступные ноде. то же самле делает модуль devel

Аватар пользователя Dan Dan 10 сентября 2006 в 3:06

Чёрт, глюки:
вместо
theme_links($node->links,'links')
надо писать (в данном случае):
bluemarine_links($node->links,'links')
тогда всё работает.

PS: Понимаю, что не актуально, но считаю нужным поправить.

Аватар пользователя marazmus marazmus 10 сентября 2006 в 9:31

Будем пробовать, спасибо Smile

Надыбал Drupal Cheatsheet, там все эти $-переменные расписаны.
Ну и пойду курить заодно мануалы на друпал.орг.

Друпал ведь он как оливки - кто не распробовал, тот плюется. А кто врубился в фишку, тот что-только не может сделать с этими оливками Smile
Закусь под водку (читай - движок и контент, без наворотов Smile ) - самое простое, что можно сделать...

Аватар пользователя rgb rgb 11 сентября 2006 в 17:17

Quote:
http://drupal.org/node/44731
Самое то - что дохтур прописал:

Ну и для полноты картины можно вот это глянуть. И вообще там много интересного по теме...

Quote:
Друпал ведь он как оливки - кто не распробовал, тот плюется.

Золотые слова! Smile

Аватар пользователя Dan Dan 10 сентября 2006 в 15:31

Или так Smile

Там маленькая ошибка:
вместо
<?php print '

' . implode($delimiter, $links['primary']) . '

'; ?>
надо
<?php print '

  • ' . implode($delimiter, $links['primary']) . '
  • '; ?>