[РЕШЕНО] Не переопределяются шаблоны вида page-node-nid.tpl.php

Аватар пользователя chelwolf chelwolf 16 октября 2013 в 17:33

Здравствуйте коллеги, не могу понять в чём проблема - у меня не переопределяются шаблоны вида page-node-nid.tpl.php. Друпал их просто игнорирует (Drupal 6).

Кеш почистил. Грешу на template.php, там у меня касательно шаблонов написано следующее:

<?php
function phptemplate_preprocess_page($vars) {
if (
$vars['node'] && arg(2) != 'edit') {
$vars['template_files'][] = 'page-nodetype-'$vars['node']->type;
}
return 
$vars;
}
function 
chgakitheme_preprocess_page(&$vars) {
  if (
$vars['user']->uid == && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    
array_unshift($vars['template_files'], 'page-login');
    
$vars['body_classes'] .= ' userlogin';
  }
}
function 
chgakitheme_preprocess_node(&$vars$hook) {
$node $vars['node'];
$vars['template_file'] = 'node-'$node->nid;
$vars['has_terms'] = count(taxonomy_node_get_terms($vars['node'])) > 0;
$vars['noder'] = theme('blocks''noder');
$vars['date_day'] = format_date($node->created'custom''j');
$vars['date_month'] = format_date($node->created'custom''m');
$vars['date_year'] = format_date($node->created'custom''Y');
return 
$vars;
}
?>

Подскажите где проблема, я её не вижу. Заранее благодарен.

0 Thanks

Комментарии

Аватар пользователя chelwolf chelwolf 16 октября 2013 в 19:30
q2_faith wrote:

page.tpl.php в папке с темой лежит?

Да на месте, и нод лежит. Шаблоны перехватываются.

Аватар пользователя drupby drupby 16 октября 2013 в 18:02

правишь сайт Челябинской ГАКиИ?
оставь только

function chgakitheme_preprocess_page(&$vars) {
  if ($vars['user']->uid == 0 && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    array_unshift($vars['template_files'], 'page-login');
    $vars['body_classes'] .= ' userlogin';
  }
}
function chgakitheme_preprocess_node(&$vars, $hook) {
  $node = $vars['node'];
  $vars['template_file'] = 'node-'. $node->nid;
  $vars['has_terms'] = count(taxonomy_node_get_terms($vars['node'])) > 0;
  $vars['noder'] = theme('blocks', 'noder');
  $vars['date_day'] = format_date($node->created, 'custom', 'j');
  $vars['date_month'] = format_date($node->created, 'custom', 'm');
  $vars['date_year'] = format_date($node->created, 'custom', 'Y');
}

ps preprocess функции не должны ничего возвращять

Аватар пользователя chelwolf chelwolf 16 октября 2013 в 20:08
drupby wrote:

правишь сайт Челябинской ГАКиИ?
оставь только

function chgakitheme_preprocess_page(&$vars) {
  if ($vars['user']->uid == 0 && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    array_unshift($vars['template_files'], 'page-login');
    $vars['body_classes'] .= ' userlogin';
  }
}
function chgakitheme_preprocess_node(&$vars, $hook) {
  $node = $vars['node'];
  $vars['template_file'] = 'node-'. $node->nid;
  $vars['has_terms'] = count(taxonomy_node_get_terms($vars['node'])) > 0;
  $vars['noder'] = theme('blocks', 'noder');
  $vars['date_day'] = format_date($node->created, 'custom', 'j');
  $vars['date_month'] = format_date($node->created, 'custom', 'm');
  $vars['date_year'] = format_date($node->created, 'custom', 'Y');
}

ps preprocess функции не должны ничего возвращять

Спасибо, когда убрал функцию, которая переопределяет шаблоны страницы типов материала всё заработало, но новая проблема - как тогда переопределять шаблоны типов материала?))
Я взял официальную версию: http://adaptivethemes.com/page-template-suggestions-per-node-type

Но при её использовании вылетает ошибка, оказывается в связке с функцией которая переопределяет страницу входа пользователей (см. выше page-login) она не работает, в связи с этим вопрос правильно ли их соединить вот так:

