Drupal — условный PHP, если узел помечен определенным термином таксономии

#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;