====== CodeIgniter 3 ======
Framework de [[informatica:programacion:php|PHP]].
* [[https://codeigniter.com|Web oficial]]
Para consultar notas sobre la versión actual, existe [[informatica:programacion:php:frameworks:codeigniter|otra página]].
===== Modelo Vista Controlador =====
CodeIgniter sigue el paradigma de programación Modelo-Vista-Controlador.
* Modelo: datos
* Vista: resultado visual
* Controlador: intermediario entre los datos y la presentación.
==== Modelo ====
''application/models''
class Nombre_modelo extends CI_model {
function __construct() {
parent::__construct();
$this->load->database();
}
}
* https://codeigniter.com/userguide3/database/query_builder.html
* https://stackoverflow.com/questions/2479132/how-can-i-load-model-to-helper
===== Configuración =====
==== Nginx ====
server{
...
location / {
try_files $uri $uri/ /index.php?/$request_uri;
}
...
}
Si estuviese en un subdirectorio, por ejemplo, ''ci'':
server{
...
location /ci {
try_files $uri $uri/ /ci/index.php?/$request_uri;
}
...
}
===== Componentes =====
==== Helpers ====
Colección de funciones relacionadas.
Una vez cargados, los helpers están disponibles globalmente en los controladores y vistas.
Se almacenan en:
* ''system/helpers'': incluidos en CodeIgniter
* ''application/helpers'': creados por el usuario.
=== Carga ===
$this->load->helper('nombre_helper');
Por ejemplo, si queremos cargar un helper llamado ''url_helper.php'':
$this->load->helper('url');
Se pueden cargar varios a la vez:
$this->load->helper(
array('helper1', 'helper2', 'helper3')
);
Si queremos que algún helper esté disponible para toda la aplicación, añadimos el helper al array de ''application/config/autoload.php''
=== Extender ===
Si queremos ampliar algunos de los helpers, lo creamos en ''application/helpers'' con el mismo nombre, pero añadiéndole el prefijo ''my''. Este prefijo se puede configurar en ''application/config/config.php'':
$config['subclass_prefix'] = 'MY_';
===== Depuración =====
CodeIgniter cuenta con la clase ''Profiler'' que permite mostrar resultados de rendimientos, consultas ejecutadas y la información de ''$_POST'' en la parte inferior de la página. Esto resulta muy útil durante el desarrollo de una aplicación para ayudar en la depuración y optimización.
Podemos activar el //profiler// en el método que queramos de la siguiente manera:
$this->output->enable_profiler(TRUE);
===== Query Builder =====
Utilidades para interactuar con la base de datos
==== Actualizar si existe, insertar si no ====
$this->db->replace()
Ese método ejecuta una sentencia ''REPLACE'' que básicamente es un ''DELETE'' + ''INSERT'', usando las claves primarios y únicas como factor determinante. Esto ahorra tener que imlementar lógicas complejas con diferentes combinaciones de ''select()'', ''update()'', ''delete()'' e ''insert()''.
Ejemplo:
$data = array(
'title' => 'My title',
'name' => 'My Name',
'date' => 'My date'
);
$this->db->replace('table', $data);
// Ejecuta: REPLACE INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
==== Múltiples condiciones en WHERE ====
$array = [
'name' => 'Joe',
'title' => 'Boss',
'status' => 'active'
];
$this->db->where($array);
Lo que hace es :
WHERE name = 'Joe' AND title ='Boss' AND status = 'active'
==== WHERE con varios valores para el mismo campo ====
$colores = ["rojo", "verde", "azul"];
$this->db->where_in("color", $array);
Lo que hace es :
WHERE color IN ('rojo', 'verde', 'azul')
Si lo quisiéramos negar, usaríamos ''where_not_in'':
$colores = ["rojo", "verde", "azul"];
$this->db->where_not_in("color", $array);
Lo que hace es :
WHERE color NOT IN ('rojo', 'verde', 'azul')
===== Utilidades =====
==== Última consulta a base de datos ejecutada ====
Si queremos ver el contenido (no el resultado) de la última consulta a base de datos que se ha lanzado:
$this->db->last_query();
Devolverá algo similar a:
SELECT * FROM tabla ...
También podríamos activar el "profiler" en algún método del controlador y nos dará mucha más información:
$this->output->enable_profiler(TRUE);
* [[https://www.codeigniter.com/userguide3/database/helpers.html|Otros "helpers" de base de datos]]
===== Bibliotecas =====
==== Envío e-mail ====
La [[https://codeigniter.com/userguide3/libraries/email.html#|clase E-mail]] nos facilita el envío de e-mails desde CodeIgniter.
Cargar la biblioteca con los métodos para el envío de e-mails:
$this->load->library('email');
Configuración:
// Configuración email para SMTP
$config["protocol"] = "smtp";
$config["smtp_host"] = "smtp.servidor.com";
$config["smtp_user"] = "";
$config["smtp_pass"] = "";
$config["smtp_port"] = 25;
$config["charset"] = "utf-8";
$config["mailtype"] = "html";
// Aplica configuración:
$this->email->initialize($config);
* [[https://codeigniter.com/userguide3/libraries/email.html#setting-email-preferences|Opciones de configuración]]
Composición y envío de e-mail:
$this->email->from('yo@correo.com', 'Yo');
$this->email->to('destinatario@correo.com');
$this->email->bcc('yo@correo.com');
$this->email->subject("Corre de prueba");
$this->email->message("Hola, mundo!");
$this->email->send();
Depuración:
// You need to pass FALSE while sending in order for the email data
// to not be cleared - if that happens, print_debugger() would have
// nothing to output.
if (!$this->email->send(FALSE)) {
echo $this->email->print_debugger();
}
==== Lectura CSV ====
Biblioteca personalizada:
fields = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure);
}
while ( ($row = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure)) != false ) {
if ( $row[0] != null ) { // skip empty lines
if ( !$content ) {
$content = array();
}
if ( $p_NamedFields ) {
$items = array();
foreach ( $this->fields as $id => $field ) {
if ( isset($row[$id]) ) {
$items[$field] = $row[$id];
}
}
$content[] = $items;
} else {
$content[] = $row;
}
}
}
fclose($file);
return $content;
}
}
/* Location: ./application/libraries/CSVReader.php */
Para usarla:
$this->load->library('CSVReader');
$csvData = $this->csvreader->parse_file('Test.csv'); //path to csv file
===== Excel =====
* [[https://blog.trescomatres.com/2017/04/codeigniter-exportar-a-excel-con-libreria-phpexcel/|CodeIgniter – Exportar a excel con librería PHPExcel]]
* [[https://github.com/PHPOffice/PHPExcel/blob/1.8/Examples/01simple-download-xlsx.php|Ejemplo oficial generando un fichero XLSX]]