Избегайте перенаправления и персистентного сеанса - PullRequest
0 голосов
/ 10 декабря 2011

Я пытаюсь закончить этот веб-сайт на языке php cake, который ранее был в обычном php, но как новичок в мире cakephp .. Я обнаружил некоторые трудности, подобные этим.

1). Когда я нажимаю на кнопку «Войти», она переносит меня на другую страницу, хотя я не указал перенаправлений в контроллере приложения, за исключением случаев регистрации. Логин находится вверху и его можно просмотреть на всех страницах, но если я нажму на кнопку входа, он перенаправит меня на страницу входа (которую я не хочу).

2.) После того, как я войду в систему, она вызывает сеанс с именем пользователя, которое говорит "добро", но если я перехожу на другую страницу, кажется, что он забывает сеанс и возвращает входные данные для формы входа в верхняя часть страницы.

Вот мой код

app_controller

<?php
class AppController extends Controller {    

    var $helpers = array('Html', 'Form', 'Javascript', 'Session'); 
    var $components = array('Auth', 'Session');

    function beforeFilter() {
       $this->Auth->allow('add','get_categories','get_home', 'get_others', 'pages');
       $this->Auth->autoRedirect = false;

      } 
}
?>

UsersController

<?php
class UsersController extends AppController {

    var $uses = array("User");
    var $components = array('Auth', 'Session');


    function index()
    {
        $this->set('users', $this->User->find('all'));
         $this->layout = 'master_layout';
    }

      function add() { 

          if (!empty($this->data)) {
             //pass is hashed already
             //->data['User']['password'] = $this->Auth->password($this->data['User']['password']);
             if ($this->User->save($this->data)) {
                $this->Session->setFlash('Your were registered!.');
                               $this->redirect(array('action' => 'get_home'));
             }
          }

         $this->layout = 'master_layout';
      }

    //IF THE DATABASE IS SET UP CORRECTLY CAKE AUTHENTICATES AUTOMATICALLY NO
    //LOGIC IS NEEDED FOR LOGIN http://book.cakephp.org/view/1250/Authentication
    function login() {

        $this->layout = 'master_layout';

              if ($this->data) {

                    if ($this->Auth->login($this->data)) {

                    // Retrieve user data
         $results = $this->User->find(array('User.username' => $this->data['User']['username']), array('User.active'), null, false);

         $this->redirect(array('controller' => 'users', 'action' => 'login'));

                            }
                    }

        $this->data['User']['password'] = '';

    }

    function logout() {

    $this->redirect($this->Auth->logout());

    }

}
?>

элементы / loginform.ctp

<?php
 if ($this->Session->read('Auth.User.username')):?>
<?php
  echo "Welcome".' ' ;
echo $this->Session->read('Auth.User.username');
echo " ";
echo $html->link('logout', array('action'=>'logout'));
 ?>
<?php else : ?>
<div class="types form">
      <?php echo $form->create('User', array('controller' => 'Users','action' => 'login')); ?>
      <?php echo $form->input('username', array('label' => 'username'));    ?>
      <?php echo $form->input('password',array('type'=>'password', 'label' => 'password')) ?>
      <?php echo $form->submit('Submit'); ?>
       </div>
 <?php endif; ?> 

UPDATE

Я добавил следующее в app_controller

<?php
class AppController extends Controller {    

    var $helpers = array('Html', 'Form', 'Javascript', 'Session'); 
    var $components = array('Auth', 'Session');

    function beforeFilter() {
       //new addition
       $this->set('userData', $this->Session->read());
       $this->Auth->allow('add','get_categories','get_home', 'get_others', 'pages', '*');
       $this->Auth->autoRedirect = false;

      } 
}
?>

Когда я вхожу, я получаю этот массив

