Introducción al patrón MVC con CodeIgniter

Selección_066

Sigue leyendo

Anuncios

Instalar Codeigniter 2.0.2 y ocultar index.php

Instalar Codeigniter 2.0.2

– Descargar .zip http://codeigniter.com/

– Descomprimir directorio en la raíz del servidor. Este contiene :

  • application
  • system
  • index.php

– En application/config/config.php editar:

$config['base_url'] = 'http://localhost/directorio_descomprimido/';

Si hemos descomprimido en la raíz los elementos application, system y index.php

$config['base_url'] = 'http://localhost/';

Quitar la propiedad index.php

$config['index_page'] = '';

Configurar el lenguaje para algunas librerias(opcional)

$config['language'] = 'spanish';

El paquete de idioma se descarga de aquí , después se descomprime el directorio spanish en system/language.

Se configura una clave de cifrado para las sesiones(opcional)

$config['encryption_key'] = '*******************************';

– En application/config/autoload.php editar:

$autoload['helper'] = array('url');

Para usar base de datos, editar también

$autoload['libraries'] = array('database');

– En application/config/database.php editar:

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'user';
$db['default']['password'] = '*****';
$db['default']['database'] = 'db_name';
$db['default']['dbdriver'] = 'mysql';

– Añadir un .htaccess al mismo nivel que los directorio que conforman el sistema Codeigniter:

  • application
  • system
  • .htaccess
  • index.php

– asegurarnos que nuestro servidor apache tiene el modulo mod_rewrite activado.

– en el .htaccess:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    #Elimina el acceso de hackers a la carpeta del sistema
    #Además esto le permitirá crear un controlador de System.php
    #"system" puede ser reemplazado si ha cambiado el nombre la carpeta del sistema.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /directorio_CI/index.php?/$1 [L]

    #Cuando la carpeta de la aplicación no está dentro de system
    #Esto impide el acceso de hacker a la carpeta de la aplicación
    #'application' cambiarlo si el nombre de la carpeta application es otro.
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /directorio_CI/index.php?/$1 [L]

    #Comprueba si el usuario está intentando acceder a un archivo válido,
    #como un documento de imagen o CSS, si esto no es cierto
    #se redirecciona a index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /directorio_CI/index.php?/$1 [L]
</IfModule>

#si no esta activo el modulo mod_rewrite de apache
#para un recurso no encontrado se lanza un error 404 cargando index.php
<IfModule !mod_rewrite.c>
    ErrorDocument 404 /directorio_CI/index.php
</IfModule>

Si no tenemos los archivos dentro de ningún directorio por ejemplo “directorio_CI” :

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
    ErrorDocument 404 /index.php
</IfModule>

Agregar soporte de CodeIgniter en IDE

Trabajando con un IDE y CodeIgniter uno se encuentra que no hay soporte de complementación de código total ya que el IDE no deduce qué funciones o variables se desprenden de cada objeto.

Por ejemplo, dos líneas básicas de CodeIgniter:

</pre>
$this->load->library(“upload”);

$this->upload->do_upload(“file”);

En la primera línea cargamos la librería Upload de CodeIgniter, la cual queda instanciada en la propiedad $this->upload del controlador. No hay manera de que el IDE pueda deducir esto, ya que $this->upload es una propiedad que no está declarada explícitamente en la clase, en cambio es creada dinámicamente en tiempo de ejecución. En consecuencia, ningún IDE tiene manera de deducir que $this->upload contiene el método do_upload() ni ningún otro.

Solución:

Crear una extensión de la clase CI_Controller de system/core y añadir unas declaraciones por cada clase del sistema y por cada clase propia.

<?php

if (!defined('BASEPATH'))
    exit('No deseo permitir acceso directo a este script');

/**
 * @property CI_Benchmark $benchmark
 * @property CI_Calendar $calendar
 * @property CI_Cart $cart
 * @property CI_Config $config
 * @property CI_Email $email
 * @property CI_Encrypt $encrypt
 * @property CI_Upload $upload
 * @property CI_Form_validation $form_validation
 * @property CI_FTP $ftp
 * @property CI_Table $table
 * @property CI_Image_lib $image_lib
 * @property CI_Input $input
 * @property CI_Jquery $jquery
 * @property CI_Loader $load
 * @property CI_Language $lang
 * @property CI_Output $output
 * @property CI_Pagination $pagination
 * @property CI_Security $security
 * @property CI_Session $session
 * @property CI_Trackback $trackback
 * @property CI_Parser $parser
 * @property CI_Typography $typography
 * @property CI_Unit_test $unit
 * @property CI_URI $uri
 * @property CI_User_agent $agent
 * @property CI_Xmlrpc $xmlrpc
 * @property CI_Zip $zip
 * @property CI_Xmlrpcs $xmlrpcs
 * @property CI_Log $log
 * @property CI_Cache $cache
 * @property CI_Profiler $profiler
 * @property CI_SHA1 $sha1
 *
 * @property CI_DB_active_rec $db
 * @property CI_DB_forge $dbforge
 *
 * @property MY_Appconfig $appconfig
 * @property MY_Messages $messages
 * @property MY_Template $template
 * @property MY_Utilities $utilities
 */
class MY_Controller extends CI_Controller {

    //constructor, debe llamar al constructor de la clase parent
    public function __construct() {
        parent::__construct();
        // Your own constructor code
    }

}

?>

*las ultimas son librerías propias (Appconfig, Messages, Template y Utilities son librerías que pertenecen a la aplicación y no al system).

Esta extensión de CI_Controller lo guardamos como MY_Controller.php en application/core  y en los controladores que se vayan creando usar esta extensión.

class Inicio extends MY_Controller {

    //constructor en PHP5
    function __construct() {
        parent::__construct();

        // cargo una libreria para comprobar el soporte
        $this->load->library('form_validation');
        $this->form_validation->set_rules($field);
    }.....

*Se ha usado la versión 2.0.2 de Codeigniter

Para más información sobre las clases del sistema, su listado y propiedades visitar la documentación en línea.

http://codeigniter.com/user_guide/toc.html