Este blog esta destinado para la comunidad desarrolladora de software, en el podrán encontrar trucos, atajos o consejos de diferentes lenguajes de programación o frameworks, tanto de tipo desktop como web. Si quieres participar como editor por favor hacerlo saber escribiendo un correo a cualquiera de los editores.
Mostrando entradas con la etiqueta symfony. Mostrar todas las entradas
Mostrando entradas con la etiqueta symfony. Mostrar todas las entradas

domingo, 20 de febrero de 2011

Symfony cambio de theme

Symfony integrado con jquery cambio del theme
mediante el uso de un plugin sfAdminThemejRollerPlugin

Guia rápida

instalar el plugin

symfony plugin:install sfAdminThemejRollerPlugin --stability=beta
symfony cc
symfony plugin:publish-assets
symfony cc

generar los modulos del admin

symfony doctrine:generate-admin proyectprincipal Categoria --module=admin_categoria

usar el plugin
y en el archivo generator configurar el parametro theme: jroller entras en el archivo
apps/proyectprincipal/modules/admin_categoria/config/generator.yml

generator:
class: sfDoctrineGenerator
param:
model_class: Categoria
theme: jroller

HECHO





muy interesante y bonito, claro que vi que ay algunos errores por alli en las acciones , pero puede que sea ignorancia mia de como usar el plugin.

miércoles, 2 de febrero de 2011

symfony , base de datos postgres codificada en ascii y Ajax

Hola a todos

Les cuento, necesitaba trabajar con symfony sobre una base de datos postgres codificada en sql_ascii, estaba utilizando extjs(trae Ajax ya implementado), y cuando mandaba una lista de datos a la pagina principal, todo lo que tenia tildes o ñ no aparecia es decir mandaba null, pero si imprimia con echo($dato) me aparecia con un caracteres de desconocido, lo primero que pensamos con gus fue que era el charset, y no era, buscando con gus encontramos que el problema era que las peticiones ajax lo que traen lo interpretan como utf-8 y todo lo que era raro desaparecia porque symfony internamente parceaba las cadenas con una funcion en php que ponia null en todo lo que tenia caracteres especiales.

La solucion

  • utf8_encode para mandar los datos


  • utf8_decode antes de ingresar a la base de datos es decir cuando hecemos objPeer-setAtt(utf8_decode($param));

  • poner database.encoding = iso-8859-1 en los archivos de configuracion de symfony propel.ini y database.ini


viernes, 8 de octubre de 2010

Symfony, Propel, Transactions

Para hacer transacciones en Propel:

$transaction = Propel::getConnection();

try
{
$transaction->beginTransaction();

// hago todo lo que tenga que hacer, guardar eliminar, consultar, etc, normalmente

$transaction->commit();
}
catch(Exception $exception)
{
$transaction->rollback();
}

espero les sirva

Extjs, Symfony, FileUploadField

Esta vez le toco a los archivos, subir archivos con extjs, para esto necesitamos los siguientes archivos que se encuentran en

extjs/examples/ux/fileuploadfield/FileUploadField.js

extjs/examples/ux/fileuploadfield/css/fileuploadfield.css

donde extjs es la versión que hallan descargado, bueno los incluimos en nuestro html

y aquí un ejemplo del js:

var subir_archivos_formpanel = new Ext.FormPanel({
title: 'Subir archivos',
width: 400,
height: 300,
frame: true,
fileUpload: true,
style: {"margin-left": "10px"},
bodyStyle: 'padding:5px',
defaults: { xtype: 'textfield', anchor:'100%'},
items:
[
{
xtype: 'fileuploadfield',
id: 'archivo',
emptyText: 'Seleccione un documento',
fieldLabel: 'Escojer',
name: 'archivo',
buttonText: '',
allowBlank:false,
buttonCfg: {iconCls: 'archivo'} /// imagen del boton de seeccionar el archivo
}
],
buttons:
[
{
text:'Enviar',
handler: subir_archivo
}
]
});

function subir_archivo(){
subir_archivos_formpanel.getForm().submit({
method: 'POST',
timeout: 60000, // porsi es muy grande el archivo y se demora mucho en subir
url: url_del_php_o_la_accion_del_symfony,
params: {}, // parametros extra
waitTitle: 'Enviando',
waitMsg: 'Enviando datos...',
success: function(response, action){
obj = Ext.util.JSON.decode(action.response.responseText);
// aqui lo que quiera hacer despues de enviado el archivo con exito
},
failure: function(form, action, response){
if (action.failureType == 'server') {
obj = Ext.util.JSON.decode(action.response.responseText);
// mensaje de error
// lo que quiera hacer cuando falle
}
}
});
}


