Home / Programmazione / PHP / Gestire i cookie con CodeIgniter
Mattepuffo

Gestire i cookie con CodeIgniter

Gestire i cookie con CodeIgniter

Oggi vediamo come gestire i cookie attraverso il framework CodeIngiter.

In generale abbiamo tre funzioni:

  • get_cookie
  • set_cookie
  • delete_cookie

Nel mio caso sto usando i cookie per salvare la lingua scelta (Italiano o Inglese).

Per la gestione del cookie ho creato un model apposito da richiamare dove mi serve.

Fate attenzione che la funzione set_cookie è leggermente diversa dalla funzione setcookie nativa di PHP.

Ad esempio i parametri path e dominio sono invertiti, e in CI mancano alcuni parametri.

Vediamo questa classe che fa da model:

<?php

class Lang_model extends CI_Model {

    public function getLang() {
        if (get_cookie('LANG') == 'eng') {
            $lang = array(
                'allUtente' => 'User'
            );
        } else {
            $lang = array(
                'allUtente' => 'Utente'
            );
        }
        return $lang;
    }

    public function setDefaultLang() { // SETTA IL COOKIE LA PRIMA VOLTA CHE SI ACCEDE SE NON ESISTE
        if (!get_cookie('LANG')) {
            set_cookie("LANG", 'ita', time() + 2592000, 'www.sito.it', '/');
        }
    }

    public function setLang($lng) {
        set_cookie("LANG", $lng, time() + 2592000, 'www.sito.it', '/');
    }

}

Ho tre funzioni.

Nella prima reperisco il valore del cookie, e in base a quello imposto le parole/frasi/quello che vi serve, in una o nell'altra lingua.

Nella seconda setto il cookie la prima volta che si arriva sul sito se questo non è già presente.

In questo modo imposto un valore di default.

L'ultima funzione la richiamo quando voglio cambiare lingua (nel caso specifico sui link con le classiche bandiere).

Vediamo come possono essere richiamate.

Ad esempio vediamo la pagina di login:

<?php

class Login extends CI_Controller {

    function __construct() {
        parent::__construct();
        $this->load->model('lang_model');
    }

    public function index() {
            $this->lang_model->setDefaultLang();
            $data = array();
            $data['titolo'] = 'Login';
            $data['lang'] = $this->lang_model->getLang();
            $this->load->view('header', $data);
            $this->load->view('login_view', $data);
            $this->load->view('footer');
    }

}

Nel controller ho levato le righe non necessarie allo scopo ovviamente.

Come vedete richiamo il model sopra; poi imposto il cookie di default con setDefaultLang; e sotto imposto una variabile $data['lang'] prendendo i valori dalla funzione getLang del model.

Poi nella view:

<div id="bandiere">
    <?php echo anchor('lang/lang/ita', '<img alt="ita" src="http://www.sito.it/images/ita.png">'); ?>
    <?php echo anchor('lang/lang/eng', '<img alt="eng" src="http://www.sito.it/images/eng.png">'); ?>
</div>
<div class="clear"></div>
<div id="login">
    <p class="error"><?php echo validation_errors(); ?></p>
    <?php echo form_open('login/dologin'); ?>
    <dl>
        <dt><label for="username"><?php echo $lang['allUtente']; ?>:</label></dt>
        <dd><input type="text" id="focus" name="username" value="" /></dd>
    </dl>
    <dl>
        <dt><label for="password">Password:</label></dt>
        <dd><input type="password" name="password" value="" /></dd>
    </dl>
    <dl>
        <dd><input type="submit" value="Login" name="submit" /></dd>
    </dl>
</form>
</div>

Un semplice form dove sopra ho le bandiere che ci serviranno per cambiare lingua, sotto il form.

Come vedete la parola Utente/User viene valorizzata tramite $lang['allUtente'], dove allUtente è impostato nel model.

Per quanto riguarda gli url delle bandiere richiamano un controller che ha la funzione di cambiare lingua e fare un redict:

<?php

class Lang extends CI_Controller {

    function __construct() {
        parent::__construct();
        $this->load->model('lang_model');
    }

    public function index() {
        $this->lang_model->setLang($this->uri->segment(3));
        redirect($_SERVER['HTTP_REFERER'], 'refresh');
    }

    public function _remap($URL_segment_2) {
        if (method_exists($this, $URL_segment_2)) {
            $metodo = $URL_segment_2;
            $paramentri = array_slice($this->uri->rsegment_array(), 2);

        } else {
            $metodo = 'index';
            $paramentri = array_slice($this->uri->rsegment_array(), 1);
        }
        call_user_func_array(array($this, $metodo), $paramentri);
    }

}

La funzione _remap serve per i segment; la sua funzione specifica esula dall'articolo, ma serve.

Come vedete nella funzione index prendo il segmento giusto e lo passo alla funzione che setta il cookie.

Se avete fatto tutto nella view di login comparirà Utente per la lingua italiana e User per quella inglese.