Framework: Codeigniter 3
========================
.. image:: /logos/logo-codeigniter.png
:scale: 100%
:alt: Logo Codeigniter
:align: center
.. |date| date::
.. |time| date:: %H:%M
Documentación básica para trabajar con Codeigniter 3
.. contents:: Índice
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``
.. attention::
Este manual es para la versión 3, la versión 4 tiene cambios en su estructura entre otros.
.. attention::
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:
- http://localhost:8000/controlador/metodo/parametro_1/parametro_2/
Vistas en CodeIgniter 3
#######################
Para crear una vista en Codeigniter 3 vamos a **application/views** y creamos un archivo por ejemplo **consolas_list.php**:
.. code-block:: php
:linenos:
Listado de consolas
Listado de consolas
- Sony PlayStation
- Sega Megadrive
- Nintendo DS
Para cargar la vista en el controlador hacemos lo siguiente en **Consolas.php**:
.. code-block:: php
:linenos:
load->view('consolas_list');
}
}
/* Fin del archivo Consolas.php */
Uso de variables
****************
Las variables se pueden cargar desde el controlador del siguiente modo (Consolas.php):
.. code-block:: php
:linenos:
load->view('consolas_list', $data);
}
}
/* Fin del archivo Consolas.php */
En la vista la mostramos del siguiente modo (consolas_list.php):
.. code-block:: php
:linenos:
Listado de consolas
Listado de consolas
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**:
.. code-block:: php
:linenos:
load->helper('url');
}
public function index($consola = null){
echo "Estás en el índice";
}
// creamos un método que nos redirija al indice:
public function redirigir(){
// ejecutamos la función redirect y le decimos a que metodo tiene que viajar:
redirect('/consolas/index/', 'refresh');
}
}
/* Fin del archivo Consolas.php */
- Si ejecutamos localhost:8000/consolas/redirigir nos llevará al index de consolas via redireccionamiento.
.. note::
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):
.. code-block:: php
:linenos:
class Consolas extends CI_Controller{
function __construct(){
parent::__construct();
$this->load->model('Consolas_model');
// utilizamos el helper form:
$this->load->helper('form');
}
public function index(){
$consolas_list = $this->Consolas_model->get_all();
if(empty($consolas_list)){
$data['consolas_list'] = "No existen consolas";
}
$data['consolas_list'] = $consolas_list;
$this->load->view('consolas_list', $data);
}
// crear un controlador para el create:
public function add(){
// recibir información por POST:
if($this->input->post()){
$data['new_console'] = $this->input->post();
}else{
$data['new_console'] = "pendiente de resultados";
}
// cargamos la vista:
$this->load->view('add_consola', $data);
}
}
- en una nueva vista a la que llamamos **add_consola.php** le cargamos el formulario:
.. code-block:: php
:linenos:
Añadir consola
Añadir consola
'marca',
'id' => 'marca',
'class' => 'input_marca'
);
$input_modelo = array(
'name' => 'modelo',
'id' => 'modelo',
'class' => 'input_modelo'
);
// en caso de ser un desplegable tendremos dos arrays:
$input_en_coleccion = array(
'name' => 'en_coleccion',
'id' => 'en_coleccion',
'class' => 'input_en_coleccion'
);
$en_coleccion = array(
'0' => 'No',
'1' => 'Si'
);
?>
";
echo form_label('Modelo', 'modelo');
echo form_input($input_modelo);
echo "
";
echo form_label('En posesión', 'en_posesion');
echo form_dropdown($input_en_coleccion,$en_coleccion);
echo "
";
echo form_submit('btn_consola', 'añadir consola');
echo form_close();
?>
- Ahora tenemos el formulario para añadir consolas en http://localhost:8000/consolas/add
.. note::
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**:
.. code-block::
CREATE DATABASE curso_codeigniter;
- Creamos un nuevo usuario:
.. code-block:: sql
:linenos:
CREATE USER 'guillermo'@'localhost' IDENTIFIED BY '1234';
- Le otorgamos privilegios en la base de datos nueva:
.. code-block:: sql
:linenos:
GRANT ALL PRIVILEGES ON curso_codeigniter.* TO 'guillermo'@'localhost';
- Desplegar los privilegios para que se puedan usar ya:
.. code-block:: sql
:linenos:
FLUSH PRIVILEGES;
- Seleccionamos la base de datos:
.. code-block:: sql
:linenos:
USE curso_codeigniter;
- creamos la tabla consolas:
.. code-block:: sql
:linenos:
CREATE TABLE consolas (
id INT auto_increment NOT NULL,
marca varchar(100) NULL,
modelo varchar(100) NULL,
PRIMARY KEY(id)
)
ENGINE=InnoDB;
- Creamos unos registros para tener datos que listar a continuación:
.. code-block:: sql
:linenos:
INSERT INTO consolas VALUES
(NULL, "sony", "playstation"),
(NULL, "nintendo", "switch"),
(NULL, "sega", "mega drive"),
(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']**:
.. code-block:: php
:linenos:
$db['default'] = array(
'dsn' => '',
'hostname' => 'localhost', // localhost el servidor
'username' => 'guillermo', // este es el usuario para conectar
'password' => '1234', // la contraseña en blanco si no definimos una
'database' => 'curso_codeigniter', // el nombre de la base de datos
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
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**:
.. code-block:: php
:linenos:
load->database();
}
// creamos una función para traer del modelo todos los registros:
public function get_all(){
// recuperar datos de la tabla:
$query = $this->db->get('consolas');
// devolvemos la información:
return $query->result();
}
}
/* Fin del archivo Consolas_model.php */
- En el controlador realizamos la consulta **Consolas.php**:
.. code-block:: php
:linenos:
load->model('Consolas_model');
}
public function index(){
// utilizamos el método para recuperar los datos del la tabla:
$consolas_list = $this->Consolas_model->get_all();
// comprobamos si está vacío:
if(empty($consolas_list)){
// pasamos al data que no existen consolas:
$data['consolas_list'] = "No existen consolas";
}
// asignamos a la data la lista:
$data['consolas_list'] = $consolas_list;
// se la pasamos a la vista:
$this->load->view('consolas_list', $data);
}
}
/* Fin del archivo Consolas.php */
- Por úlitmo en el template lo mostramos **consolas_list.php**:
.. code-block:: php
:linenos:
Listado de consolas
Listado de consolas
$consola){
echo "- " . $consola->marca . " " . $consola->modelo . "
";
}
?>
- Ahora si vamos a la ruta http://localhost:8000/consolas veremos la lista creada en la base de datos.
.. attention::
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**:
.. code-block:: php
:linenos:
load->database();
}
public function get_all(){
$query = $this->db->get('consolas');
return $query->result();
}
// creamos una función para insertar datos:
public function create(){
// recuperamos los datos recibidos por post:
$data = $this->input->post();
// 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):
unset($data['btn_consola']);
unset($data['en_coleccion']);
// insertamos los datos recibidos por post pasandole a insert la tabla y la operación post:
$this->db->insert('consolas', $data);
// retornamos el resultado:
return $this->db->insert_id();
}
}
/* Fin del archivo Consolas_model.php */
- A continuación editamos el controlador **Consolas.php**:
.. code-block:: php
:linenos:
load->model('Consolas_model');
$this->load->helper('form');
}
public function index(){
$consolas_list = $this->Consolas_model->get_all();
if(empty($consolas_list)){
$data['consolas_list'] = "No existen consolas";
}
$data['consolas_list'] = $consolas_list;
$this->load->view('consolas_list', $data);
}
public function add(){
if($this->input->post()){
// si llegan valores por post vamos a insertarlos:
$id_result = $this->Consolas_model->create();
// para hacer pruebas le pasamos a new_console el id resultante:
$data['new_console'] = $id_result;
}else{
$data['new_console'] = "pendiente de resultados";
}
$this->load->view('add_consola', $data);
}
}
/* 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**:
.. code-block:: php
:linenos:
load->database();
}
public function get_all(){
$query = $this->db->get('consolas');
return $query->result();
}
public function create(){
$data = $this->input->post();
unset($data['btn_consola']);
unset($data['en_coleccion']);
$this->db->insert('consolas', $data);
return $this->db->insert_id();
}
// para eliminar creamos una nueva función delete que recibirá un id:
public function delete($id){
if($id){
// buscamos el id del elemento a eliminar en la tabla:
$this->db->where('id', $id);
// decimos que se debe borrar de la tabla correspondiente:
$this->db->delete('consolas');
}
}
}
/* Fin del archivo Consolas_model.php */
- Ahora pasamos al controlador **Consolas.php**:
.. code-block:: php
:linenos:
load->model('Consolas_model');
$this->load->helper('form');
// cargamos el helper url para poder hacer redirecciones:
$this->load->helper('url');
}
public function index(){
$consolas_list = $this->Consolas_model->get_all();
if(empty($consolas_list)){
$data['consolas_list'] = "No existen consolas";
}
$data['consolas_list'] = $consolas_list;
$this->load->view('consolas_list', $data);
}
public function add(){
if($this->input->post()){
$id_result = $this->Consolas_model->create();
$data['new_console'] = $id_result;
}else{
$data['new_console'] = "pendiente de resultados";
}
$this->load->view('add_consola', $data);
}
// creamos una nueva función para eliminar un contacto:
public function delete($id = null){
// comprobamos que recibimos un id:
if($id){
// realizamos la eliminación del elemento:
$this->Consolas_model->delete($id);
}
// redirigimos a la lista:
redirect('consolas');
}
}
/* 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**:
.. code-block:: php
:linenos:
load->database();
}
public function get_all(){
$query = $this->db->get('consolas');
return $query->result();
}
public function create(){
$data = $this->input->post();
unset($data['btn_consola']);
unset($data['en_coleccion']);
$this->db->insert('consolas', $data);
return $this->db->insert_id();
}
public function delete($id){
if($id){
$this->db->where('id', $id);
$this->db->delete('consolas');
}
}
// creamos una metodo para traer una consola:
public function get($id){
if($id){
$query = $this->db->where('id', $id);
$query = $this->db->get('consolas');
// retornamos el resultado:
return $query->result();
}
}
// creamos un método para actualizar un registro:
public function update($id){
// recuperamos los datos de post y quitamos el botón:
$update_data = $this->input->post();
unset($update_data['btn_consola']);
// buscamos el registro que queremos modificar:
$this->db->where('id', $id);
// registramos los cambios:
$this->db->update('consolas', $update_data);
}
}
/* Fin del archivo Consolas_model.php */
- Continuamos por el controlador **Consolas.php**:
.. code-block:: php
:linenos:
load->model('Consolas_model');
$this->load->helper('form');
// recuerda tener el helper de redirecciones cargado:
$this->load->helper('url');
}
public function index(){
$consolas_list = $this->Consolas_model->get_all();
if(empty($consolas_list)){
$data['consolas_list'] = "No existen consolas";
}
$data['consolas_list'] = $consolas_list;
$this->load->view('consolas_list', $data);
}
public function add(){
if($this->input->post()){
$id_result = $this->Consolas_model->create();
$data['new_console'] = $id_result;
}else{
$data['new_console'] = "pendiente de resultados";
}
$this->load->view('add_consola', $data);
}
public function delete($id = null){
if($id){
$this->Consolas_model->delete($id);
}
redirect('consolas');
}
// crear un nuevo metodo para actualizar registros:
public function update($id = null){
// vamos a redireccionar si no nos llega un id:
if($id == null){
redirect('consolas');
}else{
// si nos llega algo cargamos los datos haciendo una consulta:
$data['consola'] = $this->Consolas_model->get($id);
// si no recuperamos nada (no existe el registro) regresamos a la lista:
if(empty($data['consola'])){
redirect('consolas');
}
}
// verificamos si recibimos valores vía post:
if($this->input->post()){
$this->Consolas_model->update($id);
redirect('consolas');
}
// cargamos la vista para actualizar consolas:
$this->load->view('update_consola', $data);
}
}
/* Fin del archivo Consolas.php */
- Finalmente creamos una vista similar a la que tenemos para crear registros y la llamamos **update_consola.php**:
.. code-block:: php
:linenos:
Actualizar consola
Actualizar consola
'marca',
'id' => 'marca',
'class' => 'input_marca',
'value' => set_value('marca', $consola[0]->marca) // para establecer un valor en el formulario se usa set_value()
);
$input_modelo = array(
'name' => 'modelo',
'id' => 'modelo',
'class' => 'input_modelo',
'value' => set_value('modelo', $consola[0]->modelo)
);
$en_coleccion = array(
'0' => 'No',
'1' => 'Si'
);
?>
";
echo form_label('Modelo', 'modelo');
echo form_input($input_modelo);
echo "
";
echo form_submit('btn_consola', 'actualizar consola');
echo form_close();
?>
- Si vamos por ejemplo a la ruta: http://localhost:8000/index.php/consolas/update/2 podremos actualizar el registro si existe. Si dicho registro no existe establecimos que hiciera un redireccionamiento a la lista.