#drupal #drupal-theming
#drupal #drupal-тематизация
Вопрос:
Как я могу написать некоторый условный PHP, чтобы что-то сделать, если узел помечен определенным термином?
Я хочу изменить свой node-type.tpl.php файл, этот код предназначен для страницы узла, а не для страниц со списком таксономии.
В идеале я хотел бы использовать текстовое название термина, а не его числовое название. Это просто облегчает мне задачу, когда я буду смотреть на код позже.
Если быть точным, я действительно хочу напечатать некоторые материалы, если у узла нет определенного тега.
Спасибо
Обновить
Я получил его код из модуля шаблона содержимого:
<?php print $node->taxonomy[2]->name ?>
Он выводит название термина, если идентификатор термина равен 2. Так можно ли его изменить, чтобы напечатать что-то другое, если идентификатор термина равен 2?
Ответ №1:
Заставил его работать с:
<?php if ($node->taxonomy[5]): ?>
print stuff here
<?php endif; ?>
Спасибо за ваши ответы, ребята. Они вполне могут быть более мощными решениями или лучше каким-то другим способом, но их реализация была за пределами моих знаний.
Ответ №2:
function phptemplate_preprocess_node(amp;$variables){
/*
* You can change $variables items
* or add own
* Then use defined variables in node-type.tpl.php
*/
}
Мой собственный предварительный процесс
/**
* Override or insert PHPTemplate variables into the templates.
*/
function phptemplate_preprocess_node(amp;$vars) {
$node = $vars['node'];
if ($node->build_mode === NODE_BUILD_NORMAL || $node->build_mode === NODE_BUILD_PREVIEW) {
$build_mode = $vars['teaser'] ? 'teaser' : 'full';
}
elseif ($node->build_mode === NODE_BUILD_RSS) {
$build_mode = 'rss';
}
else {
$build_mode = $node->build_mode;
}
$vars['template_files'][] = 'node--' . $build_mode;
$vars['template_files'][] = 'node-' . $node->type . '-' . $build_mode;
$vars['template_files'][] = 'node-' . $node->type . '-' . $build_mode . '-' . $node->nid;
$preprocess = array(
'report_preprocess_node_' . $node->type,
'report_preprocess_node__' . $build_mode,
'report_preprocess_node_' . $node->type . '_' . $build_mode,
'report_preprocess_node_' . $node->type . '_' . $build_mode . '_' . $node->nid
);
foreach (array_reverse($preprocess) as $function) {
if (function_exists($function)) {
$function($vars);
break;
}
}
}
Комментарии:
1. Я предполагаю, что второй код идет в моем template.php куда идет первый код? Как я могу затем написать условный php на моей странице узла? Спасибо
2. Этот код для template.php Например.: $variables[‘my_var’] = ‘foo’; В узле-[тип].tpl.php <?php print $my_var; ?>
3. Извините, я все еще не понимаю, я никогда раньше не занимался тематизацией такого уровня. Итак, я добавляю оба кода в свой template.php или только 2-м? Тогда как мне определить термин таксономии как переменную, чтобы я мог вызывать его на своей странице?
Ответ №3:
Это довольно легко сделать, создав узел-[тип].tpl.php файл в вашей теме. Используя чистый PHP, просто проверьте, есть ли у узла определенный термин таксономии, и распечатайте некоторые данные, или не делайте этого, как требуется.
Вы можете настроить /modules/node/node.tpl.php или node.tpl.php в вашей теме.
Вам могут оказаться полезными taxonomy_node_get_terms и taxonomy_node_get_terms_by_vocabulary.
Комментарии:
1. Я уже использую узел-[тип].tpl.php но как мне проверить термин таксономии с помощью php? Я нашел много статей о том, как распознать термин таксономии, если узел находится на странице термина, но я не знаю, как получить помеченные термины со страницы узла. Спасибо
2. Я обновил свой ответ некоторыми функциями drupal api, которые вы можете использовать для получения терминов таксономии для узла.
3. Вторая ссылка звучит многообещающе, поскольку описание гласит «Найти все термины, связанные с данным узлом, в пределах одного словаря», но как мне использовать этот код? В первом сообщении «Example using this hook» выводится текст, зависящий от того, какие словари используются, но вместо этого мне нужно что-то напечатать, если используется термин. Спасибо
4. Ну, у вас есть доступ к объекту $node в шаблоне, так что вы можете вызвать
taxonomy_node_get_terms($node->nid);
, чтобы получить список всех терминов, например. Используйтеprint_r
для проверки этих объектов илиdsm
, если у вас включен модуль devel.5. Я слышал о таком методе раньше, и я вроде понимаю теорию, но это немного выше моего понимания. Используя модуль шаблона содержимого, я обнаружил, что следующий код печатает название термина, если его идентификатор равен 2. Могу ли я изменить код, чтобы печатать что-то, если идентификатор термина равен 2?: <?php print $node->taxonomy[2]->name ?> Спасибо
Ответ №4:
В template.php
function phptemplate_preprocess_node(amp;$variables){
$node = $variables['node'];
$taxonomy = $node->taxonomy;
$items = array();
foreach($taxonomy AS $term){
$items[] = l($term->name, taxonomy_term_path($term));
}
$variables['my_term_links'] = theme_item_list($items);
}
В node-[тип].tpl.php
print $my_term_links;