Framework: Codeigniter 3#

Logo Codeigniter

Documentación básica para trabajar con Codeigniter 3

Configuraciones#

Creación del proyecto#

  • Descargar Codeigniter 3: https://www.codeigniter.com/download

  • Probar que está funcionando en la misma raiz desde consola: php -S localhost:8000

Atención

Este manual es para la versión 3, la versión 4 tiene cambios en su estructura entre otros.

Atención

La versión 3 de Codeigniter funciona mínimo bajo la versión de PHP 5.6 mientras que la 4 como mínimo la 7.1

Estructura de Codeigniter 3#

En la estructura de un proyecto Codeigniter 3 estas son las partes más importantes:

  • application: directorio donde se encuentra la aplicación. Dentro de ella se encuentran las siguientes carpetas:
    • config: carpeta de configuración con diversos archivos los cuales se destacan config.php, constants.php, database.php y routes.php.

    • controllers: carpeta donde se irán añadiendo los controladores del proyecto.

    • models: carpeta donde se crearán los modelos de datos (en el caso de codeigniter 3 serán queries).

    • views: carpeta donde se crearán las vistas del proyecto.

  • index.php: archivo principal del proyecto, es desde donde se ejecuta la aplicación en el servidor.

Rutas en Codeigniter 3#

Las rutas en codeigniter se irán creando automáticamente a medida que vayamos añadiendo controladores y métodos siguiendo esta estructura:

Vistas en CodeIgniter 3#

Para crear una vista en Codeigniter 3 vamos a application/views y creamos un archivo por ejemplo consolas_list.php:

 1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7    <title>Listado de consolas</title>
 8</head>
 9<body>
10    <h1>Listado de consolas</h1>
11
12    <ul>
13        <li>Sony PlayStation</li>
14        <li>Sega Megadrive</li>
15        <li>Nintendo DS</li>
16    </ul>
17</body>
18</html>

Para cargar la vista en el controlador hacemos lo siguiente en Consolas.php:

 1<?php
 2defined('BASEPATH') OR exit('No direct script access allowed');
 3
 4class Consolas extends CI_Controller{
 5    public function index(){
 6        // cargar vista html:
 7        $this->load->view('consolas_list');
 8    }
 9}
10
11/* Fin del archivo Consolas.php */

Uso de variables#

Las variables se pueden cargar desde el controlador del siguiente modo (Consolas.php):

 1<?php
 2defined('BASEPATH') OR exit('No direct script access allowed');
 3
 4class Consolas extends CI_Controller{
 5    public function index(){
 6        // creamos una variable data con la información de una consola:
 7        $data['consola'] = 'Sony Playstation';
 8        // se la pasamos a la vista:
 9        $this->load->view('consolas_list', $data);
10    }
11}
12
13/* Fin del archivo Consolas.php */

En la vista la mostramos del siguiente modo (consolas_list.php):

 1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7    <title>Listado de consolas</title>
 8</head>
 9<body>
10    <h1>Listado de consolas</h1>
11    <!-- El contenido de la variable data se pasa como si fueran variables sueltas: -->
12    <p><?php echo $consola ?></p>
13</body>
14</html>

Controladores en CodeIgntier 3#

  • Para crear un controlador accedemos a la carpeta application y dentro a la carpeta controllers, ahí creamos un controlador al que llamamos por ejemplo Consolas.php:

 1<?php
 2// copiamos este código de welcome.php para evitar accesos no autorizados:
 3defined('BASEPATH') OR exit('No direct script access allowed');
 4// creamos la clase que estiende de CI_Controller:
 5class Consolas extends CI_Controller{
 6    // creamos la función para controlar la primera vista index:
 7    public function index(){
 8        echo "Página de consolas";
 9    }
10}
11
12// en lugar de cerrar el código php comentamos el final del archivo:
13/* Fin del archivo Consolas.php */

Importante

Asegúrate siempre de que el nombre del archivo y la clase sean exactamente el mismo o las rutas podrían no funcionar.

Manejar parámetros en el controlador#

  • Para añadir parámetros al controlador basta con pasarle los parámetros al método que se vaya a ejecutar:

 1<?php
 2defined('BASEPATH') OR exit('No direct script access allowed');
 3
 4class Consolas extends CI_Controller{
 5
 6    // parámetros get por el método:
 7    public function index($consola = null){
 8        echo $consola;
 9    }
10}
11
12/* Fin del archivo Consolas.php */

