CakePHP сессии - PullRequest
       14

CakePHP сессии

0 голосов
/ 28 апреля 2011

Я новичок в Cakephp, и у меня большая проблема с сессиями ...

Что именно происходит

Я начинаю инициализировать сеанс с помощью ajax, вызывающего php-файл (контроллер)
это URL из ajax-> url: http: //domain.com/things/view/0

Я попытался также без ajax, вызвав этот URL: http: //domain.com/things/view/1

В обоих случаях сессия инициализируется. Ниже приведен контроллер, который я использую для инициализации сеанса

class ThingsController extends AppController {
    var $name = 'Things';
    var $components = array('Session');
    var $helpers = array('Html', 'Javascript', 'Ajax');
    var $uses = null;

    function index() {

        // preload dynamic data
        $this->set('data1', 'content will update here');
        $this->set('data2', 'here too');

        $this->render('neat');

    }

    function view($id, $idd) {

        if ($idd == 0) {
            $this->Session->write('language', 'ro');
        } else {
            $this->Session->write('language', 'en');
        }

        if (is_numeric($id)) {
            if ($id == 0) {
                $this->Session->write('language', 'ro');
            } else {
                $this->Session->write('language', 'en');
            }
        }


        $this->render('neat');
    } //view()
} //ThingsController

Как видите if SESSION['language'] == 0 is ro else is en

Используется правило рутера:

Router::connect('/things/:id/*', array('controller' => 'things', 'action' => 'view', 
'things'), array('pass' => 'id'));

Но работает и без этого правила:)

Теперь на странице о работе сессии: http: //domain.com/despre-noi

Я использовал этот рутер:

Router::connect('/despre-noi/*', array('controller' => 'about', 'action' => 'display', 'about'));

А этот контроллер

function display() {
    if (isset($_SESSION["language"])) {
        $language = $_SESSION["language"];
        $this->Session->write('language', $_SESSION["language"]);
    } else {
        $this->Session->write('language', 'ro');
        $language = "ro";
    }
    include('views/pages/'.$language.'.ctp');

    $this->layout = 'default';

    $this->About->id = 1;
    $this->set('post1', $this - > About - > read());

}

Но на странице партнеров: http: //domain.com/parteneri

Где я использовал этот рутер:

Router::connect('/parteneri/*', array('controller' => 'partner', 'action' => 'display', 'partner'));

и следующий контроллер:

function display() {

    if (isset($_SESSION["language"])) {
        $language = $_SESSION["language"];
        $this->Session->write('language', $_SESSION["language"]);
    } else {
        $this->Session->write('language', 'ro');
        $language = "ro";
    }
    include('views/pages/'.$language.'.ctp');

    $this->layout = 'default';

    $this->set('posts', $this - > Partner - > find('all'));

}

это не работает ..

Эти 2 страницы очень похожи с той разницей, что на странице партнера я использовал $this->set('posts', $this->Partner->find('all'));, а затем с помощью foreach() я перечисляю элементы и на странице о том, что я читаю строку

$this->About->id = 1;
$this->set('post1', $this->About->read());

Может быть, в этом проблема ... две функции read () против find () .. или это просто совпадение?

Заранее спасибо

1 Ответ

2 голосов
/ 28 апреля 2011

Сначала убедитесь, что у вас есть:

Configure::write('Session.save', 'php');

в вашем app/config/core.php файле. В главе Sessions книги CakePHP приведены некоторые хорошие примеры настройки и использования компонента Session.

Кроме того, если вы собираетесь использовать сеансы (то есть компонент Session), лучше поставить:

var $components = array('Session');

В вашем AppController. Таким образом, каждый контроллер будет иметь этот компонент доступным.

Секунда , если вы используете класс сеанса CakePHP для записи данных сеанса, то вам не следует обращаться к этим данным напрямую (то есть, вызывая $_SESSION['language']). Это плохая практика, поскольку, если вы когда-нибудь решите использовать 'database' в качестве хранилища сеанса или если CakePHP решит, что данные сеанса должны быть зашифрованы, тогда ваш код сломается, и вы не поймете, почему.

Короче, пожалуйста, используйте $this->Session->read('language') в своем коде (а также взгляните на вышеупомянутую главу сессий , она также дает хороший фон.

Кроме того, поскольку вы хотите добиться интернационализации, после исправления ваших контроллеров в соответствии со вставками в моих комментариях вы должны полностью взглянуть на простой способ локализации, прочитав раздел CakePHP Internationalization * 1034. *. Есть способ сделать вещи проще и отделить логику презентации от содержание презентации в ваших взглядах - но это материал для другого вопроса;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...