ВопросТемизация различных страниц

вот назрел такой вопрос. Есть Тип Материала "Теория", к этому типу подключен словарь таксономии "Категории" в котором есть термины типа "Электрика", "Сантехника", "Гипсокартон" и т.д., так вот как можно сделать темизацию страницы ноды принадлежащей определенному термину? Например нода с термином "Сантехника" будет открываться в одном шаблоне, нода с термином "Электрика" в другом.
Решение с копированием page.tpl.php и дальнейшем переименованием не подходит, ибо на один термин приходится от 180 статей, места на хосте не хватит, да и заказчику не объяснить что при создании статьи нужно скопировать и переименовать такой-то файлик...

Комментарии

Аватар пользователя Spleshka
Spleshka написал:

Я всё же предложу копировать page.tpl.php, но копировать не для каждой статьи (это было бы глупо), а для каждого термина - вы же хотите темизировать именно страницы нод, пренадлежащих определённому термину таксономии, поэтому по ним и надо разделять. Добавьте в template.php вашей темы такой код:

function имяТемы_preprocess_page(&$variables) {  
  if ($variables['node'] && $variables['node']->type) {
    //номер словаря, где термины Электрика, Сантехника и т.п.
    $vid = 1; 
    //загружаем термины из этого словаря для текущей ноды
    $taxonomy = taxonomy_node_get_terms_by_vocabulary($variables['node'], $vid); 
    if ($taxonomy) {
      foreach ($taxonomy as $term) {
        //делаем шаблон для ноды с выбранным термином таксономии
        $variables['template_files'][] = 'page-node-term-'. $term->tid;
      }
    }
  }
}

Теперь можно создавать шаблоны page-node-term-1.tpl.php, page-node-term-2.tpl.php и т.д. - последняя цифра, это ID термина из выбранного словаря. Далее уже в шаблоне можно добавлять, например, к тэгу <body> ID термина - и в зависимости от этого писать свои стили в css.

29.07.2011 20:19
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Ух ты, спасибо! Ломал голову сидел.

29.07.2011 21:03
Аватар пользователя Inglar
Inglar написал:

хм, интересная фишка, спасибо

29.07.2011 23:04
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Да, это круто, но а как совместить с таким функцией темизации по типу материала?

<strong>Взять это:</strong>
/**
 * implementation of template_preprocess_page()
 */
function ИМЯТЕМЫ_preprocess_page(&$variables) {
 
  if (isset($variables['node']) && $variables['node']->type) {
	$sug[] = 'page-node-type-'.$variables['node']->type;
	$variables['template_files'] = $sug;
  } 
}
<strong>И взять это:</strong>
function имяТемы_preprocess_page(&$variables) {  
  if ($variables['node'] && $variables['node']->type) {
    //номер словаря, где термины Электрика, Сантехника и т.п.
    $vid = 1; 
    //загружаем термины из этого словаря для текущей ноды
    $taxonomy = taxonomy_node_get_terms_by_vocabulary($variables['node'], $vid); 
    if ($taxonomy) {
      foreach ($taxonomy as $term) {
        //делаем шаблон для ноды с выбранным термином таксономии
        $variables['template_files'][] = 'page-node-term-'. $term->tid;
      }
    }
  }
}

Сделать так, что бы и по терминам и по типам и вот так что бы можно было page-node-38.tpl

23.08.2011 00:21
Аватар пользователя Spleshka
Spleshka написал:

Просто сделать вот так:

function ИМЯТЕМЫ_preprocess_page(&$variables) { 
  if (isset($variables['node']) && $variables['node']->type) {
    //Для типа материала
    $variables['template_files'][] = 'page-node-type-'.$variables['node']->type;
    //Для терминов таксономии
    $vid = 1;     
    if ($taxonomy = taxonomy_node_get_terms_by_vocabulary($variables['node'], $vid);) {
      foreach ($taxonomy as $term) {
        //делаем шаблон для ноды с выбранным термином таксономии
        $variables['template_files'][] = 'page-node-term-'. $term->tid;
      }
    }
  } 
}
23.08.2011 14:04
Аватар пользователя zakraben
zakraben написал:

