Задача в следующем, как создать для разных ролей пользователей различные 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
Но как только не пробовал вставлять никак не работает, гуру, хэлп ми плиз!
Комментарии
Народ спасайте, я до сих пор гуглю в надежде хоть что то найти....
Как Вы предполагаете осуществить приоритет в выборе ролей пользователя для применения определенного шаблона?
Система ролей может быть практически плоской. Мало того, чаще всего, так и есть. Соответственно, очень просто просто построить правильно цепочку условий. Чтобы конкретной роли соответствовал свой шаблон...
Но даже если это не так, не сложно составить цепочку условий таким образом, чтобы нужный порядок соблюдался - надо просто составить табличку приоритетов и немного подумать.
Ну в примере выше реализовано добавление шаблона для анонимного пользователя, и судя по всему это должно работать.
Далее его можно дополнить необходимым количеством
<?php
elseif(user_has_role($roleid)) {
$vars['theme_hook_suggestions'][] = 'page__YOURFILE2';
}
?>
И добавить соответствующий шаблон, т.и.д.
Было бы неплохо привести пример Ваших "вставляний", дабы не угадывать поочередно предпринимали ли Вы уже действия.
Можно решить так:
В 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 - дописал выход из цикла.
Дописал выход из цикла.
Код, приведенный мною в шапке, не работает, если вы его проверили и он действительно работает то что я делаю не так? Мне необходимо для анонимных пользователей выводить другой page.tpl.php а для авторизованных и админа стандартный. Я прошу помощи с решением.
Пока гуглил нашел модуль Role Theme Switcher но почему то он не работает, нет страницы с его настройками.
Я вставлял код в конец и в начало tamplate.php без <?php...?>
Все эти условия нужно было в ТОП.
Если только для анонимов поменять, то можно свести код к следующему:
<?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).
Что такое препроцессор? :((( гуглю...
Функция предварительной обработки шаблона, в данном случае YOURTHEME_preprocess_page.
Может вам отправить мой tamplate.php чтобы понятнее было Вам?
Может Вам следует ознакомится хотя бы с основами программирования перед программированием?
Поставил код просто для анонимов, выдает ошибку, ругается на строку "function personal_blog_preprocess_page(&$vars) {" и на вот этот код в tamplate.php Тема соостветственно называется personal_blog
<?php
$vars['page']['show_skins_menu'] = $show_skins_menu = theme_get_setting('show_skins_menu');
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'];
}
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";
}
}
?>
Код из функции приведенный в качестве примера для добавления шаблона страницы анонимным пользователям поместите в начало/конец существующей функции. И внимательнее читайте приведенные советы, в частности:
Я уже попробовал так сделать, поместил в начало моей функции код "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 и страницы не открываютс(((
Не забывайте чистить кеш после подобных изменений. Ну и проверять под анонимным пользователем.
У вас уже есть функция YOURTHEME_preprocess_page - в вашем случае она называется personal_blog_preprocess_page в шаблоне.
Именно в неё надо вставить тот код, который вы в начале написали, начиная со второй строки кода сразу после "function personal_blog_preprocess_page(&$vars) {", и заменив, в нём "page__YOURFILE" на что-нибудь более понятное, например, "page__anonymous", как вам выше советовали, и назвав свой шаблон как page--anonymous.tpl.php.
Далее, положить этот шаблон там, где лежат все остальные шаблоны темы: это может быть как корень темы, так и какая-нибудь папка templates, например. Посмотрите, где находятся уже имеющиеся .tpl.php файлы.
Думаю, если не получится после такого объяснения, попросите лучше кого-нибудь сделать это за вас...
Огромное всем спасибо за помощь, и за терпение отдельное спасибо! Все получилось с тем кодом который я привел в шапке, ставлю решено!
Пожалуйста.
Да, именно такое условие надо было "if (empty($vars['user']->uid)) {".