y en el php:

public function executeSubirArchivo()
{
$salida ='';

try
{
$nombre = $_FILES['archivo']['name'];
$tamano = $_FILES['archivo']['size'];
$tipo = $_FILES['archivo']['type'];
$temporal = $_FILES['archivo']['tmp_name'];
if(file_exists($nombre_carpeta_donde_se_guardan_los_archivos."/".$nombre))
{
$salida = "({success: false, errors: { reason: 'Ya existe el archivo con el mismo nombre en la base de datos'}})";
}
else
{
if($tamano > 2100000) // 1000000 aprox 1mega
{
$salida = "({success: false, errors: { reason: 'El archivo excede el limite de tamano'}})";
}
else
{
$copio = copy($temporal, "uploads/".$nombre_carpeta_donde_se_guardan_los_archivos."/".$nombre);
if($copio){
// guardo la info en db como para mostrar en una grid nombre tamaño y esas cosas
$salida = "({success: true, mensaje:'El archivo subio exitosamente'})";
return $this->renderText($salida);
}
}
}
}
catch (Exception $excepcion)
{
$salida = "({success: false, errors: { reason: 'Hubo un error'}})";
}
return $this->renderText($salida);
}


no esta muy explicado pero creo que el código es muy legible, no probé el código que aquí esta publicado, lo tome de otro que implemento maryitsv

espero les sirva y si hay algún error no duden en hacerlo saber.


sábado, 21 de agosto de 2010

Seguridad en Symfony

Bueno aunque a un plugin de Symfony (sfGuardPlugin) que ayuda mucho a solucionar el problema, incluyendo gestión de usuarios, credenciales y demás, como para empezar he decidido hacerlo a pie, porque es muy fácil y ademas para aprovechar el modulo de login y de gestión de usuarios que ya estaba hecho.

Bueno la implementación es muy sencilla, basta con agregar unas lineas al archivo security.yml (proyecto/apps/nombreaplicacion/config/security.yml) de nuestra aplicación:

default:
is_secure: true

recuerden conservar los espacios, porque si tabulan... bueno ya sabrán lo que pasa, estas lineas son para pedir que el acceso a los módulos de la aplicación solo puedan ser accedidos por usuarios autenticados, es decir que al momento de validar el usuario sea cual sea la forma en la que lo hagan, recuerden agregar

$this->getUser()->setAuthenticated(true);

de esta forma el usuario estará autenticado y podrá acceder a los módulos de la aplicación.

Bueno, hasta aquí nuestros usuarios del sistema no podrán acceder a nuestra aplicación si nuestro modulo de login se encuentra en el la aplicación que acabamos de proteger, para solucionar estos, conozco hasta ahora dos formas:

  • Crear nuestro modulo de login en otra aplicación.
  • Des proteger el modulo de login de la aplicación asegurada para que pueda ser accedida por usuarios sin autenticar.
Para la primera, si alguien necesita, que comente o me escriba para hacer una entrada explicando como hacer un modulo de login, y para la segunda, debemos crear una carpeta que se llame config dentro de la carpeta del modulo, es decir que quedara acompañada de las carpetas actions y templates de nuestro modulo, e incluir en la carpeta config un archivo llamado security.yml, y en este archivo incluir las siguientes lineas :

default:
is_secure: false

así de esta forma el modulo quedara desprotegido y podrá ser accedido por usuarios no autenticados pues para autenticarse.

Con lo explicado anteriormente también se pueden proteger o des proteger módulos a nivel de aplicación y acciones a nivel de modulo cambiando el default por el nombre de el modulo o la acción que queremos proteger o des proteger.

Otra cosa importante en la seguridad de la aplicación son los roles o credenciales como se llaman en Symfony.

Para hace esto primero autentiquemos a alguien como se dijo anteriormente y ademas agreguemos:

$this->getUser()->addCredential('nombredecredencial', 'valor'); //si necesitamos valores o

$this->getUser()->addCredential('nombredecredencial'); //credencial sencilla