Но здесь же четкая привязка к определенному словарю. А если словарей 2,3 или даже больше? Как быть в этом случае?

19.09.2011 17:09
Аватар пользователя Spleshka
Spleshka написал:

Для определённых словарей:

function ИМЯТЕМЫ_preprocess_page(&$variables) { 
  if (isset($variables['node']) && $variables['node']->type) {
    //Для типа материала
    $variables['template_files'][] = 'page-node-type-'.$variables['node']->type;
    //Для терминов таксономии
    $vids = array(1, 2, 10); // словари, для которых применять шаблон
    foreach ($vids as $vid) {
      if ($taxonomy = taxonomy_node_get_terms_by_vocabulary($variables['node'], $vid)) {
        foreach ($taxonomy as $term) {
          //делаем шаблон для ноды с выбранным термином таксономии
          $variables['template_files'][] = 'page-node-term-'. $term->tid;
        }
      }
    }
  } 
}
19.09.2011 17:21
Аватар пользователя zakraben
zakraben написал:

Спасибо! Теперь функция написана практически для ЛЮБЫХ ТИПОВ НОД! :)

19.09.2011 18:06
Аватар пользователя zakraben
zakraben написал:

Не, не пашет. Странно...

19.09.2011 19:51
Аватар пользователя Spleshka
Spleshka написал:

Кэш чистил? Просто не работает, или ошибку выдаёт?

19.09.2011 20:15
Аватар пользователя zakraben
zakraben написал:

Всё почистил, просто белая страница, без ошибок.

19.09.2011 22:04
Аватар пользователя Spleshka
Spleshka написал:

Скопируй ещё раз тот код. Там была одна синтаксическая ошибка. И кстати, почитай про вывод ошибок php на экран. У тебя именно из-за этого ничего и не отображало.

20.09.2011 01:26
Аватар пользователя zakraben
zakraben написал:

Теперь все на месте! Спасибо! По поводу ошибок вывода там же если файлы в корне то при обновлении ядра нужно снова вносить. Через php.ini вариант хороший, попробую сделать.

20.09.2011 01:58
Аватар пользователя cybernatic
cybernatic написал:

Только хотел задать такой вопрос и тут поиск выдал ответ.
Спасибо огромное!

24.02.2012 13:17
Аватар пользователя xr0m3oz
xr0m3oz написал:

Говорит друпал что нету такой функции taxonomy_node_get_terms_by_vocabulary

решение нашел такое

function taxonomy_node_get_terms_by_vocabulary($node, $vid, $key = 'tid') {
  $result = db_query('SELECT t.tid, t.* FROM {taxonomy_term_data} t INNER JOIN {taxonomy_index} r ON r.tid = t.tid WHERE t.vid = :vid AND r.nid = :node_nid ORDER BY weight', array(':vid' => $vid, ':node_nid' => $node->nid));
  return $result->fetchAll();
}
06.12.2012 13:12
Аватар пользователя Boka
Boka написал:

Как это сделать на Drupal 7? У меня не работает((

02.08.2013 09:23
Аватар пользователя Rachinskiy
Rachinskiy написал:

Скажите пожалуйста, а как в drupal 6 сделать темизацию страниц в отдельных папках? что бы не в дериктории темы, а в теме создать допустим папку tpl и туда закидывать, пробовал так

$variables['template_files'][]='templates/page-node-test-4';

Но не работает, а без "templates" ясное дело что работает

21.08.2013 12:05
Аватар пользователя admin
admin написал:

эта функция уже не работает, обновите пожлуйста

01.04.2015 15:27
Аватар пользователя xandeadx
xandeadx написал:

spleshka, обнови пожалуйста, а то я тут сижу ломаю голову :(

01.04.2015 16:27

Комментировать