<?php
function chgakitheme_preprocess_page(&$vars$hook) {
  if (
$vars['user']->uid == && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    
array_unshift($vars['template_files'], 'page-login');
    
$vars['body_classes'] .= ' userlogin';
  }
  if (isset(
$vars['node'])) {
   
// If the node type is "blog" the template suggestion will be "page-blog.tpl.php".
   
$vars['template_files'][] = 'page-'str_replace('_''-'$vars['node']->type);
  }
}
?>

?

Что означают ($vars, $hook) в скобочках?

Аватар пользователя chelwolf chelwolf 16 октября 2013 в 20:09

Сейчас всё работает, но меня, тем не менее, смущает правильность кода) Сайт new.chgaki.ru - Челябинская государственная академия культуры и искусств, как вы, возможно, поняли по названию темы.

Аватар пользователя drupby drupby 16 октября 2013 в 20:14
"chelwolf" wrote:

Сейчас всё работает, но меня, тем не менее, смущает правильность кода)

все правильно все варианты шаблонов определяйте в chgakitheme_preprocess_page

Аватар пользователя chelwolf chelwolf 16 октября 2013 в 20:17
drupby wrote:
"chelwolf" wrote:

Сейчас всё работает, но меня, тем не менее, смущает правильность кода)

все правильно все варианты шаблонов определяйте в chgakitheme_preprocess_page

page-node-332.tpl.php - погорячился я, опять шаблон не хватается для отдельно взятой произвольной страницы - в чём может быть дело?

Кеш почистил)

Аватар пользователя chelwolf chelwolf 16 октября 2013 в 20:21

Вот что сейчас в темплейте:

<?php
function chgakitheme_preprocess_page(&$vars$hook) {
  if (
$vars['user']->uid == && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    
array_unshift($vars['template_files'], 'page-login');
    
$vars['body_classes'] .= ' userlogin';
  }
  if (isset(
$vars['node'])) {
   
$vars['template_files'][] = 'page-'str_replace('_''-'$vars['node']->type);
  }
}
function 
chgakitheme_preprocess_node(&$vars$hook) {
  
$node $vars['node'];
  
$vars['template_file'] = 'node-'$node->nid;
  
$vars['has_terms'] = count(taxonomy_node_get_terms($vars['node'])) > 0;
  
$vars['noder'] = theme('blocks''noder');
  
$vars['date_day'] = format_date($node->created'custom''j');
  
$vars['date_month'] = format_date($node->created'custom''m');
  
$vars['date_year'] = format_date($node->created'custom''Y');
}
?>
Аватар пользователя drupby drupby 16 октября 2013 в 21:00

ну как вариант

function chgakitheme_preprocess_page(&$vars, $hook) {
  if ($vars['user']->uid == 0 && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    array_unshift($vars['template_files'], 'page-login');
    $vars['body_classes'] .= ' userlogin';
  }
  if (isset($vars['node']) && $vars['node']->nid != 332) {
   $vars['template_files'][] = 'page-'. str_replace('_', '-', $vars['node']->type);
  }
}
function chgakitheme_preprocess_node(&$vars, $hook) {
  $node = $vars['node'];
  $vars['template_file'] = 'node-'. $node->nid;
  $vars['has_terms'] = count(taxonomy_node_get_terms($vars['node'])) > 0;
  $vars['noder'] = theme('blocks', 'noder');
  $vars['date_day'] = format_date($node->created, 'custom', 'j');
  $vars['date_month'] = format_date($node->created, 'custom', 'm');
  $vars['date_year'] = format_date($node->created, 'custom', 'Y');
}
Аватар пользователя chelwolf chelwolf 18 октября 2013 в 11:39
drupby wrote:

ну как вариант

function chgakitheme_preprocess_page(&$vars, $hook) {
  if ($vars['user']->uid == 0 && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    array_unshift($vars['template_files'], 'page-login');
    $vars['body_classes'] .= ' userlogin';
  }
  if (isset($vars['node']) && $vars['node']->nid != 332) {
   $vars['template_files'][] = 'page-'. str_replace('_', '-', $vars['node']->type);
  }
}
function chgakitheme_preprocess_node(&$vars, $hook) {
  $node = $vars['node'];
  $vars['template_file'] = 'node-'. $node->nid;
  $vars['has_terms'] = count(taxonomy_node_get_terms($vars['node'])) > 0;
  $vars['noder'] = theme('blocks', 'noder');
  $vars['date_day'] = format_date($node->created, 'custom', 'j');
  $vars['date_month'] = format_date($node->created, 'custom', 'm');
  $vars['date_year'] = format_date($node->created, 'custom', 'Y');
}

