Добрый день всем. Вот уже третий день пытаюсь решить проблему - но так и не смог найти решения. Надеюсь на вашу помощь.
Что уже есть на сайте:
На сайте есть открытый раздел и закрытый раздел.
Открытый доступен для всех пользователей, закрытый только для авторизованых пользователей.
Закрытый раздел реализовано с помощью вставки в следующего кода:
<?php
global $user;
foreach($user->roles as $k => $v);
if($v=='anonymous user'){
header('Location: http://'.$_SERVER[HTTP_HOST].'/user'); /* Redirect browser */
exit;
}else{}
?>
Таким образом если пользователь не зарегестрирован - его перебрасывает на страницу регистрации
Что нужно сделать:
Если незарегестрированый пользователь пытается перейти на страницу к которой закрыт доступ ему предлагается пройти авторизацию, после авторизации он должен попадать на ту страницу которую хотел посетить.
Посоветуйте как реализовать данную возможность.
Решение
Свою задачу решил следующим образом:
1. В page.tpl.php в самом начале вставил:
<?php
session_start();
?>
Открыли сессию.
2. На страницах к которым не должен иметь доступа незалогиненный пользователь вставил следующий код:
<?php
$_SESSION['dop_pyt'] = $_SERVER['REQUEST_URI'];
global $user;
foreach($user->roles as $k => $v);
if(
$v=='anonymous user'){
header('Location: http://'.$_SERVER[HTTP_HOST].'/user'); /* Redirect browser */
exit;
}else{}
?>
Комментарии
trigger?
для редиректа лучше юзать drupal_goto(), узнать где был пользователь можно через referer_uri(), затем запихнуть это дело, скажем ему в куки или в сессию или куда хочется, правда все равно для такого способа trigger понадобится...(или что-то подобное), хотя можно, в зависимости от того, куда его до этого посылало
у меня такая идея есть:
вместо
<?php
global $user;
foreach($user->roles as $k => $v);
if($v=='anonymous user'){
header('Location: http://'.$_SERVER[HTTP_HOST].'/user'); /* Redirect browser */
exit;
}else{}
?>
написать такой код:
<?php
global $node;
foreach($node->path as $r => $s);
$path_page = $s
global $user;
foreach($user->roles as $k => $v);
if($v=='anonymous user'){
header('Location: http://'.$_SERVER[HTTP_HOST].'/user?'.$path_page); /* Redirect browser */
exit;
}else{}
?>
Так мы получим нужный нам адрес в глобальном массиве $_SERVER['QUERY_STRING']
Так незарегестрированый пользователь при попытке зайти на страницу node/5 попадет на страницу user?node/5
А здесь я планирую с помощью модуля login destination редиректить после авторизации на страницу node/5
По идее в login destination в поле Destination URL settings нужно прописать
<?php rerutn $_SERVER['QUERY_STRING']; ?>
Но почему-то переадресация идет на страницу пользователя.
В чем проблема подскажите.
1 разве переменные используемые внутри foreach видны за пределами самого цикла?(правда возможно, что я отстал от жизни)
2 для чего вы определяете глобальную переменную $node? она у вас определяется и задается где-то еще до срабатывания этого кода? если да, то способ все равно очень странный
3 вместо header('Location: http://'.$_SERVER[HTTP_HOST].'/user'); /* Redirect browser */ на 6х лучше писать drupal_goto("пофиг.какой.тип.адреса")
4 www.ccc.com/user?node/5 - весьма странный url, странность его в том, что "node/5" после "?" не будет иметь никакого смысла(хотя может я и тут отстал от жизни)
Свою задачу решил следующим образом:
1. В page.tpl.php в самом начале вставил:
<?php
session_start();
?>
Открыли сессию.
2. На страницах к которым не должен иметь доступа незалогиненный пользователь вставил следующий код:
<?php
$_SESSION['dop_pyt'] = $_SERVER['REQUEST_URI'];
global $user;
foreach($user->roles as $k => $v);
if(
$v=='anonymous user'){header('Location: http://'.$_SERVER[HTTP_HOST].'/user'); /* Redirect browser */
exit;
}else{}
?>
sg85 спасибо большое за замечания - когда появится больше времени, сделаю более правильным методом.
Login Redirect