Archivo para la categoría ‘Symfony’

26/04/11

Symfony redirect en un componente

No es que sea muy recomendable pero si alguna vez neceistamos realizar un “redirect”  desde dentro de un componente podemos utilizar el siguiente método de ejemplo.


$this->getController()->redirect(url_for('@ruta?foo=bar,true));

De ésta manera podemos abstraer la lógica de la gestión de un formulario antes y después del submit. Lo único que debemos asegurarnos es que el atributo action del tag form queda vacío, de ésta forma, siempre se ejecutará el código de validación del formulario en cualquier página. Aquí os dejo un ejemplo.


class componentsComponents extends sfComponents {

  public function executeBuscador(sfWebRequest $request) {
    $this->form = new form();
    if ($request->isMethod('post')){
      $params = $request->getParameter($this->form->getName());
      $this->form->bind($params);
      if ($this->form->isValid()){
        $this->getController()->redirect(url_for('@url?foo=bar,true));
      }
    }
  }

}

/**** HTML DEL COMPONENTE ***/
<form id="buscador" name="buscador" method="post" action="">
..
</form>
/************************/
01/04/11

acceder a las variables globales de symfony

Muchas veces queremos referenciar las variables internas que Symfony utiliza para acceder a sus carpetas, entornos, etc..

Aqui os dejo una buena lista de las variables que podemos acceder a través de sfConfig al estilo sfConfig::get([variable])

Variable globales

sf_symfony_lib_dir: Path absoluto al directorio de instalación de las librerías de symfony

sf_root_dir: Path al directorio raíz del proyecto

sf_apps_dir: Path al directorio app de tu proyecto.

sf_lib_dir: Path al directorio de librerías general del proyecto (/var/www/project_name/lib)

sf_log_dir: Path al directorio log del proyecto (/var/www/project_name/log)

sf_data_dir: Path a la carpeta data del proyecto (/var/www/project_name/data)

sf_config_dir: Path a la carpeta config del proyecto (/var/www/project_name/config)

sf_test_dir: Path a la carpeta test del proyecto (/var/www/project_name/test)

sf_doc_dir: The path to the project’s doc folder (/var/www/project_name/doc)

sf_plugins_dir: Path a la carpeta plugins del proyecto (/var/www/project_name/plugins)

sf_cache_dir: Path a la carpeta cache del proyecto (/var/www/project_name/cache)

sf_web_dir: Path a la carpeta web del proyecto (/var/www/project_name/web)

sf_upload_dir: Path a la carpeta upload del proyecto (/var/www/project_name/web/uploads)

leer más…

17/03/11

Obtener el entorno activo

Si queremos ejecutar código según estemos en dev, test o prod podemos obtener el valor del entorno activo mediante.

sfConfig::get('sf_environment')

Nos devolverá ‘dev’, ‘test’ o ‘prod’, muy útil en algunos casos.

02/02/11

project:disable – desactivar un proyecto

Para desactivar nuestra web por mantenimiento podemos utilizar la tarea symfony project:disable env [app].

Debemos asegurarnos que tenemos en settings.yml la línea:

check_lock: true

de lo contrario no funcionará.

Si queremos sobreescribir el html mostrado, debemos editar el archivo unavailable.php de las librerías originales de symfony en lib/exception/data/unavailable.php.

Suponiendo que nuestra web corre en un servidor con una única instalación específica para la web, no debería de ser un problema.

El código completo de las acciones a realizar quedaría así:

php symfony project:disable prod frontend
<-- hacer algo -->
php symfony project:enable prod frontend
20/01/11

Excluir carpetas symfony con .htaccess

Podemos excluir carpetas de nuestro directorio /web del routing de symfony.

Por ejemplo, imaginaros que queremos instalar un foro phpBB en nuestro site Symfony. Podríamos utilizar plugins o bien descargar la última versión y directamente instalarla en nuestra carpeta /web/foro/. Si hacemos ésto último y escribimos la url lo más seguro es que salte error 404 por no encontrar modulo “foro” acción “index”.

Podemos excluir ésta carpeta del enrutado de symfony debemos añadir las lineas 02 y 07 a nuestro htaccess.

Options +FollowSymLinks +ExecCGI
DirectoryIndex index.php index.html index.htm

<IfModule mod_rewrite.c>

  RewriteEngine On
  RewriteRule ^(nombre_carpeta)($|/) - [L]

  # uncomment the following line, if you are having trouble
  # getting no_script_name to work
  # RewriteBase /

  # we skip all files with .something
  # RewriteCond %{REQUEST_URI} \..+$
  # RewriteCond %{REQUEST_URI} !\.html$
  # RewriteRule .* - [L]

  # we check if the .html version is here (caching)
  RewriteRule ^$ index.html [QSA]
  RewriteRule ^([^.]+)$ $1.html [QSA]
  RewriteCond %{REQUEST_FILENAME} !-f
  # no, so we redirect to our front web controller
  # RewriteRule ^(.*)$ index.php [QSA,L]
  RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

Hecho ésto ya debería funcionar.

27/12/10

Tutorial Doctrine DQL , parte 1

Voy a poner un pequeño resumen de como manejarse un poco con las sentencias DQL de Doctrine.
Voy a poner un ejemplo de lo que sería una sentencia DQL my simple por defecto.

$doctrine_collection_object = Doctrine::getTable('usuarios')->findBy('id',453);

Lo primero a tener en cuenta es que DQL no es SQL, si entendemos ésto muy bien tendremos menos problemas y también tener en cuenta que tenemos múltiples maneras de realizar los queries a nuestra base de datos (métodos estáticos, instanciando las clases de las tablas e incluso con SQL nativo).

Disponemos de muchos métodos para realizar consultas, AND, OR, WHERE , ANDWHERE, ORWHERE, etc..

Un ejemplo de realizar un join en Doctrine:
Imaginaros que tenemos las tablas de poblaciones, zonas y tipo_poblacion. Y queremos obtener todas las poblaciones del tipo 2 en el que el nombre esté contenido en el nombre de la población y también en el de la zona.

En la clase poblacionTable creamos el siquiente método:

public static function retrieveByNombre($nombre, $tipo) {
    $query = self::getInstance()->
            createQuery("p")->
            leftJoin("p.tipo t")->
            leftJoin("p.zona z")->
            Where ("t.id_tipo = ".$tipo)->
            andWhere("p.poblacion LIKE '%".$nombre."%' OR z.nombre  LIKE '%".$nombre."%'");
    return $query->execute();
  }

Como vereis es una mezcla entre SQL y las propias clases del squema YML. Las relaciones se basan en las clases y no en las tablas, incluso si son relaciones n to n, doctrine no las diferencia. En nuestro caso tenemos una relacion n-to-n para los tipos y otra 1-to-n para las zonas.

Si queremos depurar la sentencia SQL podemos utilizar el método $query->getSqlQuery(); que nos devuelve la sentencia SQL completa.

Aquí os dejo el link de la documentación de Doctrine Documentación

16/12/10

Personalizar el error 500 en symfony

Comentando con mi compañero Adolfo nos hemos encontrado con el problema de personalizar el error 500 . Para ello, debemos crear el archivo error.html.php en /config/error/.

Podemos crear éstos archivos en el nivel que creamos oportuno, para todo nuestro site o para una aplicación en concreto mediante la configuración en cascada de symfony.

Tambíen podemos utilizar variables desde los archivos de configuración a través del método sfConfig::get.

26/11/10

Escapar variables en la plantilla y acción

Cuando hemos guardado en base de datos texto formateado HTML y deseamos mostrarlo en plantilla nos encontramos con que Symfony escapa todos los caracteres especiales por defecto. Esta es una opción que se puede desactivar globalmente aunque yo no lo recomiendo ya que es una medida de seguridad ante posibles ataques.

Configuracion de las opciones globales de esapado en symfony:

all:
  .settings:
    # Output escaping settings
    escaping_strategy:      true
    escaping_method:        ESC_SPECIALCHARS

Las opciones disponibles de escapado son la siguientes:

  • ESC_RAW: Desactivar el escapado (no recomendado).
  • ESC_SPECIALCHARS: Utiliza la funcion PHP htmlspecialchars() para escapar los valores.
  • ESC_ENTITIES: Utiliza la funcion PHP htmlentities() para escapar los valores.
  • ESC_JS: Escapa los valres que se van a utilizar en una cadena Javascript. Útil para escapar HTML que va a ser modificado dinámicamente mediante Javascript.

Si estamos totalmente seguros que queremos utilizar código html, javascript, etc.. en plantilla y mostrarlo podemos acceder al objeto $sf_data que nos permite obtener los valores RAW de las variables.

//ejemplo de obtener los valores raw de los elementos de un array que hemos creado en la accion mediante $this->values
<!--?php foreach ($sf_data--->getRaw('values') as $data): ?>
  <!--?php echo ($data); ?-->
<!--?php endforeach ?-->
//ejemplo de obtener los valores raw de un objeto de base de datos, pj: $this->object
<!--?php echo ($sf_data--->getRaw('object')->getNombre() ?>

Tambíen podemos desactivar a nivel de acción el escapado de variables modificando la variable sf_escaping_strategy:

sfConfig::set('sf_escaping_strategy', false);
23/11/10

Layout específico para una acción

Symfony nos permite personalizar el layout para cualquier accion o grupo de acciones. Para ello, debemos crear la carpeta /config dentro del módulo que queremos personalizar y añadir el archivo view.yml, tal y como se muestra en el ejemplo.

//apps/frontend/modules/main/config/view.yml
contactoSuccess: { layout: layout2 }
confirmacionSuccess: { layout: layout3 }

Deberemos crear los archivos layout2.php y layout3.php en el mismo nivel que el layout principal para que symfony los pueda encontrar.

En éste ejemplo estamos personalizando el layout para las acciones contacto y confirmación. Facil no?

19/11/10

Personalizar página de error 404

Symfony nos permite personalizar las páginas de error 404 muy facilmente.

Editamos el archivo settings.yml:

all:
  .actions:
    error_404_module:    mimodulo
    error_404_action:    pagina404

Recordar que debereis crear la función en actions.class.php

public function executePagina404(){
}

No olvidaros de limpiar la caché en productivo.