Redirección a otra ruta#

  • Para cargar el redireccionador lo recomendado es importar en el constructor el helper url:

 1<?php
 2defined('BASEPATH') OR exit('No direct script access allowed');
 3
 4class Consolas extends CI_Controller{
 5    // cargar el constructor:
 6    function __construct(){
 7        parent::__construct();
 8        // se carga el helper url:
 9        $this->load->helper('url');
10    }
11
12    public function index($consola = null){
13        echo "Estás en el índice";
14    }
15
16    // creamos un método que nos redirija al indice:
17    public function redirigir(){
18        // ejecutamos la función redirect y le decimos a que metodo tiene que viajar:
19        redirect('/consolas/index/', 'refresh');
20    }
21}
22
23/* Fin del archivo Consolas.php */
  • Si ejecutamos localhost:8000/consolas/redirigir nos llevará al index de consolas via redireccionamiento.

Nota

Si queremos viajar al index de un controlador basta con escribir el nombre del mismo: ``redirect(“consolas”)``que en el caso expuesto sería lo mas adecuado.

Formularios#

Crear un formulario con Codeigniter 3#

  • Desde el controlador llamar al helper form (consolas.php):

 1class Consolas extends CI_Controller{
 2
 3    function __construct(){
 4        parent::__construct();
 5        $this->load->model('Consolas_model');
 6
 7        // utilizamos el helper form:
 8        $this->load->helper('form');
 9    }
10    public function index(){
11
12        $consolas_list = $this->Consolas_model->get_all();
13
14        if(empty($consolas_list)){
15            $data['consolas_list'] = "No existen consolas";
16        }
17
18        $data['consolas_list'] = $consolas_list;
19
20        $this->load->view('consolas_list', $data);
21    }
22
23    // crear un controlador para el create:
24    public function add(){
25        // recibir información por POST:
26        if($this->input->post()){
27            $data['new_console'] = $this->input->post();
28        }else{
29            $data['new_console'] = "pendiente de resultados";
30        }
31        // cargamos la vista:
32        $this->load->view('add_consola', $data);
33
34    }
35}
  • en una nueva vista a la que llamamos add_consola.php le cargamos el formulario:

 1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7    <title>Añadir consola</title>
 8</head>
 9<body>
10<h1>Añadir consola</h1>
11<hr/>
12<br/>
13
14<!-- creamos una variable para construir la estructura de cada campo: -->
15<?php
16    $input_marca = array(
17        'name' => 'marca',
18        'id' => 'marca',
19        'class' => 'input_marca'
20    );
21    $input_modelo = array(
22        'name' => 'modelo',
23        'id' => 'modelo',
24        'class' => 'input_modelo'
25    );
26    // en caso de ser un desplegable tendremos dos arrays:
27    $input_en_coleccion = array(
28        'name' => 'en_coleccion',
29        'id' => 'en_coleccion',
30        'class' => 'input_en_coleccion'
31    );
32    $en_coleccion = array(
33        '0' => 'No',
34        '1' => 'Si'
35    );
36?>
37
38<!-- Al construir el formulario con el helper el action se construye a partir de la ruta del controlador -->
39<?php
40    echo form_open('');
41
42    echo form_label('Marca', 'marca');
43    echo form_input($input_marca);
44    echo "<br/><br/>";
45    echo form_label('Modelo', 'modelo');
46    echo form_input($input_modelo);
47    echo "<br/><br/>";
48    echo form_label('En posesión', 'en_posesion');
49    echo form_dropdown($input_en_coleccion,$en_coleccion);
50    echo "<br/><br/>";
51    echo form_submit('btn_consola', 'añadir consola');
52    echo form_close();
53?>
54
55<hr />
56<!-- aquí mostramos el resultado: -->
57<pre><?php echo var_dump($new_console); ?></pre>
58</body>
59</html>

Nota

Si estamos usando un puerto de salida distinto al 80 deberemos modificar el parámetro base_url en la ruta config/config.php, modificamos el valor del array con un valor por ejemplo: $config['base_url'] = 'http://localhost:8000';

Bases de datos#

Crear base de datos#

  • Instala MariaDB si estas usando linux o busca y servidor Wamp o xamp que soporte Mysql 5, con la versión de Mysql 8 tendrás problemas.

  • Ejecutamos en el terminal sudo mysql y creamos una base de datos llamada curso_codeigniter:

CREATE DATABASE curso_codeigniter;
  • Creamos un nuevo usuario:

1CREATE USER 'guillermo'@'localhost' IDENTIFIED BY '1234';
  • Le otorgamos privilegios en la base de datos nueva:

1GRANT ALL PRIVILEGES ON curso_codeigniter.* TO 'guillermo'@'localhost';
  • Desplegar los privilegios para que se puedan usar ya:

