Везде искал нет ничего! Как создать разные page.tpl.php для разных РОЛЕЙ.

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

Аватар пользователя ali-big ali-big 17 декабря 2016 в 18:24

Задача в следующем, как создать для разных ролей пользователей различные page.tpl.php
Возможно есть какое то условие для того чтобы в page.tpl.php показывать определенный фрагмент определенной роли пользователя. Или иное решение.
Перекуглил все что можно и как только можно, нашел вот это:
В template.php вставляем


<?php
function YOURTHEME_preprocess_page(&$vars) {
    if (empty(
$vars['user']->uid)) {
    
$vars['theme_hook_suggestions'][] = 'page__YOURFILE';
  }
}
?>

далее копируем файл page.tpl.php
Называем новый файл page--YOURFILE.tpl.php, редактируем его.
Чистим КЕШ.

Нашел вот здесь: http://www.drupal.ru/node/107819
Но как только не пробовал вставлять никак не работает, гуру, хэлп ми плиз!

Комментарии

Аватар пользователя bumble bumble 17 декабря 2016 в 19:00

Как Вы предполагаете осуществить приоритет в выборе ролей пользователя для применения определенного шаблона?

Аватар пользователя bsyomov bsyomov 17 декабря 2016 в 19:08

Система ролей может быть практически плоской. Мало того, чаще всего, так и есть. Соответственно, очень просто просто построить правильно цепочку условий. Чтобы конкретной роли соответствовал свой шаблон...
Но даже если это не так, не сложно составить цепочку условий таким образом, чтобы нужный порядок соблюдался - надо просто составить табличку приоритетов и немного подумать. Smile

Аватар пользователя bsyomov bsyomov 17 декабря 2016 в 19:00

Ну в примере выше реализовано добавление шаблона для анонимного пользователя, и судя по всему это должно работать.

Далее его можно дополнить необходимым количеством

<?php
elseif(user_has_role($roleid)) {
$vars['theme_hook_suggestions'][] = 'page__YOURFILE2';
}
?>

И добавить соответствующий шаблон, т.и.д.

Аватар пользователя bumble bumble 17 декабря 2016 в 19:34

ali-big wrote:

Но как только не пробовал вставлять никак не работает, гуру, хэлп ми плиз!

Было бы неплохо привести пример Ваших "вставляний", дабы не угадывать поочередно предпринимали ли Вы уже действия.

Можно решить так:

В template.php текущей темы, в препроцессоре:

<?php
function YOURTHEME_preprocess_page(&$vars) {
  if (!empty(
$vars['user']->roles)) {
    foreach (
$vars['user']->roles as $rid => $role) {
      switch (
$rid) {
        case 
0:
          
$vars['theme_hook_suggestions'][] = 'page__rid0';
          break 
2;
        case 
1:
          
$vars['theme_hook_suggestions'][] = 'page__rid1';
          break 
2;
        case 
2:
          
$vars['theme_hook_suggestions'][] = 'page__rid2';
          break 
2;
        default:
          
$vars['theme_hook_suggestions'][] = 'page__riddefault';
          break;
      }
    }
  }
}
?>

YOURTHEME - заменить на машинное имя текущей темы.

Шаблон для отдельных нод будет вида page--rid[ID_РОЛИ].tpl.php

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

UPD - case 0, case 1, case 2... - тут цифры означают ID роли, если-что.
UPD2 - дописал выход из цикла.

Аватар пользователя ali-big ali-big 17 декабря 2016 в 19:17

Код, приведенный мною в шапке, не работает, если вы его проверили и он действительно работает то что я делаю не так? Мне необходимо для анонимных пользователей выводить другой page.tpl.php а для авторизованных и админа стандартный. Я прошу помощи с решением.
Пока гуглил нашел модуль Role Theme Switcher но почему то он не работает, нет страницы с его настройками.
Я вставлял код в конец и в начало tamplate.php без <?php...?>

Аватар пользователя bumble bumble 17 декабря 2016 в 19:30

Все эти условия нужно было в ТОП.

Если только для анонимов поменять, то можно свести код к следующему:

<?php
function YOURTHEME_preprocess_page(&$vars) {
  if (isset(
$vars['user']->roles) && array_key_exists(1$vars['user']->roles)) {
    
$vars['theme_hook_suggestions'][] = 'page__anonymous';
  }
}
?>

Шаблон для анонимов будет вида page--anonymous.tpl.php

UPD - поправил условие (забыл что там assoc).

Аватар пользователя ali-big ali-big 17 декабря 2016 в 19:36

Поставил код просто для анонимов, выдает ошибку, ругается на строку "function personal_blog_preprocess_page(&$vars) {" и на вот этот код в tamplate.php Тема соостветственно называется personal_blog

