2013-01-04 54 views
7

後,我有一個問題就回到引用者頁面:如何回去的referer頁面CakePHP中登錄

first url: http://site.com/venue/apartments/1564/venue-name 
referer url: null 

在此頁面中我可以編輯裏面的東西,所以我有一個login按鈕轉到登錄頁面成功登錄後,我想回到first url

second url: http://site.com/users/login 
referer url: http://site.com/venue/apartments/1564/venue-name 

,當我嘗試登錄,由於CakePHP的行動規則,我必須刷新登錄頁面,檢查憑據時,problem從這裏開始:通過刷新頁面

third url: http://site.com/users/login 
referer url: http://site.com/users/login 

,並檢查login行動users控制器中的憑據我得到作爲參考我在之前的同一頁,現在我不能回到first url

AppController.php 

public function beforeFilter() { 
    $this->setRedirect(); 
} 

public function setRedirect() { 
    if ($this->request->params['controller'] != 'users' && $this->request->params['action'] != 'login') { 
     $this->Session->write('redir', array('controller'=>$this->request->params['controller'], 'action'=>$this->request->params['action'], implode($this->request->params['pass'], '/'))); 
    } 
} 

通過與debug($this->Session->write('redir'));一切似乎測試會議無功:

我通過設置AppController的,如果我在login操作頁面又不是它檢查會話變量,這樣嘗試了一些解決方案完美的作品,直到我去login行動:

UsersController.php 

public function login() { 
    if ($this->request->is ('post')){ 
     if ($this->Auth->login()) { 
      $redir = $this->Session->read('redir'); 
      if (!empty($redir)) { 
       $this->redirect ($redir); 
      } else { 
       $this->redirect ($this->Auth->redirect()); 
      } 
     } 
    } 
} 

這樣做破壞應用程序,如果我debug($redir);變種我得到:

array(
    'controller' => 'js', 
    'action' => 'jquery', 
    (int) 0 => 'plugin/jquery.validata.1.7.min' // just a jquery plugin loaded in default.ctp 
) 

代替

array(
    'controller' => 'venue', 
    'action' => 'apartments', 
    (int) 0 => '1564/venue-name' 
) 

如果我debug($redir);在整個網站中的任何其它視圖,一切正常,我也得到正確的數據。

我認爲在$this->Auth->login()行動的某種會話保護例程中,但對我來說這完全是無稽之談。

我該如何重定向登錄到不是login視圖頁的最後一頁?

+0

所以,你想要做的是將用戶重定向到登錄表單,當他們試圖訪問需要身份驗證的頁面,然後在auth成功時將它們重定向到該頁面? –

+0

是的,我沒有找到正確的方法來做到這一點。 – vitto

+0

我猜你知道'Auth'組件具有內置的這個功能。只要執行'$ this-> redirect($ this-> Auth-> redirect());'if($ this-> Auth-> login()){'block。你有沒有這樣做的原因? – Nick

回答

15

你試過這個:$this->redirect(Controller::referer());

我不得不重讀你的整個問題,可以肯定的,但是這也應該工作:$this->redirect($this->referer());

11

我使用的會話保持最後訪問的URL,如果登錄成功的用戶會被重定向到它。

首先在AppController.php我在會議上保存的URL,除了登錄和註銷行爲:

public function beforeFilter() { 
    $url = Router::url(NULL, true); //complete url 
    if (!preg_match('/login|logout/i', $url)){ 
     $this->Session->write('lastUrl', $url); 
    } 
} 

在UserController的。PHP的登錄操作,我有以下代碼:

public function login() { 
    if ($this->request->is('post')) { 
     if ($this->Auth->login()) { 
      if ($this->Session->read('lastUrl')){ 
       $this->redirect($this->Session->read('lastUrl')); 
       exit; 
      }else{ 
       return $this->redirect($this->Auth->redirect()); 
      } 
     } 
     $this->Session->setFlash(__('Invalid username or password')); 
    } 
} 
0

我這樣做只是這樣的:

public function login() { 
    if ($this->request->is('post')) { 
     if ($this->Auth->login()) { 
      $this->redirect($this->Session->read('referer')); 
     } else { 
      $this->Session->setFlash(__('Não foi possível efetuar o login. Usuário ou senha inválidos'), 'default', array('class' => 'alert alert-danger')); 
     } 
    } else { 
     $this->Session->write('referer', $this->referer()); 
    } 
} 
相關問題