Touranchoks
@Touranchoks
Жизненное кредо – всегда!

Как разрешить/запретить переход по ссылке с определенной страницы?

Привет друзья!

Задача: Надо разрешить посещать целевую страницу А только по клику на ссылки находящейся на конкретной странице В. То есть, чтобы по прямой ссылке в строке браузера, ссылке размещенной за приделами конкретной страницы В – перейти на страницу А было нельзя, а делать к примеру редирект назад или на главную страницу или еще что то – к примеру свой action подключать.

Мысли как это реализовать есть, но хотелось бы правильный способ увидеть. Друзья, как это запилить?
  • Вопрос задан
  • 1950 просмотров
Пригласить эксперта
Ответы на вопрос 4
По клику на ссылке, пишите в сессию isLisnkClicked = 1.
Затем при попытке доступа на на страницу А проверяете этот флаг в сессии.
Если же много таких ссылок от которых зависит показ какой то страницы -- заведите в базе таблички:

page
| id | name |
/* 
тут храняться как страницы, те от которых зависит показ какой то страницы, 
так и зависимые страницы. name это /module/controller/action 
*/

dependent_page
| id | pageId | dependentPageId |

user_available_pages
| id | userId | dependentPageId | isVisited |

По таблице user_available_pages проверяете доступна ли эта страница пользователю.

Так же можете делать проверку по cookie.
Ответ написан
Комментировать
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Проверяйте, с какой страницы пришли и если совпадает, то делайте редирект куда Вам надо.
Делать можно в beforeAction такую проверку.
Ответ написан
@zhainar
Гуглю за вас
При заходе на страницу В писать в куки или сессию переменную, при переходе на страницу А проверять наличие этой переменной.
Ответ написан
Комментировать
Touranchoks
@Touranchoks Автор вопроса
Жизненное кредо – всегда!
Друзья, и так:

Параллельно запостил тут yiiframework.ru/forum

Две недели прошло, и тут и там однозначного мнения как реализовать этот функционал нет. Я решил вопрос так:

<?php
    
namespace app\controllers;

use Yii;
use yii\web\Controller;

class MainController extends Controller
{
    public function init()
    {
        parent::init();
        
        $this->__TOKEN();
    }

    public function mainToken( $token = null )
    {
        $session = $this->openSession();

        if ( isset($token) )
        {
            $_SESSION['__TOKEN'][0] = $token;
            $_SESSION['__TOKEN'][1] = 0;
        }
        
        return $_SESSION['__TOKEN'][0];
    }
    
    public function openSession()
    {
        $session = Yii::$app->session;
        if ( !$session->isActive ) $session->open();

        return $session;
    }    
    
    protected function __TOKEN()
    {
        $session = $this->openSession();

        isset ($_SESSION['__TOKEN'][1] ) ? $_SESSION['__TOKEN'][1]++ : $_SESSION['__TOKEN'][1] = 0;

        if ( $_SESSION['__TOKEN'][1] > 1 )
        {
            $_SESSION['__TOKEN'][0] = null;
            $_SESSION['__TOKEN'][1] = 0;
        }    
    }
}


$this->mainToken() - читаем токен;
$this->mainToken('string') - пишем токен;

Жизненный цикл mainToken - 1 запрос, независимо от того прочитали ли мы токен или нет – token почистится.

От MainController можно расширяться и строить дальнейшую логику приложения. Как то так...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы