Rodrigo Borrego Bernabé - Freelance Software Developer



Que reaparezca el menú superior en SonataAdmin

Category : breves, Programación, Symfony · No Comments · by May 3rd, 2013

En las últimas versiones del Bundle para Symfony 2 de administración “SonataAdmin” el comportamiento de seguridad ha cambiado.

Esto puede haber hecho que el menú superior, donde aparecen las diferentes entidades de administración en un desplegable quede oculto.

Para que se muestre debes darse al usuario el permiso ROLE_SONATA_ADMIN

Error en Symfony: You need to enable either the SQLite or PDO_SQLite extension for the profiler to run properly.

Category : breves, Programación, Symfony · No Comments · by Jun 18th, 2012
You need to enable either the SQLite or PDO_SQLite extension for the profiler to run properly.
Si tras instalar un proyecto nuevo en Symfony 2 lo lanzas en el navegador y aparece el error del cuadro anterior necesitarás instalar las extensiones que te piden. Para ello:
apt-get install php5-sqlite
 y reinicia Apache
sudo apache2ctl restart

SQLite3::exec(): database is locked error

Category : Programación, Symfony · No Comments · by Jan 31st, 2012

Si comenzando a utilizar Symfony2 trabajáis en una mezcla de Windows y Linux que unís mediante Samba, quizás os hayáis encontrado con el siguiente error nada más comenzar:

Warning: SQLite3::exec(): database is locked

Realmente no podemos arreglarlo, puesto que la gestión de permisos de Samba no le gusta a SQLite, pero podemos evitarlo (‘workaround’, que dirían) cambiando el directorio donde se crean ciertos ficheros. Abrimos el archivo ‘app/config/config.yml’ y escribimos la siguiente configuración:

parameters:
  kernel.cache_dir: '/tmp/sf-test'

Fuente: http://www.kitpages.fr/fr/cms/21/symfony2-sqlite3-et-samba

UPDATE: Parece que con la versión 2.0.12 esto ya no funciona y debes incluir en app/AppKernel.php

public function getCacheDir()
 {
 //return $this->rootDir . '/my_cache/' . $this->environment;
 return '/tmp/sf2'.$this->environment;
 }

Cambiar el orden de los listados de sfDoctrineRoute

Category : Programación, Symfony · No Comments · by Aug 17th, 2011

En el controlador (actions.class.php) tenemos un método para el listado de elementos:

  public function executeIndex(sfWebRequest $request)
  {
    $this->items= $this->getRoute()->getObjects();
  }

Si queremos modificar el comportamiento, por ejemplo el orden en el que se muestran esos listados debemos modificar el routing.yml

item:
  class: sfDoctrineRouteCollection
  options:
    [...]
    model_methods:
      list:            getListOrdered

Y en itemTable.class.php añadir el siguiente método (por ejemplo para ordenar por el año)

    public static function getListOrdered()
    {
        return ItemTable::getInstance()->createQuery('e')->orderBy('year DESC')->execute();
    }

Invocando url_for desde el modelo

Category : Programación, Symfony · No Comments · by Apr 5th, 2011

El modo ‘feo’ (AKA The Ugly Way), dado que rompe el paradigma MVC:

sfContext::getInstance()->getConfiguration()->loadHelpers(array('Url'));
$url = url_for('mi_url', true); // El segundo parámetro (absolute) depende del destino de la variable $url

El modo ‘elegante’:

$url = sfContext::getInstance()->getController()->genUrl('mi_url', true);

o en una acción:

$this->getController()->genUrl('string');

Escribir mensajes de log desde el modelo que funcionan en las tareas CLI de Symfony

Category : Programación, Symfony · No Comments · by Mar 5th, 2011

El problema de echo es que aparece por pantalla de la web y no queremos que eso ocurra en producción.
El problema del sfLogger es que se accede a través del contexto y no lo tenemos en las tareas de línea de comandos (task in CLI) de Symfony.

