Получить ID термина таксономии, к которому пренадлежит нода [РЕШЕНО]

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

Аватар пользователя Tibor_Ferenci Tibor_Ferenci 16 июля 2016 в 1:37

Когда-то встречал подобное и даже делал... Стоит задача сделать в page.tpl.php, чтобы в нодах отображался ID термина таксономии, к которому они относятся. Наподобие как в node.ptl.php можно получить id ноды по nid. Искал по форуму - то ли плохо искал, то ли поиск такой, то ли этого здесь нет. Никто не подскажет?...

Комментарии

Аватар пользователя OldWarrior OldWarrior 16 июля 2016 в 1:48

Tibor_Ferenci wrote:

сделать в page.tpl.php

Tibor_Ferenci wrote:

чтобы в нодах отображался

Почувствуйте разницу, как говорится. Что-то одно из двух: или в page.tpl.php или в node.tpl.php. В последнем копайте поле термина.

Аватар пользователя Tibor_Ferenci Tibor_Ferenci 16 июля 2016 в 10:12

Просто поясню, зачем мне это надо. Есть список терминов, привязанный к товарам. Но фильтр на категориях товаров разный. Например в сумках для ноутбуков скрыты диагональ экрана, hdd и т.д. В мониторах скрыты размеры, hdd и т.д.
В каталоге я эту проблему решил, так как у страницы классы по id термина. То же самое хочу сделать на внутренних страницах товара. Для этого хочу, чтобы на странице товара выводился класс, например class="product-term-15".
Почему не катит вариант с node.tpl.php, потому что сайдбары не относятся к ноде. Ну как-то так.

Аватар пользователя Orion76 Orion76 16 июля 2016 в 12:53

В template.php темы оформления:

<?php
function THEME_NAME_preprocess_html(&$variables) {
  if(  
$node menu_get_object() && $node->type ==='NODE_TYPE_NAME')  {
        
$variables['classes_array'][] = "term-class-".$node->TERM_FIELD_NAME['und'][0]['tid'];
  }
}
?>
Аватар пользователя Tibor_Ferenci Tibor_Ferenci 16 июля 2016 в 13:11

Что-то не получается. Вот такой код:

<?php
function basic_preprocess_html(&$variables) {
  if(  
$node menu_get_object() && $node->type ==='product')  {
        
$variables['classes_array'][] = "term-class-".$node->field_product_category['und'][0]['tid'];
  }
}
?>

Даже никакой ошибки, чтобы было понятно, куда копать. просто белый экран...

Аватар пользователя Orion76 Orion76 16 июля 2016 в 13:29

Если белый экран, скорее всего ошибка PHP.
Доступ к логам php есть?
Проверьте, на всякий пожарный, нет ли в template.php или еще где-то в папке темы такой функции: basic_preprocess_html
Кстати, какая тема оформления используется?

Аватар пользователя Tibor_Ferenci Tibor_Ferenci 16 июля 2016 в 13:36

Использую basic
Такая функция действительно там есть, зря сразу не посмотрел. попытался запилить в эту функцию данный код - выдало

Notice: Undefined variable: node в функции basic_preprocess_html() (строка 29 в файле /var/www/webz.pw/data/www/grand.webz.pw/sites/all/themes/basic/template.php).
Notice: Trying to get property of non-object в функции basic_preprocess_html() (строка 29 в файле /var/www/webz.pw/data/www/grand.webz.pw/sites/all/themes/basic/template.php).

Аватар пользователя Orion76 Orion76 16 июля 2016 в 13:33

Закомметируйте содержимое блока if(условие - оставте) и проверьте, осталась ли ошибка (белый экран)
Если осталась - закомметируйте весь блок if
Если осталась - проблема в наименовании функции

Аватар пользователя Tibor_Ferenci Tibor_Ferenci 16 июля 2016 в 13:56

Все равно вылетает эта ошибка. Пробовал вставить код в конец этой функции, которая уже существует...