Спасибо! Ваш вариант заработал) Расскажите общественности в чём собака зарыта?) И я делаю тему как решенную)

Аватар пользователя chelwolf chelwolf 18 октября 2013 в 12:01
chelwolf wrote:
drupby wrote:

ну как вариант

function chgakitheme_preprocess_page(&$vars, $hook) {
  if ($vars['user']->uid == 0 && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    array_unshift($vars['template_files'], 'page-login');
    $vars['body_classes'] .= ' userlogin';
  }
  if (isset($vars['node']) && $vars['node']->nid != 332) {
   $vars['template_files'][] = 'page-'. str_replace('_', '-', $vars['node']->type);
  }
}
function chgakitheme_preprocess_node(&$vars, $hook) {
  $node = $vars['node'];
  $vars['template_file'] = 'node-'. $node->nid;
  $vars['has_terms'] = count(taxonomy_node_get_terms($vars['node'])) > 0;
  $vars['noder'] = theme('blocks', 'noder');
  $vars['date_day'] = format_date($node->created, 'custom', 'j');
  $vars['date_month'] = format_date($node->created, 'custom', 'm');
  $vars['date_year'] = format_date($node->created, 'custom', 'Y');
}

Спасибо! Ваш вариант заработал) Расскажите общественности в чём собака зарыта?) И я делаю тему как решенную)

Сейчас тока заметил что это только для ноды 332, на другие ноды шаблон не распространяется. В связи с этим более правильный вопрос: как сделать возможность переопределять страницы ноды по типам материалов, при это не сделав так, чтобы друпал перестал перехватывать шаблоны страниц для простых отдельно взятых нод?)

Аватар пользователя sg85 sg85 17 октября 2013 в 3:15

возможно ошибка в препроцессе ноды
$vars['template_file'] = 'node-'. $node->nid;
заменить на
$vars['template_files'][] = 'node-'. $node->nid;

template_files содержит в себе массив со списком вариантов шаблонов, а вот template_file, честно говоря, вижу впервые.

Аватар пользователя chelwolf chelwolf 18 октября 2013 в 11:39
sg85 wrote:

возможно ошибка в препроцессе ноды
$vars['template_file'] = 'node-'. $node->nid;
заменить на
$vars['template_files'][] = 'node-'. $node->nid;

template_files содержит в себе массив со списком вариантов шаблонов, а вот template_file, честно говоря, вижу впервые.

Спасибо, видимо это ошибка - код взят из совета в интернете. Поправил, но результата это не возымело) Для корректности кода оставил. Добавил исправления из варианта выше - заработало.

Аватар пользователя drupby drupby 18 октября 2013 в 12:12
"chelwolf" wrote:

Сейчас тока заметил что это только для ноды 332, на другие ноды шаблон не распространяется. В связи с этим более правильный вопрос: как сделать возможность переопределять страницы ноды по типам материалов, при это не сделав так, чтобы друпал перестал перехватывать шаблоны страниц для простых отдельно взятых нод?)

ну в семерке это легко сделать
$vars['theme_hook_suggestions'][] = 'page__'. $vars['node']->type . '__' . $vars['node']->nid;
а в шестерке вроде так не прокатит (правда давно с ней не работал -может кто поправит)
но мне кажется тут только добавлять в условие айдишники нод

Аватар пользователя chelwolf chelwolf 18 октября 2013 в 12:14
drupby wrote:
"chelwolf" wrote:

Сейчас тока заметил что это только для ноды 332, на другие ноды шаблон не распространяется. В связи с этим более правильный вопрос: как сделать возможность переопределять страницы ноды по типам материалов, при это не сделав так, чтобы друпал перестал перехватывать шаблоны страниц для простых отдельно взятых нод?)

ну в семерке это легко сделать
$vars['theme_hook_suggestions'][] = 'page__'. $vars['node']->type . '__' . $vars['node']->nid;
а в шестерке вроде так не прокатит (правда давно с ней не работал -может кто поправит)
но мне кажется тут только добавлять в условие айдишники нод

