viernes, 22 de julio de 2011

Manejo de una página web multilanguage con Sesiones en CodeIgniter

Para manejar una página multilanguage en codeigniter es bastante sensillo si sabemos un poco de sesiones en este framework.
Este ejemplo es para aquellos que quieren tener su página web en diferentes idiomas y no quieren que el idioma se muestre en la URL, para lo cual son indispensables las sesiones.
Primero creamos un archivo en el Core, el cual va a extender de CI_controller y así ahorrarnos varias lineas de código, ya que en este archivo estaremos haciendo el cambio de idioma.

<?php if (!defined('BASEPATH'))   exit('No direct script access allowed');

class BaseController extends CI_Controller
{
    public $data = array();

    function __construct() {
        $this->data["headline"] = "HeadLine del BaseController";
        parent::__construct();
        // aca establesemos la sesion de idioma, "lang".
        // notese que en este caso nuestro idioma por defecto será el español, porque la primera vez la sesion no está establecida
        // por lo cual se ejecuta el else.
        if ($this->session->userdata('lang') == 'en') {
            $this->config->set_item('language', 'english'); //esto cambia el archivo de configuracion config[language] = "english";
            $this->lang->load('datos', 'english'); //cargamos los archivos que agregamos a /system/language/english
        } else {
            $this->config->set_item('language', 'spanish'); //esto cambia el archivo de configuracion config[language] = "spanish";
            $this->lang->load('datos', 'spanish'); //cargamos los archivos que agregamos a /system/language/spanish
        }
    }

    //la funcion current_page la utilizaremos para saber desde que página se hizo click para cambiar el idioma.
   //la sesion que utilizamos es "current_url" y debemos colocarla en la primera línea de cada función en nuestros controllers
    function current_page()
    {
            $this->session->set_userdata('current_url',  $this->uri->uri_string());
    }
}
?>

Creamos un controller en el cual tendremos las funciones de cambio de idioma, en este caso el nombre es Categoria.php

<?php if (!defined('BASEPATH'))   exit('No direct script access allowed');

class Categoria extends BaseController {

    function __construct() {
        parent::__construct();
    }

    public function espanol() {
        $this->session->set_userdata(array('language' => TRUE, 'lang' => 'es')); //establecemos la sesion lang en "es"
        $current_url = $this->session->userdata('current_url'); //la sesion establecida en BaseController
        //comprobamos que la sesion tenga la url desde donde se quiere cambiar al idioma español,
                if (isset($current_url) && $current_url != '') {
                    redirect($this->session->userdata('current_url')); //redireccionamos a la url desde donde se hizo el cambio de idioma
                }
                else
                    $this->index(); //cargamos la funcion index de este controller.
    }

    public function english() {
        $this->session->set_userdata(array('language' => TRUE, 'lang' => 'en')); //establecemos la sesion lang en "es"
        $current_url = $this->session->userdata('current_url');
                if (isset($current_url) && $current_url != '') {
                    redirect($this->session->userdata('current_url'));
                }
                else
                    $this->index();
    }

    public function index($someslug="") {
            $this->current_page(); //siempre colocamos esta función de BaseController en la primera línea de las funciones
            $this->data["title"] = "Inicio"; //titulo para la vista
            //hacemos unas querys o algo y luego cargamos la vista
            $this->data["main_content"] = "inicio/login";
            $this->load->view("template/layout", $this->data);
    }

Creamos una vista para login, en este caso es sólo parte del ejemplo, no le pusimos ningun tipo de utilidad.

<div>
<fieldset>
<legend><?php echo $this->lang->line('titulo_form_post'); ?></legend>

<?php echo form_open('categoria/index');?>
<div>
<label><?php echo $this->lang->line('Nombre_de_Usuario'); ?></label>
<input name="user" size="30" type="text" value="<?php echo set_value('user'); ?>" />
<div class="error"><?php echo form_error('user');?></div>

<label><?php echo $this->lang->line('Password'); ?></label>
<input name="password" size="30" type="password" value="<?php echo set_value('password'); ?>" />
<div class="error"><?php echo form_error('password');?></div>

<div><input class="input-submit" type="submit" value="Submit" /></div></fieldset>
</div>
<?php echo form_close();?>

</fieldset>
</div>

También tenemos el layout que es parte de nuestra forma de trabajar con plantillas, en esta vista le ponemos los links a las funciones de cambio de idioma, estos links deben de ser mostrados en todas las pantallas de nuestra web, es recomendable colocarlas en el header.

<?php
     $this->load->view('template/header');

     <div id="language">
        <?php
                echo anchor('categoria/espanol', 'Ver la Página en Español');
        ?>
        </br>
        <?php
                echo anchor('categoria/english', 'Display current page in English');
        ?>
     </div>

     $this->load->view($main_content);
     $this->load->view('template/footer');

?>

Bueno eso es todo lo que puedo mostrarles sobre una página multilanguage, espero que todo haya quedado claro, y si tienen alguna duda, o algun error en el código que publiqué, sientanse libres de preguntar.

No hay comentarios:

Publicar un comentario