[РЕШЕНО] Форма авторизации и перенаправление после входа на страницу.

Аватар пользователя ChudovskiyVladimir ChudovskiyVladimir 16 июня 2012 в 13:00

Добрый день всем. Вот уже третий день пытаюсь решить проблему - но так и не смог найти решения. Надеюсь на вашу помощь.

Что уже есть на сайте:
На сайте есть открытый раздел и закрытый раздел.
Открытый доступен для всех пользователей, закрытый только для авторизованых пользователей.
Закрытый раздел реализовано с помощью вставки в следующего кода:


<?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{} 
?>

Комментарии

Аватар пользователя sg85 sg85 16 июня 2012 в 14:18

для редиректа лучше юзать drupal_goto(), узнать где был пользователь можно через referer_uri(), затем запихнуть это дело, скажем ему в куки или в сессию или куда хочется, правда все равно для такого способа trigger понадобится...(или что-то подобное), хотя можно, в зависимости от того, куда его до этого посылало

Аватар пользователя ChudovskiyVladimir ChudovskiyVladimir 16 июня 2012 в 14:58

у меня такая идея есть:

вместо

<?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']; ?>

Но почему-то переадресация идет на страницу пользователя.
В чем проблема подскажите.

Аватар пользователя sg85 sg85 17 июня 2012 в 0:45

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" после "?" не будет иметь никакого смысла(хотя может я и тут отстал от жизни)

Аватар пользователя ChudovskiyVladimir ChudovskiyVladimir 17 июня 2012 в 7:26

Свою задачу решил следующим образом:
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 спасибо большое за замечания - когда появится больше времени, сделаю более правильным методом.