Жесть если это так) Вот это поворот))

Аватар пользователя drupby drupby 19 октября 2013 в 20:28
"drupby" wrote:

ну в семерке это легко сделать
$vars['theme_hook_suggestions'][] = 'page__'. $vars['node']->type . '__' . $vars['node']->nid;

в шестерке тоже можно так же прописать

function chgakitheme_preprocess_page(&$vars, $hook) {
  if ($vars['user']->uid == 0 && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    array_unshift($vars['template_files'], 'page-login');
    $vars['body_classes'] .= ' userlogin';
  }
  if ($vars['node']->type !== '') {
   
    $vars['template_files'][] = 'page-node-' . $vars['node']->type;

    $vars['template_files'][] = 'page-node-' . $vars['node']->type . '-' . $vars['node']->nid;
  }
}

и будет шаблон к примеру page-node-mytype-332.tpl.php переопределять page-node-mytype.tpl.php

Аватар пользователя chelwolf chelwolf 19 октября 2013 в 22:27
drupby wrote:
"drupby" wrote:

ну в семерке это легко сделать
$vars['theme_hook_suggestions'][] = 'page__'. $vars['node']->type . '__' . $vars['node']->nid;

в шестерке тоже можно так же прописать

function chgakitheme_preprocess_page(&$vars, $hook) {
  if ($vars['user']->uid == 0 && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    array_unshift($vars['template_files'], 'page-login');
    $vars['body_classes'] .= ' userlogin';
  }
  if ($vars['node']->type !== '') {
   
    $vars['template_files'][] = 'page-node-' . $vars['node']->type;

    $vars['template_files'][] = 'page-node-' . $vars['node']->type . '-' . $vars['node']->nid;
  }
}

и будет шаблон к примеру page-node-mytype-332.tpl.php переопределять page-node-mytype.tpl.php

Да спасибо! То, что нужно. К этому же варианту пришли на сайте вопросов для друплы: http://drupal.stackexchange.com/
Точно такой же вариант. СпасибО!

Аватар пользователя chelwolf chelwolf 19 октября 2013 в 22:29
drupby wrote:
"drupby" wrote:

ну в семерке это легко сделать
$vars['theme_hook_suggestions'][] = 'page__'. $vars['node']->type . '__' . $vars['node']->nid;

в шестерке тоже можно так же прописать

function chgakitheme_preprocess_page(&$vars, $hook) {
  if ($vars['user']->uid == 0 && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    array_unshift($vars['template_files'], 'page-login');
    $vars['body_classes'] .= ' userlogin';
  }
  if ($vars['node']->type !== '') {
   
    $vars['template_files'][] = 'page-node-' . $vars['node']->type;

    $vars['template_files'][] = 'page-node-' . $vars['node']->type . '-' . $vars['node']->nid;
  }
}

и будет шаблон к примеру page-node-mytype-332.tpl.php переопределять page-node-mytype.tpl.php

Ещё вот что важно - в темплейте я обращаюсь через function PHPTEMPLATE_preprocess_page, если название темы писать - не робит почему-то)

Аватар пользователя chelwolf chelwolf 19 октября 2013 в 22:39

В общем итоговый вариант у меня получился такой (рабочий):

<?php
function chgakitheme_preprocess_page(&$variables$hook) {
  if (
$vars['user']->uid == && arg(0) == 'user' && (arg(1) == '' || arg(1) == 'login')) {
    
array_unshift($vars['template_files'], 'page-login');
    
$vars['body_classes'] .= ' userlogin';
  }
    if (
$variables['node']->type !== '') {
    
$variables['template_files'][] = "page-node-" $variables['node']->type;
    
$variables['template_files'][] = "page-node-" $variables['node']->type "-" $variables['node']->nid;
  }
}
?>

Спасибо всем за участие, быть может корму-то поможет. Тема назывется chgakitheme (на свою можете менять).

Аватар пользователя sg85 sg85 20 октября 2013 в 1:50

$variables['template_files'][] = "page-node-" . $variables['node']->type . "-" . $variables['node']->nid;
в данном случае указывать тип материала не имеет смысла, я бы убрал, ибо nid у нод будет уникальным.