<?php
function personal_blog_preprocess_page(&$vars) {
  global 
$theme_key;
  
$vars['regions_width'] = personal_blog_regions_width($vars['page']);
  
$panel_regions personal_blog_panel_regions();
  if (
count($panel_regions)) {
    foreach (
$panel_regions as $panel_name => $panels_list) {
      
$panel_markup theme("render_panel", array(
        
'page' => $vars['page'],
        
'panels_list' => $panels_list,
        
'regions_width' => $vars['regions_width'],
      ));
      
$panel_markup trim($panel_markup);
      
$vars[$panel_name] = empty($panel_markup) ? FALSE $panel_markup;
    }
  }
  
$current_skin theme_get_setting('skin');
  if (isset(
$_COOKIE['weebpal_skin'])) {
    
$current_skin $_COOKIE['weebpal_skin'];
  }

  

$vars['page']['show_skins_menu'] = $show_skins_menu theme_get_setting('show_skins_menu');
  if(
$show_skins_menu) {
    
$skins personal_blog_get_predefined_param('skins', array("default" => t("Default Style")));
    
$current_skin theme_get_setting('skin');
    if (isset(
$_COOKIE['weebpal_skin'])) {
      
$current_skin $_COOKIE['weebpal_skin'];
    }
    
$str = array();
    
$str[] = '<div id="change_skin_menu_wrapper" class="change-skin-menu-wrapper wrapper">';
    
$str[] = '<div class="container">';
    
$str[] = '<ul class="change-skin-menu">';
    
    foreach (
$skins as $skin => $skin_title) {
      
$li_class = ($skin == $current_skin ? ($skin ' active') : $skin);
      
$str[] = '<li class="' $li_class '"><a href="#change-skin/' $skin '" class="change-skin-button color-' $skin '">' $skin_title '</a></li>';
    }
    
$str[] = '</ul></div></div>';
    
$vars['page']['show_skins_menu'] = implode(""$str);
  }
  
drupal_add_js('
    (function ($) {
      Drupal.behaviors.skinMenuAction = {
        attach: function (context) {
          jQuery(".change-skin-button").click(function() {
            parts = this.href.split("/");
            style = parts[parts.length - 1];
            jQuery.cookie("weebpal_skin", style, {path: "' 
base_path() . '"});
            window.location.reload();
            return false;
          });
        }
      }
    })(jQuery);
  '
'inline');
  
$vars['page']['weebpal_skin_classes'] = !empty($current_skin) ? ($current_skin "-skin") : "";
  if (!empty(
$current_skin) && $current_skin != 'default' && theme_get_setting("default_logo") && theme_get_setting("toggle_logo")) {
    
$vars['logo'] = file_create_url(drupal_get_path('theme'$theme_key)) . "/css/colors/" $current_skin "/images/logo.png";
  }
}
?>
Аватар пользователя bumble bumble 17 декабря 2016 в 19:41

Код из функции приведенный в качестве примера для добавления шаблона страницы анонимным пользователям поместите в начало/конец существующей функции. И внимательнее читайте приведенные советы, в частности:

bumble wrote:

YOURTHEME - заменить на машинное имя текущей темы.

Аватар пользователя ali-big ali-big 17 декабря 2016 в 19:48

Я уже попробовал так сделать, поместил в начало моей функции код "function personal_blog_preprocess_page(&$vars) {
if (isset($vars['user']->roles) && array_key_exists(1, $vars['user']->roles)) {
$vars['theme_hook_suggestions'][] = 'page__anonymous';
}
}"

Создал копию page.tpl.php назвал ее page--anonymous.tpl.php и страницы не открываютс(((

Аватар пользователя bsyomov bsyomov 17 декабря 2016 в 19:47

У вас уже есть функция YOURTHEME_preprocess_page - в вашем случае она называется personal_blog_preprocess_page в шаблоне.
Именно в неё надо вставить тот код, который вы в начале написали, начиная со второй строки кода сразу после "function personal_blog_preprocess_page(&$vars) {", и заменив, в нём "page__YOURFILE" на что-нибудь более понятное, например, "page__anonymous", как вам выше советовали, и назвав свой шаблон как page--anonymous.tpl.php.
Далее, положить этот шаблон там, где лежат все остальные шаблоны темы: это может быть как корень темы, так и какая-нибудь папка templates, например. Посмотрите, где находятся уже имеющиеся .tpl.php файлы.

Думаю, если не получится после такого объяснения, попросите лучше кого-нибудь сделать это за вас...

Аватар пользователя ali-big ali-big 17 декабря 2016 в 19:52

Огромное всем спасибо за помощь, и за терпение отдельное спасибо! Все получилось с тем кодом который я привел в шапке, ставлю решено!