En más de una ocasión hemos requerido exportar una tabla o consulta a CSV cuando desarrollamos un sistema con CakePHP.
En este breve tutorial te explico los 3 sencillos pasos para exportar datos a CSV con CakePHP 2.x.
Paso 1: En el controlador
Vamos a suponer que vamos a crear un controlador exclusivamente para la exportación de la información, por lo tanto, vamos a crear un archivo en nuestro proyecto app/Controllers/AsistentesController.php
Código PHP
// app/Controllers/AsistentesController.php
class AsistentesController extends AppController {
public function export() {
$this->response->download("export.csv");
$data = $this->Asistente->find('all');
$this->set(compact('data'));
$this->layout = 'ajax';
return;
}
}
Con la siguiente línea se agregan los encabezados como Content-Disposition: attachment; filename="asistentes.csv" para indicarle a los navegadores que se va a descargar un archivo.
$this->response->download("export.csv")
El resto de código del controlador es bastante obvio, recuperamos todos los registros y los mandamos a la vista para ser impresos.
Paso 2: Configurar ruta
Otros programadores si hacen este paso, pero yo suelo omitirlo porque es innecesario, yo lo considero solamente estético.
Dentro del archivo app/Config/routes.php vamos agregar la siguiente línea al final del archivo:
Router::parseExtensions('csv');
Esta configuración permite que usemos la extensión csv en nuestra acción dentro de la URL de la siguiente manera /ruta_base/asistentes/export.csv Si omitimos la configuración de ruta, podemos descargar el archivo de la misma forma, pero sin la extensión .csv
Paso 3: Crear la vista
Escribe el siguiente código en tu vista para imprimir todos los datos del modelo sin importar cuantos sean:
Código PHP:
// app/Views/Asistentes/export.ctp
foreach ($data as $row):
foreach ($row['Asistente'] as &$cell):
// Escarpar comillas dobles
$cell = '"' . preg_replace('/"/','""',$cell) . '"';
endforeach;
echo implode(',', $row['Asistente']) . "\n";
endforeach;
Si necesitas imprimir solamente algunos campos, modifica el controlador para que el método find recupere solo los campos que necesitas exportar.