1FLUSH PRIVILEGES;
  • Seleccionamos la base de datos:

1USE curso_codeigniter;
  • creamos la tabla consolas:

1CREATE TABLE consolas (
2    id INT auto_increment NOT NULL,
3    marca varchar(100) NULL,
4    modelo varchar(100) NULL,
5    PRIMARY KEY(id)
6)
7ENGINE=InnoDB;
  • Creamos unos registros para tener datos que listar a continuación:

1INSERT INTO consolas VALUES
2    (NULL, "sony", "playstation"),
3    (NULL, "nintendo", "switch"),
4    (NULL, "sega", "mega drive"),
5    (NULL, "microsoft", "xbox");

Con esto ya tenemos todo lo necesario para trabajar.

Conectar a la base de datos#

  • En el proyecto nos vamos a application/config/database.php y al final editamos el array $db[“default”]:

 1$db['default'] = array(
 2    'dsn'   => '',
 3    'hostname' => 'localhost', // localhost el servidor
 4    'username' => 'guillermo', // este es el usuario para conectar
 5    'password' => '1234', // la contraseña en blanco si no definimos una
 6    'database' => 'curso_codeigniter', // el nombre de la base de datos
 7    'dbdriver' => 'mysqli',
 8    'dbprefix' => '',
 9    'pconnect' => FALSE,
10    'db_debug' => (ENVIRONMENT !== 'production'),
11    'cache_on' => FALSE,
12    'cachedir' => '',
13    'char_set' => 'utf8',
14    'dbcollat' => 'utf8_general_ci',
15    'swap_pre' => '',
16    'encrypt' => FALSE,
17    'compress' => FALSE,
18    'stricton' => FALSE,
19    'failover' => array(),
20    'save_queries' => TRUE
21);

Crear modelo de datos y READ#

Para crear un modelo de datos nos vamos a application/models y creamos un archivo por ejemplo Consolas_model.php:

 1<?php
 2// creamos una clase para el modelo:
 3class Consolas_model extends CI_Model {
 4    // preparamos el constructor:
 5    function __construct(){
 6        parent::__construct();
 7        // cargamos la base de datos:
 8        $this->load->database();
 9    }
10
11    // creamos una función para traer del modelo todos los registros:
12    public function get_all(){
13        // recuperar datos de la tabla:
14        $query = $this->db->get('consolas');
15        // devolvemos la información:
16        return $query->result();
17    }
18}
19
20/* Fin del archivo Consolas_model.php */
  • En el controlador realizamos la consulta Consolas.php:

 1<?php
 2defined('BASEPATH') OR exit('No direct script access allowed');
 3
 4class Consolas extends CI_Controller{
 5
 6    function __construct(){
 7        parent::__construct();
 8        // cargamos el modelo en el constructor:
 9        $this->load->model('Consolas_model');
10    }
11
12    public function index(){
13
14        // utilizamos el método para recuperar los datos del la tabla:
15        $consolas_list = $this->Consolas_model->get_all();
16
17        // comprobamos si está vacío:
18        if(empty($consolas_list)){
19            // pasamos al data que no existen consolas:
20            $data['consolas_list'] = "No existen consolas";
21        }
22
23        // asignamos a la data la lista:
24        $data['consolas_list'] = $consolas_list;
25
26        // se la pasamos a la vista:
27        $this->load->view('consolas_list', $data);
28    }
29}
30
31/* Fin del archivo Consolas.php */
  • Por úlitmo en el template lo mostramos consolas_list.php:

 1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7    <title>Listado de consolas</title>
 8</head>
 9<body>
10    <h1>Listado de consolas</h1>
11    <!-- El contenido de la variable data se pasa como si fueran variables sueltas: -->
12    <ul>
13        <?php foreach($consolas_list as $key => $consola){
14            echo "<li>" . $consola->marca . " " . $consola->modelo . "</li>";
15        }
16        ?>
17    </ul>
18</body>
19</html>

Atención

Es posible que tengamos que habilitar la extensión mysqli.dll quitando el ; de la línea correspondiente en el archivo php.ini