Entonces, ¿Cómo escribir un mensaje de log desde el modelo que funcione en ambas situaciones?


ProjectConfiguration::getActive()
->getEventDispatcher()
->notify(new sfEvent(NULL, 'application.log', array('message' => "Mi mensaje",
'priority' => sfLogger::INFO)));

Invocando el helper i18n (for translation) desde una acción

Category : breves, Programación, Symfony · No Comments · by Jan 11th, 2011

A menudo necesitas invocar el helper de tradicción, __(), desde fuera de la vista. Se puede hacer de dos maneras:

a) Cargarlo explícitamente y llamarlo igual que desde la vista (aunque se cargará dos veces, pues se seguirá cargando en la vista).

sfLoader::LoadHelpers(array('I18N'));

b) O utilizar una llamada puntual:

sfContext::getInstance()->getI18n()->__($text, $args, 'messages');

Traducción libre de: http://snippets.symfony-project.org/snippet/65

Filtrando en symfony con un selector los campos de texto

Category : Programación, Symfony · (5) Comments · by Dec 16th, 2010

A menudo se declara en el esquema un campo como string (texto) cuando en la práctica va a ser una clave de un conjunto de valores. ¿Por qué no lo ponemos en el esquema como ‘type: Enum’? Por ejemplo porque no sabemos, en principio, cuales son los valores que se van a guardar ahí.

En ese caso el filtro no pondrá un desplegable con los valores, lógicamente, sino un input[type=text].

Si posteriormente queremos que en el filtro aparezcan los valores en forma de desplegable hacemos algo como esto:

$choices = array_merge(array('' => ''), <array_con_valores>);
$this->widgetSchema['myField']   = new sfWidgetFormSelect(array('choices' => $choices, 'multiple' => false));

Pues bien, esto mostrará el filtro tal y como lo queremos, pero no funcionará. ¿Qué falta? Pues que le digamos al filtro que tiene que filtrar por un conjunto de claves:

public function getFields() {
 return array('myField' => 'Enum') + parent::getFields();
 }

Es importante el orden, porque al existir ya ‘myField’ en el esquema, si hacemos la unión de los arrays al revés el valor recibido en el padre pisará el nuestro.

Evitando los OutputEscaping en elementos que no son objetos

Category : Programación, Symfony · No Comments · by Nov 26th, 2010

Habitualmente los proyectos de symfony filtran la vista de manera que se evite la ejecución de código malicioso. Para ellos se sirve de los llamados Output Escaping Decorators. Sin embargo, en muchas ocasiones nos interesa (con cuidado) saltarnos este control.

Normalmente basta con hacer

$object->getAtributo(ESC_RAW) ó $object->getRawValue()->getAttributo()

Pero a veces no es un objeto lo que queremos utilizar. Pongamos que sea una cadena. En ese caso, la manera de actuar es la siguiente

$sf_data->getRaw('variable');

Si queremos ir más allá (mucho cuidado al hacer esto). Podemos desactivarlo para toda una acción desde el controlador:

public function executeMiAccion(sfWebRequest $request)
{
 sfConfig::set('sf_escaping_strategy', false);
 [...]
}

Eliminando plugins de Symfony

Category : Programación, Symfony · No Comments · by Nov 4th, 2010

Normalmente cuando quieres desinstalar un plugin de symfony basta con hacer:

$ symfony plugin:uninstall <nombre_plugin>

Pero a veces el resultado no es el deseado, obteniendo un error como este:

>> plugin    uninstalling plugin "nombre_plugin"
>> sfSymfonyPluginManager Plugin "nombre_plugin" is not installed

Intenta en ese caso

symfony plugin:uninstall symfony/nombre_plugin

P.D: Lo que no te evitas en ningún caso es la eliminación manual del enlace simbólico en ./web que se crea al instalar el plugin con el publish-assets