así nuestro usuario tendrá una credencial de acceso a determinados módulos, y para configurar el acceso al modulo con cierta credencial agregamos al security.yml del modulo.

default:
is_secure: true
credentials: nombredecredencial

si necesita solo una credencial, para otras configuraciones de credenciales

credentials: [credencial1, credencial2] // credencial1 and credencial2

credentials: [[credencial1, credencial2]] // credencial1 or credencial2

recuerden que estas configuraciones la pueden hacer tanto a nivel de modulo como de acciones, yo probé hacerlo todo en el security.yml de la aplicación y no funciono, así que me toco ademas configurar el security.yml de algunos módulos.

Hasta aqui tenemos protegidos nuestros módulos por autenticación y por credenciales, pero cuando no puedo acceder? y estoy perdido, lo normal seria que la aplicación me redirigiera hacia el modulo de login, para hacer esto vamos a configurar el archivo settings.yml ubicado en la carpeta config de nuestra aplicación y agregamos o ubicamos las siguientes lineas:

all:
.action:
login_module: nombremodulodelogin
login_action: nombreaccionmostarinterfazlogin //normalmente index

Y por ultimo recordemos des autenticar y limpiar la variables de sesión de la siguiente forma:

$this->getUser()->setAuthenticated(false);
$this->getUser()->clearCredentials();
$this->getUser()->getAttributeHolder()->clear();

RECUERDEN EJECUTAR SYMFONY CC, CUANDO MODIFIQUEMOS CUALQUIER ARCHIVO .YML



jueves, 29 de julio de 2010

Problema Tipo de Dato Bool en Symfony Propel y Postgres

Ha ocurrido un problema en un proyecto en el cual estoy participando, el problema consiste en que cuando uno tiene en su base de datos un campo de tipo bool, el propel no puede hacer la insercion del dato mandado true o false, puesto que con cualquiera que le mande va a asignarle al campo el valor de true, la forma de mandarle correctamente el dato, es mandarle 1 (true) o 0 (false), pero el problema no termina ahi, puesto que si para la insercion se mandaron datos de tipo int, para la consulta tenemos que nos arroja true o false, que es un poco inconsistente, bueno, una manera de abordar el problema es manejar los campos de tipo bool en la base de datos como smallint, asi mendamos y obtenemos el mismo tipo de dato.

Espero sea de ayuda esta informacion, ah y por ultimo y mas importante, version Symfony 1.4.6 - propel


viernes, 25 de junio de 2010

Generar pdf con dompdf en symfony

Bueno en general la librería dompdf me ha parecido muy fácil de trabajar, ya que se genera un html y este se pasa a pdf, es fácil la inclusión de imágenes y de caracteres especiales.

Para integrarla con symfony, sigues los siguientes pasos

  • instalar el plugin para symfony,
    ya sea que la descarguen de http://www.symfony-project.org/plugins/sfDomPDFPlugin la descompriman en la carpeta plugins del sproyecto en el cual estan trabajando y la publiquen mediante el comando plugin:publish-assets o ya sea que los instalen con los comandos de sinfony, creo que es algo asi: plugin:install sfDomPDF
  • descargar la librería dompdf, http://eclecticgeek.com/dompdf/
  • reemplazar la carperta de dompdf que hay en el proyecto de symfony en plugins/sfDomPDFPlugin/lib
  • copiar la carpeta dompdf que descargaste en web/
  • limpiar la cache de synfony: symfony cc
  • empezar a utilizar la libreria

hay les dejo un ejemplo de como usarlo


public function reporte()
{
require_once("dompdf/dompdf_config.inc.php");
$html=stripslashes('<html>');
$html.=stripslashes('');
$html.=stripslashes("<body>");
$html.="Espero que les sirva ";
$html.=stripslashes('</body></html>');

//uso de dom
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->set_paper('letter','landscape');
$dompdf->render();
$dompdf->stream("reporte.pdf");

exit(0);
}


Incluir imágenes con dompdf
Para incluir imágenes que se incluye en el html que se va a cargar la etiqueta img.
 <img alt='gaea-uv' height='139'  src='logo.png'  width='485'/> 


Para incluir imágenes de urls externas a la de donde reside la aplicación deben editar el archivo dompdf_config.init.php y cambiar el false de la variable "DOMPDF_ENABLE_REMOTE" por true.

//configuracion inicial
define("DOMPDF_ENABLE_REMOTE", false);

