Когда-то встречал подобное и даже делал... Стоит задача сделать в page.tpl.php, чтобы в нодах отображался ID термина таксономии, к которому они относятся. Наподобие как в node.ptl.php можно получить id ноды по nid. Искал по форуму - то ли плохо искал, то ли поиск такой, то ли этого здесь нет. Никто не подскажет?...
Комментарии
Почувствуйте разницу, как говорится. Что-то одно из двух: или в page.tpl.php или в node.tpl.php. В последнем копайте поле термина.
Да суть не в этом. Сам вызов tid родителя не помню...
Просто поясню, зачем мне это надо. Есть список терминов, привязанный к товарам. Но фильтр на категориях товаров разный. Например в сумках для ноутбуков скрыты диагональ экрана, hdd и т.д. В мониторах скрыты размеры, hdd и т.д.
В каталоге я эту проблему решил, так как у страницы классы по id термина. То же самое хочу сделать на внутренних страницах товара. Для этого хочу, чтобы на странице товара выводился класс, например class="product-term-15".
Почему не катит вариант с node.tpl.php, потому что сайдбары не относятся к ноде. Ну как-то так.
В 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'];
}
}
?>
Что-то не получается. Вот такой код:
<?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'];
}
}
?>
Даже никакой ошибки, чтобы было понятно, куда копать. просто белый экран...
Если белый экран, скорее всего ошибка PHP.
Доступ к логам php есть?
Проверьте, на всякий пожарный, нет ли в template.php или еще где-то в папке темы такой функции: basic_preprocess_html
Кстати, какая тема оформления используется?
Использую 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).
Закомметируйте содержимое блока if(условие - оставте) и проверьте, осталась ли ошибка (белый экран)
Если осталась - закомметируйте весь блок if
Если осталась - проблема в наименовании функции
Все равно вылетает эта ошибка. Пробовал вставить код в конец этой функции, которая уже существует...
<?php function basic_preprocess_html(&$vars) {
// Add role name classes (to allow css based show for admin/hidden from user)
// HTML Attributes
// Convert RDF Namespaces into structured data using drupal_attributes.
// Flatten the HTML attributes and RDF namespaces arrays.
// Add IE classes.
global $user, $language;
foreach ($user->roles as $role){
$vars['classes_array'][] = 'role-' . basic_id_safe($role);
}
// 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;
$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);
}
$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('/', $path, 2);
$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';
}
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_versions, TRUE)) {
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_versions, TRUE)) {
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'];
}
} ?>
Попробуйте так:
<?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 или алиас ноды?
Да. Простая страница. Но все равно выдает ошибку и не добавляет класс.
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; а вот со второй, почему функция думает, что это несуществующий объект - непонятно. Буду колупать...
Он не хочет воспринимать переменную $node. Хотя в других функциях с ней проблем нет.
В этой строке какой код:
строка 96 в файле /var/www/webz.pw/data/www/grand.webz.pw/sites/all/themes/basic/template.php
??
В 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'];
}
} ?>
Ошибка пропала. Но не появился класс. Условие не выполняется.
В верху страницы выведется текущий путь и содержимое $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'];
}
} ?>
Этот вариант заработал! Спасибо огромное!!! Ставлю [РЕШЕНО]