<?php function basic_preprocess_html(&$vars) {
  global 
$user$language;

  
  

// Add role name classes (to allow css based show for admin/hidden from user)
  
foreach ($user->roles as $role){
    
$vars['classes_array'][] = 'role-' basic_id_safe($role);
  }

  

// HTML Attributes
  // Use a proper attributes array for the html attributes.
  
$vars['html_attributes'] = array();
  
$vars['html_attributes']['lang'][] = $language->language;
  
$vars['html_attributes']['dir'][] = $language->dir;

  

// Convert RDF Namespaces into structured data using drupal_attributes.
  
$vars['rdf_namespaces'] = array();
  if (
function_exists('rdf_get_namespaces')) {
    foreach (
rdf_get_namespaces() as $prefix => $uri) {
      
$prefixes[] = $prefix ': ' $uri;
    }
    
$vars['rdf_namespaces']['prefix'] = implode(' '$prefixes);
  }

  

// Flatten the HTML attributes and RDF namespaces arrays.
  
$vars['html_attributes'] = drupal_attributes($vars['html_attributes']);
  
$vars['rdf_namespaces'] = drupal_attributes($vars['rdf_namespaces']);

  if (!

$vars['is_front']) {
    
// Add unique classes for each page and website section
    
$path drupal_get_path_alias($_GET['q']);
    list(
$section, ) = explode('/'$path2);
    
$vars['classes_array'][] = 'with-subnav';
    
$vars['classes_array'][] = basic_id_safe('page-'$path);
    
$vars['classes_array'][] = basic_id_safe('section-'$section);

    if (

arg(0) == 'node') {
      if (
arg(1) == 'add') {
        if (
$section == 'node') {
          
// Remove 'section-node'
          
array_pop$vars['classes_array'] );
        }
        
// Add 'section-node-add'
        
$vars['classes_array'][] = 'section-node-add';
      }
      elseif (
is_numeric(arg(1)) && (arg(2) == 'edit' || arg(2) == 'delete')) {
        if (
$section == 'node') {
          
// Remove 'section-node'
          
array_pop$vars['classes_array']);
        }
        
// Add 'section-node-edit' or 'section-node-delete'
        
$vars['classes_array'][] = 'section-node-'arg(2);
      }
    }
  }
  
//for normal un-themed edit pages
  
if ((arg(0) == 'node') && (arg(2) == 'edit')) {
    
$vars['template_files'][] =  'page';
  }

  

// Add IE classes.
  
if (theme_get_setting('basic_ie_enabled')) {
    
$basic_ie_enabled_versions theme_get_setting('basic_ie_enabled_versions');
    if (
in_array('ie8'$basic_ie_enabled_versionsTRUE)) {
      
drupal_add_css(path_to_theme() . '/css/ie8.css', array('group' => CSS_THEME'browsers' => array('IE' => 'IE 8''!IE' => FALSE), 'preprocess' => FALSE));
      
drupal_add_js(path_to_theme() . '/js/build/selectivizr-min.js');
    }
    if (
in_array('ie9'$basic_ie_enabled_versionsTRUE)) {
      
drupal_add_css(path_to_theme() . '/css/ie9.css', array('group' => CSS_THEME'browsers' => array('IE' => 'IE 9''!IE' => FALSE), 'preprocess' => FALSE));
    }
  }
  
if(  
$node menu_get_object() && $node->type ==='product')  {
        
$variables['classes_array'][] = "term-class-".$node->field_product_category['und'][0]['tid'];
  }
  
?>
Аватар пользователя Orion76 Orion76 16 июля 2016 в 14:33

Попробуйте так:

<?php
if(arg(0)==='node' && is_numeric(arg(1)) &&  $node menu_get_object() && $node->type ==='product')  {
if(!empty(
$node->field_product_category['und'])){
        
$vars['classes_array'][] = "term-class-".$node->field_product_category['und'][0]['tid'];
}
  }

?>

Я все правильно понимаю, это страница с путем: node/NID или алиас ноды?

Аватар пользователя Tibor_Ferenci Tibor_Ferenci 16 июля 2016 в 15:04

Да. Простая страница. Но все равно выдает ошибку и не добавляет класс.

Notice: Undefined variable: node в функции basic_preprocess_html() (строка 96 в файле /var/www/webz.pw/data/www/grand.webz.pw/sites/all/themes/basic/template.php).
Notice: Trying to get property of non-object в функции basic_preprocess_html() (строка 96 в файле /var/www/webz.pw/data/www/grand.webz.pw/sites/all/themes/basic/template.php).

Ну с первой можно справится например global $node; а вот со второй, почему функция думает, что это несуществующий объект - непонятно. Буду колупать...

Аватар пользователя Tibor_Ferenci Tibor_Ferenci 16 июля 2016 в 18:15

В 96 строке

<?php if(arg(0)==='node' && is_numeric(arg(1)) &&  $node menu_get_object() && $node->type ==='product')  { ?>

Попробовал прописать так:

<?php   if(arg(0)==['node'] && is_numeric(arg(1)) &&  $node menu_get_object() && $vars['node']->type =='product')  {
if(!empty(
$vars['node']->field_product_category['und'])){
        
$vars['classes_array'][] = "term-class-".$vars['node']->field_product_category['und'][0]['tid'];
}
  } 
?>

Ошибка пропала. Но не появился класс. Условие не выполняется.

Аватар пользователя Orion76 Orion76 16 июля 2016 в 18:48

В верху страницы выведется текущий путь и содержимое $router_item
Покажите это сдесь..

<?php

print $_GET['q'].'</br>';
$router_item menu_get_item(NULL);
var_dump($router_item);

if(

arg(0)==='node' && is_numeric(arg(1)))  {
$node menu_get_object();
if(
is_object($node) && $node->type ==='product' && !empty($node->field_product_category['und'])){
        
$vars['classes_array'][] = "term-class-".$node->field_product_category['und'][0]['tid'];
}
  }

?>