Insertar datos#

  • En el modelo añadimos una nueva función en Consolas_model.php:

 1<?php
 2
 3class Consolas_model extends CI_Model {
 4
 5    function __construct(){
 6        parent::__construct();
 7        $this->load->database();
 8    }
 9
10    public function get_all(){
11        $query = $this->db->get('consolas');
12        return $query->result();
13    }
14    // creamos una función para insertar datos:
15    public function create(){
16        // recuperamos los datos recibidos por post:
17        $data = $this->input->post();
18        // quitamos el botón submit que se reconoce como un input mas y da error (tambien quitamos el campo en_coleccion que tampoco existe en la tabla):
19        unset($data['btn_consola']);
20        unset($data['en_coleccion']);
21        // insertamos los datos recibidos por post pasandole a insert la tabla y la operación post:
22        $this->db->insert('consolas', $data);
23
24        // retornamos el resultado:
25        return $this->db->insert_id();
26    }
27}
28
29/* Fin del archivo Consolas_model.php */
  • A continuación editamos el controlador Consolas.php:

 1<?php
 2defined('BASEPATH') OR exit('No direct script access allowed');
 3
 4class Consolas extends CI_Controller{
 5    function __construct(){
 6        parent::__construct();
 7        $this->load->model('Consolas_model');
 8        $this->load->helper('form');
 9    }
10
11    public function index(){
12
13        $consolas_list = $this->Consolas_model->get_all();
14
15        if(empty($consolas_list)){
16            $data['consolas_list'] = "No existen consolas";
17        }
18
19        $data['consolas_list'] = $consolas_list;
20
21        $this->load->view('consolas_list', $data);
22    }
23
24    public function add(){
25
26        if($this->input->post()){
27            // si llegan valores por post vamos a insertarlos:
28            $id_result = $this->Consolas_model->create();
29            // para hacer pruebas le pasamos a new_console el id resultante:
30            $data['new_console'] = $id_result;
31        }else{
32            $data['new_console'] = "pendiente de resultados";
33        }
34
35
36        $this->load->view('add_consola', $data);
37
38    }
39}
40
41/* Fin del archivo Consolas.php */
  • Y ya solo falta nuestro formulario que lo hemos podido crear en la sección Formularios.

Borrar registros#

  • Creamos una nueva función en el modelo Consolas_model.php:

 1<?php
 2
 3class Consolas_model extends CI_Model {
 4
 5    function __construct(){
 6        parent::__construct();
 7        $this->load->database();
 8    }
 9
10    public function get_all(){
11        $query = $this->db->get('consolas');
12        return $query->result();
13    }
14
15    public function create(){
16        $data = $this->input->post();
17
18        unset($data['btn_consola']);
19        unset($data['en_coleccion']);
20
21        $this->db->insert('consolas', $data);
22
23        return $this->db->insert_id();
24    }
25
26    // para eliminar creamos una nueva función delete que recibirá un id:
27    public function delete($id){
28        if($id){
29            // buscamos el id del elemento a eliminar en la tabla:
30            $this->db->where('id', $id);
31            // decimos que se debe borrar de la tabla correspondiente:
32            $this->db->delete('consolas');
33        }
34    }
35}
36
37/* Fin del archivo Consolas_model.php */
  • Ahora pasamos al controlador Consolas.php:

 1<?php
 2defined('BASEPATH') OR exit('No direct script access allowed');
 3
 4class Consolas extends CI_Controller{
 5    function __construct(){
 6        parent::__construct();
 7        $this->load->model('Consolas_model');
 8        $this->load->helper('form');
 9        // cargamos el helper url para poder hacer redirecciones:
10        $this->load->helper('url');
11    }
12
13    public function index(){
14
15        $consolas_list = $this->Consolas_model->get_all();
16
17        if(empty($consolas_list)){
18            $data['consolas_list'] = "No existen consolas";
19        }
20
21        $data['consolas_list'] = $consolas_list;
22
23        $this->load->view('consolas_list', $data);
24    }
25
26    public function add(){
27
28        if($this->input->post()){
29            $id_result = $this->Consolas_model->create();
30            $data['new_console'] = $id_result;
31        }else{
32            $data['new_console'] = "pendiente de resultados";
33        }
34
35
36        $this->load->view('add_consola', $data);
37    }
38
39    // creamos una nueva función para eliminar un contacto:
40    public function delete($id = null){
41        // comprobamos que recibimos un id:
42        if($id){
43            // realizamos la eliminación del elemento:
44            $this->Consolas_model->delete($id);
45        }
46
47        // redirigimos a la lista:
48        redirect('consolas');
49    }
50}
51
52/* Fin del archivo Consolas.php */
  • Si vamos a la ruta siguiente y vamos cambiando el numero id se borraran los registros que tengan dicho id: localhost:8000/index.php/consolas/delete/1