//configuracion final
define("DOMPDF_ENABLE_REMOTE", true);

Nota:lo que me parecio charro fue que la forma de agregar pies de pagina y numeración no me parecio natural, en este caso me parece que TCPDF tiene su fuerte.

viernes, 11 de junio de 2010

Crear proyecto en Symfony + Extjs

Ya he visto cosas muy raras, así que voy a sugerir una forma de trabajar en Symfony y Extjs desde el principio y con calma. La versión de Symfony que sera usada, sera la 1.2.9 con el ORM Propel.

Para empezar instalamos Symfony como lo he puesto en las otras entradas o como quiera complicarse la vida (yo uso linux ubuntu no por rápido ni seguro ni nada de eso, simplemente por que es muy fácil trabajar allí), a continuación creamos el proyecto en nuestro servidor web, por ejemplo en /var/www/ , en el public_html de una cuenta, o si es win en c:\xampp\htdocs.

Para crear el proyecto recomiendo crear una carpeta como por ejemplo Proyecto, nos situamos dentro de ella y ejecutamos:

symfony generate:project Proyecto

esto nos creara todas las carpetas con la arquitectura usada por symfony. ahora crearemos una aplicación, para esto, allí mismo en la carpeta del proyecto ejecutamos:

symfony generate:app Aplicacion
esto creara una carpeta llamada Aplicacion en la carpeta apps del proyecto, lo siguiente es crear un modulo para esa aplicacion, allí mismo en la carpeta del proyecto ejecutamos:

symfony generate:module Aplicacion Modulo

Aplicacion= aplicacion creada anteriormente
Modulo= modulo de la aplicación creada anteriormente

esto creara una carpeta llamada Modulo en la carpeta Modules de la carpeta de la aplicación creada anteriormente, ya con esto podemos trabajar, pero antes debemos configurar algunos archivos:
  • databases.yml (configuración de conexión a la base de datos)
  • propel.ini (configuración de conexión a la base de datos)
en los archivos anteriores, configuramos la conexion a la base de datos para que Symfony se pueda conectar a ella, recuerde ser muy cuidadoso con los archivos yml, estos archivos se encuentran en la carpeta config del proyecto.

Otra cosa que recomiendo es cambiar el nombre del archivo .htaccess que se encuentra en la carpeta web por el de htaccess (quitar el punto), y añadir a la carpeta web la carpeta sf que la pueden descargar del siguiente link:


listo, ya con esto podemos revisar que vamos bien, para esto vamos a nuestro navegador, y accedemos al modulo creado de la siguiente manera:

localhost/Proyecto/web/index.php/Modulo

Ahora, después de la configuración de la base de datos, vamos a hacer el mapeo de la base de datos, para esto hay muchas formas de hacerlo, pero aquí explicare la forma de crear el schema.yml a partir de las tablas ya creadas en la base de datos.

Después de tener las tablas creadas en la base de datos, ejecutamos en la carpeta del proyecto:

symfony propel:build-schema

esto creara (modificara) el schema.yml que se encuentra en la carpeta config, este archivo se puede configurar pero recuerde ser muy cuidadoso con los espacios y demás. A partir de este schema, crearemos el modelo (clases de las relaciones), para esto ejecutamos:

symfony propel:build-model

y listo, ya tenemos preparada nuestra conexión y acceso de datos para nuestro proyecto.

Lo siguiente que haremos sera incluir el Extjs, para esto sugiero hacerlo asi como lo he explicado en una entrada anterior (Integración de Extjs en Symfony) perdón pero estoy muy cansado, apenas tenga tiempo lo termino.

Symfony + PDF, TCPDDF (sfTCPDFPlugin)

Bueno, como todo proyecto tiene reportes(en pdf), aquí va como agregar TCPDF a nuestro proyecto de Symfony.

Hasta donde hemos trabajado, lo hemos hecho de dos formas.

La primera es agregándolo con Symfony, situados en la carpeta de nuestro proyecto, ejecutamos:

symfony plugin:install sfTCPDFPlugin

luego

symfony plugin:publish-assets

luego

symfony cc

La segunda forma es descargarlo de:


recuerde revisar que la versión que descargue sea compatible con la versión del Symfony con la que esta trabajando. Despues de descargado lo descomprimen y lo copian en la carpeta de plugins del proyecto, debe quedar algo así: nombreProyecto/plugins/sfTCPDFPlugin, y despues ejecutamos:

