Vamos a repasar rápidamente cómo integrar la autenticación con Facebook en una aplicación Symfony (4.3.4 en el momento de escribir…
You need to enable either the SQLite or PDO_SQLite extension for the profiler to run properly.
apt-get install php5-sqlite
sudo apache2ctl restart
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; }
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(); }
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');
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)));
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
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.
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); [...] }
Comentarios recientes