Array ( [Config] => Array 
            ( [userAgent] => 8f12200c2d48fa7955465842befe1c9e 
              [time] => 1323562284 [timeout] => 10 ) 
              [Auth] => Array ( 
                  [User] => Array ( 
                       [id] => 63 
                       [user_role] => 2 [
                       [user_fname] => test 
                       [user_lname] => test 
                       [user_email] => test@test.com 
                       [user_phone] => 677-988-7777 
                       [user_cellphone] => 555-456-9999 
                       [user_address1] => 1st Avenue 
                       [user_address2] => 
                       [user_city] => Citiland FL 
                       [user_zip] => 55555 
                       [username] => admin2 ) ) )

НО, КОГДА Я НАВИГАЦИЯ НА НОВУЮ СТРАНИЦУ

Array ( [Config] => Array ( 
    [userAgent] => 8f12200c2d48fa7955465842befe1c9e 
    [time] => 1323562591 [timeout] => 10 ) ) 

ДОБАВЛЕНО PRINT_R К элементам / форме входа, ЧТОБЫ УВИДЕТЬ ПЕРЕМЕННОЕ СОДЕРЖАНИЕ ПО ВСЕМ СТРАНИЦАМ

<?php
 print_r($userData);
 if ($this->Session->read('Auth.User.username')):?>
<?php
  echo "Welcome".' ' ;
echo $this->Session->read('Auth.User.username');
echo " ";
echo $html->link('logout', array('action'=>'logout'));
 ?>
<?php else : ?>
<div class="types form">
      <?php echo $form->create('User', array('controller' => 'Users','action' => 'login')); ?>
      <?php echo $form->input('username', array('label' => 'username'));    ?>
      <?php echo $form->input('password',array('type'=>'password', 'label' => 'password')) ?>
      <?php echo $form->submit('Submit'); ?>
       </div>
 <?php endif; ?> 

1 Ответ

0 голосов
/ 11 декабря 2011

1) Это потому, что в вашем UsersController у вас есть перенаправление после того, как пользователь вошел в систему. Вместо этого ваша функция входа в систему должна выглядеть так:

 function login() {

        $this->layout = 'master_layout';

              if ($this->data) {

                    if ($this->Auth->login($this->data)) {

                    // Retrieve user data
         $results = $this->User->find(array('User.username' => $this->data['User']['username']), array('User.active'), null, false);

/*This is the offending line, I've commented it out, but you could have it redirect somewhere else (it might be a good idea to redirect to the index action, for example, or just delete it:*/

         //$this->redirect(array('controller' => 'users', 'action' => 'login'));


                            }
                    }

        $this->data['User']['password'] = '';

    }

Что касается 2), я полагаю, что это может быть потому, что вы не устанавливаете данные впоследствии, так что, хотя они существуют в каталоге tmp на сервере (с использованием компонента Session), они фактически не передаются в представление , В общем, я думаю, это потому, что вы не можете вызывать методы Session в представлении. Даже если я не совсем прав в этом, то, что я предлагаю сделать, должно сработать: вместо вызова методов сеанса в представлении, вызовите их в контроллере, установите их в переменную для доступа к представлению, используя $this->set(); , а затем проверьте эту переменную в представлении.

Если вам нужно сделать это для множества представлений и действий, вы можете подумать о добавлении чего-то вроде этого в свой контроллер или даже в контроллер приложения:

function beforeFilter() {
// Get session data for appllication use
$this->appuserstuff = $this->Session->read();
} 

function beforeRender() {
// Make app variables available to view
$this->set('userData', $this->appuserstuff);
}

В качестве альтернативы, если вам просто нужно это в паре действий, вы можете просто установить пользовательские данные в этих действиях с помощью:

$this->set('userData', $this->Session->read());

Теперь я бы порекомендовал вам сделать <?php debug($userData); ?> в одном из ваших представлений, чтобы вы могли видеть, как данные структурированы в массиве, когда он задан, чтобы вы могли проверять или проверять условия. Наконец, вы можете заменить прямые вызовы Session в своем представлении взамен проверки массива данных:

Обратите внимание, что я не уверен, как устроен ваш конкретный массив, поэтому сделайте отладку, как рекомендовано выше, и вставьте свои собственные ключи, чтобы он работал:

<?php
 if (!empty($userData['User'])):?>
<?php
  echo "Welcome".' ' ;
echo $userData['User']['username'];
echo " ";
echo $html->link('logout', array('action'=>'logout'));
 ?>
<?php else : ?>
<div class="types form">
      <?php echo $form->create('User', array('controller' => 'Users','action' => 'login')); ?>
      <?php echo $form->input('username', array('label' => 'username'));    ?>
      <?php echo $form->input('password',array('type'=>'password', 'label' => 'password')) ?>
      <?php echo $form->submit('Submit'); ?>
       </div>
 <?php endif; ?> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...