martes, 6 de mayo de 2008

Dos de Symfony por una peso


Tengo preparado dos tips para los usuarios de symfony, espero que les sea de ayuda en sus de desarrollos con esta excelente herramienta.

El primero es para Exportar una consulta a una planilla excel. Para ello deben crear un método en module/modulename/actions/action.php del modulo al cual pretenden realizar la consulta, en este caso a la acción la llame executeExcel y el modulo se llama autorizaciones.

En la acción lo primero que hago es recuperara los filtros que selecciono el usuario en la vista de lista del modulo autorización (Se supone que los resultados de dicha vista son los que se desean exportar).
Luego Realizamos la consulta y al traer los registros lo procesamos uno por uno de tal manera que queden en una sola variable string, cada campo separado por una como y al final un retorno de carro, esto con el fin de que quede un archivo del tipo CSV (Comma Separated Values), formato que excel entiende a la perfección para importar. Dicha variable la vamos guardando en un archivo temporal el cual posteriormente sera enviado al cliente para que lo descargue.
Por último debemos redireccionar la vista a NONE con el fin de que no se envie ninguna información después de descargar el archivo.

El código completo es el siguiente.
public function executeExcel() {
//Recuperamos los Filtros

$this->processSort();
$this->processFilters();
$this->filters = $this->getUser()->getAttributeHolder()->getAll('sf_admin/autorizaciones/filters');

//Hacemos la Consulta
$c = new Criteria();
$this->addSortCriteria($c);
$this->addFiltersCriteria($c);

$autorizaciones = AutorizacionesPeer::doSelect($c);


//Creamos el archivo temporal de exportación
$file = "autorizaciones-exporta.csv";

$fh = fopen($file,"w+") or die ("unable to open file");

//Cabecera - Cambienla por sus necesidades
$row = "\"Codigo\",";
$row .= "\"Sucursal\",";
$row .= "\"Vendedor\",";
$row .= "\"Motivo\",";
$row .= "\"Comentario\","; $row .= "\"Autorizado por\",";
$row .= "\"Deteriorado\",";
$row .= "\"Cod. Articulo\"\n";

fwrite($fh,$row);


//Procesamos cada línea


foreach($autorizaciones as $aut){
$row = "\"".$aut->getCodigo()."\",";

$row .= "\"".$this->getSucursalName($aut->getIdSucursal())."\",";
$row .= "\"".$this->getVendedorName($aut->getIdVendedor())."\",";
$row .= "\"".$this->getMotivoName($aut->getIdMotivo())."\",";

$row .= "\"".$aut->getComentario()."\",";
$row .= "\"".$aut->getUsuario()."\",";

$row .= "\"".$aut->getDeteriorado()."\"";
$row .= "\"".$aut->getCodArticulo()."\"\n";
fwrite($fh,$row);
}
fclose($fh);

//Enviamos la cabecera HTML para que ejecute la descarga y el browser lo identifique

// como un elemento Excel


header("Content-Type: application/vnd.ms-excel");

header("Content-Type: application/force-download");

header("Content-Transfer-Encoding: binary");

header("Content-Disposition: attachment;filename=".$file );

header("Content-Length: ".filesize($file));

header("Pragma: no-cache");

header("Expires: 0");
readfile($file);

//Tiramos la vista a NONE

return sfView::NONE;


}



La sugunda cosa que tengo para contarles es sobre la internacionalización de las aplicaciones con symfony. Para pasar al español los elementos generádos con CRUD deben configurar apropiadamente los archivos

apps/nombrapp/config/settings.yml

Poner la variable i18n en on, sobre la sección all, de tal manera que se aplique a todos los entornos del proyecto.

i18n: on

Tambien el archivo

apps/nombrapp/config/i18n.yml

En el cual se define la cultura, y el formato de definición del archivo

all:
default_culture: es
source: XLIFF
debug: off
cache: on
untranslated_prefix: "[T]"
untranslated_suffix: "[/T]"


El último paso es crear el archivo messages..xml en el directorio app/miappname/i18n/.

Dicho archivo debe parecerce a este:


http://alba.pressenter.com.ar/cgi-bin/trac.cgi/browser/trunk/alba/apps/principal/i18n/messages.es.xml

Una vez que terminan lo guardan y al entrar al site deberían ver todo en el idioma seleccionado, en el ejemplo español.