symfony plugin:publish-assets

luego

symfony cc

y listo, ya tenemos el TCPDF en nuestro proyecto, ahora un ejemplo:

en el action de un modulo creamos una nueva acción

public function executeReportePDF()
{
$config = sfTCPDFPluginConfigHandler::loadConfig();

$pdf = new sfTCPDF();

$pdf->SetFont('FreeSerif', '', 8);

$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->setHeaderFont(array(PDF_FONT_NAME_MAIN, '', '13'));
$pdf->SetHeaderData('', 2, 'Symfony', 'Reporte PDF');
$pdf->setFooterFont(array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

$pdf->AliasNbPages();
$pdf->AddPage();
$this->html='Linux Rulez';

$pdf->writeHTML($this->html);
$pdf->ln();
$pdf->Output();

throw new sfStopException();
}

es un ejemplo muy sencillo, como para probar, ya cada quien lo modificara y le agregara cosas a su antojo. (por ahora no se como poner etiquetas html en las entradas del blog.)

miércoles, 9 de junio de 2010

Integración de Extjs en Symfony

Bueno para empezar voy a decir que existen muchas formas, e incluso yo probé muchas de esas, con variantes y todo (links, doble carpeta, etc), pero la verdad es que es muy simple, bueno aquí presentare la que yo adapte y adopte en un proyecto que estoy realizando para la u.

Lo primero es copiar la carpeta del extjs a la carpeta web de nuestro proyecto (nombreProyecto/web/extjs), e incluir en view.yml de la aplicación (nombreProyecto/apps/nombreAplicacion/config/view.yml) los js y css respectivos para el funcionamiento del extjs, el archivo view.yml se tendría que ver algo así:

....

stylesheets: [../extjs/resources/css/ext-all.css, main.css, ../extjs/resources/css/xtheme-blue.css , ...]

...

javascripts: [../extjs/adapter/ext/ext-base.js, ../extjs/ext-all-debug.js, ../extjs/src/locale/ext-lang-es.js, ...]

...

y listo, no olviden aquí mismo incluir sus js.

nota: no se si al hacer esto altere en algo la arquitectura del proyecto (organizacion de las carpetas y demas), y a la hora de la revisión, algún profesor salga con las que el proyecto ya no esta en 3 + 1 capas. En lo personal creo que no, ya que solo estamos tocando la interfaz de presentacion.

domingo, 6 de junio de 2010

Instalar symfony en win

Después de tener instalado php, apache y mysql, ya sea usando el xampp o wampp o cada uno independiente (yo lo hago con xampp), descargamos el symfony desde

http://www.symfony-project.org

o para una version especifica

http://www.symfony-project.org/get/symfony-"version".tgz

por ejemplo:

http://www.symfony-project.org/get/symfony-1.2.9.tgz

despues de descargado, lo extraemos en el directorio htdocs (xampp) que se encuentra en

c:\xampp\htdocs

y agregamos las variables de entorno para php y el symfony de la siguiente manera:

Equipo -> Clic derecho (propiedades) -> Configuración Avanzada del Sistema -> variables
de entorno. Modifico la variable Path, y le adiciono las rutas absolutas donde se encuentran el php y el symfony:

PHP: C:\xampp\php
Symfony: C:\xampp\htdocs\symfony-1.2.9\data\bin

y listo ya tenemos instalado Symfony en win.

Redactado con ayuda de una guía desarrollada por Jose Omar (jomaroc). vamos a ver si me deja publicarla aquí, ya que ahí se encuentra el proceso un poco mas detallado y ademas explica como crear y configurar un proyecto.

jomaroc, gracias por el comentario y por dejar publicar su trabajo.

Bueno sin mas aquí esta el link.



Instalar Symfony en Linux (Ubuntu)

Después de tener instalado el Php, Mysql y el Apache, ya sea por Lamp, Xampp, o cada uno independiente, lo siguiente es instalar Pear de la siguiente manera:

sudo apt-get install php-pear

luego agregar el canal de Symfony:

pear channel-discover pear.symfony-project.com

y finalmente instalar Symfony

sudo pear install symfony/symfony

si se quiere instalar una versión especifica, agregamos la versión al final, ej

sudo pear install symfony/symfony-1.2.9

y listo, recuerden tener instalado el php5-cli, y libxslt para usar el propel.