Actualizar registros#

  • Como en los otros casos comenzamos con el modelo que estabamos usando Consolas_model.php:

 1<?php
 2
 3class Consolas_model extends CI_Model {
 4
 5    function __construct(){
 6        parent::__construct();
 7        $this->load->database();
 8    }
 9
10    public function get_all(){
11        $query = $this->db->get('consolas');
12        return $query->result();
13    }
14
15    public function create(){
16        $data = $this->input->post();
17
18        unset($data['btn_consola']);
19        unset($data['en_coleccion']);
20
21        $this->db->insert('consolas', $data);
22
23        return $this->db->insert_id();
24    }
25
26    public function delete($id){
27        if($id){
28            $this->db->where('id', $id);
29            $this->db->delete('consolas');
30        }
31    }
32
33    // creamos una metodo para traer una consola:
34    public function get($id){
35        if($id){
36            $query = $this->db->where('id', $id);
37            $query = $this->db->get('consolas');
38
39            // retornamos el resultado:
40            return $query->result();
41        }
42    }
43
44    // creamos un método para actualizar un registro:
45    public function update($id){
46        // recuperamos los datos de post y quitamos el botón:
47        $update_data = $this->input->post();
48        unset($update_data['btn_consola']);
49
50        // buscamos el registro que queremos modificar:
51        $this->db->where('id', $id);
52        // registramos los cambios:
53        $this->db->update('consolas', $update_data);
54
55    }
56}
57
58/* Fin del archivo Consolas_model.php */
  • Continuamos por el controlador Consolas.php:

 1<?php
 2defined('BASEPATH') OR exit('No direct script access allowed');
 3
 4class Consolas extends CI_Controller{
 5    function __construct(){
 6        parent::__construct();
 7        $this->load->model('Consolas_model');
 8        $this->load->helper('form');
 9        // recuerda tener el helper de redirecciones cargado:
10        $this->load->helper('url');
11    }
12
13    public function index(){
14
15        $consolas_list = $this->Consolas_model->get_all();
16
17        if(empty($consolas_list)){
18            $data['consolas_list'] = "No existen consolas";
19        }
20
21        $data['consolas_list'] = $consolas_list;
22
23        $this->load->view('consolas_list', $data);
24    }
25
26    public function add(){
27
28        if($this->input->post()){
29            $id_result = $this->Consolas_model->create();
30            $data['new_console'] = $id_result;
31        }else{
32            $data['new_console'] = "pendiente de resultados";
33        }
34
35
36        $this->load->view('add_consola', $data);
37    }
38
39    public function delete($id = null){
40        if($id){
41            $this->Consolas_model->delete($id);
42        }
43
44        redirect('consolas');
45    }
46
47    // crear un nuevo metodo para actualizar registros:
48    public function update($id = null){
49        // vamos a redireccionar si no nos llega un id:
50        if($id == null){
51            redirect('consolas');
52        }else{
53            // si nos llega algo cargamos los datos haciendo una consulta:
54            $data['consola'] = $this->Consolas_model->get($id);
55            // si no recuperamos nada (no existe el registro) regresamos a la lista:
56            if(empty($data['consola'])){
57                redirect('consolas');
58            }
59        }
60
61        // verificamos si recibimos valores vía post:
62        if($this->input->post()){
63            $this->Consolas_model->update($id);
64            redirect('consolas');
65        }
66
67        // cargamos la vista para actualizar consolas:
68        $this->load->view('update_consola', $data);
69    }
70}
71
72/* Fin del archivo Consolas.php */
  • Finalmente creamos una vista similar a la que tenemos para crear registros y la llamamos update_consola.php:

 1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7    <title>Actualizar consola</title>
 8</head>
 9<body>
10<h1>Actualizar consola</h1>
11<hr/>
12<br/>
13
14<!-- pasamos el resultado del data por el atributo value: -->
15<?php
16    $input_marca = array(
17        'name' => 'marca',
18        'id' => 'marca',
19        'class' => 'input_marca',
20        'value' => set_value('marca', $consola[0]->marca) // para establecer un valor en el formulario se usa set_value()
21    );
22    $input_modelo = array(
23        'name' => 'modelo',
24        'id' => 'modelo',
25        'class' => 'input_modelo',
26        'value' => set_value('modelo', $consola[0]->modelo)
27    );
28    $en_coleccion = array(
29        '0' => 'No',
30        '1' => 'Si'
31    );
32?>
33
34<!-- Hemos quitado el selector porque no lo vamos a usar -->
35<?php
36    echo form_open('');
37
38    echo form_label('Marca', 'marca');
39    echo form_input($input_marca);
40    echo "<br/><br/>";
41    echo form_label('Modelo', 'modelo');
42    echo form_input($input_modelo);
43    echo "<br/><br/>";
44    echo form_submit('btn_consola', 'actualizar consola');
45    echo form_close();
46?>
47
48<hr />
49</body>
50</html>